1、问题描述
今天在做Button的移动事件时遇到的一个问题,就是同时设置button的onTouch和onClick事件时,当我滑动提起的时执行了onClick事件,这是我不想要的,
2、解决方法:在onTouch的down和up事件记录一下时间,判断这个两个时间差来判断是否执行onClick事件:
if ((endTime - startTime) > 0.2 * 1000L) {
isclick = true;
} else {
isclick = false;
}
3、直接是上代码
// 按钮的拖动事件
private class MyTouchListener implements View.OnTouchListener {
int lastX, lastY; //记录移动的最后的位置
long startTime = 0;
long endTime = 0;
boolean isclick;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
isclick = false;//当按下的时候设置isclick为false,具体原因看后边的讲解
startTime = System.currentTimeMillis();
break;
case MotionEvent.ACTION_MOVE:
//移动中动态设置位置
isclick = true;//当按钮被移动的时候设置isclick为true
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
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);
//将当前的位置再次设置
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
endTime = System.currentTimeMillis();
//当从点击到弹起小于半秒的时候,则判断为点击,如果超过则不响应点击事件
if ((endTime - startTime) > 0.2 * 1000L) {
isclick = true;
} else {
isclick = false;
}
break;
}
return isclick;
}
}