目前想到的最好的解决方法,大家有更好的欢迎告知。
问题:在一个view中有一个按钮,要求可以通过点按移动这个按钮,同时单纯的点击不移动这个按钮可以跳转到新的Activity。
遇到的困难:按钮的移动好实现,通过OnTouch的MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE以及MotionEvent_UP可以实现,但是如果同时实现OnTouch和OnClick方法,会导致冲突。关于这方面的理论网上回答的很好,下面我写出我的解决方法。
按钮移动示例代码如下(转自网友):
public boolean onTouch(View v, MotionEvent event) { int action=event.getAction(); Log.i("@@@@@@", "Touch:"+action); switch(action){ case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; /** * layout(l,t,r,b) * l Left position, relative to parent t Top position, relative to parent r Right position, relative to parent b Bottom position, relative to parent * */ case MotionEvent.ACTION_MOVE: int dx = (int)event.getRawX() - lastX; int dy = (int)event.getRawY() - lastY; move(v, dx, dy); break; case MotionEvent.ACTION_UP: break; } return false; } private void move(View v, int dx, int dy){ int left = v.getLeft() + dx; int top = v.getTop() + dy; int right = v.getRight() + dx; int bottom = v.getBottom() + dy; if(left < 0){ left = 0; right = left + v.getWidth(); } if(right > screenWidth){ right = screenWidth; left = right - v.getWidth(); } if(top < 0){ top = 0; bottom = top + v.getHeight(); } if(bottom > screenHeight){ bottom = screenHeight; top = bottom - v.getHeight(); } v.layout(left, top, right, bottom); Log.i("@@@@@@", "position??" + left + ", " + top + ", " + right + ", " + bottom); }
解决问题的核心方法是:
不要为这个按钮提供OnClick的方法,也就是不添加OnClickListener,OnClick的方法调用在OnTouch方法中实现。
具体描述:
添加一个boolean的全局变量初始化为false(表示按钮不移动),一旦触发了OnTouch中的MotionEvent.ACTION_MOVE,那么就表示按钮发生了移动,不触发点击动作,待触发了MotionEvent.ACTION_UP,就不发生动作并且把这个全局变量变为初始化的false;反之,如果没有移动,那么就触发点击动作。
时间: 2024-10-31 05:52:16