需求:
如标题。
难点:
1.拖拽事件中抬起手指时,可能会触发点击事件,需要分离开
2.快速拖拽时可能会同时被判定为滑动手势,出发滑动事件,需要分离开
解决思路:
根据拖拽的距离来判断是否应该被判定为拖拽事件,是则在onTouchListener()返回true,否则返回false。
部分代码:
1 public class XxxOnTouchListener implements View.OnTouchListener { 2 // 是否被拖拽 3 private boolean isMoved; 4 // 按下时的位置参数,用于拖拽 5 private int y; 6 // 按下时的位置参数,用于点击、滑动手势 7 private int startY; 8 9 @Override 10 public boolean onTouch(View view, MotionEvent event) { 11 switch (event.getAction()) { 12 case MotionEvent.ACTION_DOWN: 13 y = startY = (int) event.getRawY(); 14 isMoved = false; 15 break; 16 case MotionEvent.ACTION_MOVE: 17 int nowY = (int) event.getRawY(); 18 int movedY = nowY - y; 19 y = nowY; 20 layoutParams.y = layoutParams.y + movedY; 21 // 更新悬浮窗控件布局 22 windowManager.updateViewLayout(view, layoutParams); 23 break; 24 case MotionEvent.ACTION_UP: 25 int stopY = (int) event.getRawY(); 26 // 移动大于一定距离,则判定为拖拽事件,返回true防止抬起时触发点击事件 27 if Math.abs(startY - stopY) >= FAULT_TOLERANCE) { 28 isMoved =true; 29 } 30 break; 31 default: 32 break; 33 } 34 35 // 防止快速拖动时被判定为滑动手势 36 if (Math.abs(startY - event.getRawY()) < FAULT_TOLERANCE) { 37 gestureDetector.onTouchEvent(event); 38 } 39 // 若返回true防止抬起时触发点击事件, 40 return isMoved; 41 } 42 }