需求:

如标题。

难点:

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     }

 

posted on 2023-04-06 16:01  我就像奶油  阅读(60)  评论(0编辑  收藏  举报