在android中的Touch分发中,经常可以看到从ACTION_DOWN->ACTION_MOVE->ACTION_UP,当我们不了解它是如何分发的话总感觉一头雾水,所以有必要了解它的整体分发过程,所以很有必要好好的记录下。

事件分发函数

public void dispatchTouchEvent(MotionEvent ev).

public void onInterceptTouchEvent(MotionEvent ev).

public void onTouchEvent(MotionEvent ev).

整体的Touch分发我们需要从这三个分发函数中来了解其分发顺序,其中的onInterceptTouchEvent函数只有ViewGroup中才特有的函数。我们根据每个分发的函数中return的结果来判断是否需要继续往上分发改Touch事件。

在我们需要测试Touch分发的地方写入log来进行研究其结果.

首先我们定义两个ViewGroup分别extends LinearLayout并分别在dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent写入log,如下<由于都是简单的log写入所以只举例说明>:

public boolean dispatchTouchEvent(MotionEvent ev) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN:Log.i(TAG, "--- dispatchTouchEvent -> action_down");break;case MotionEvent.ACTION_MOVE:Log.i(TAG, "--- dispatchTouchEvent -> action_move");break;case MotionEvent.ACTION_UP:Log.i(TAG, "--- dispatchTouchEvent -> action_up");break;case MotionEvent.ACTION_CANCEL:Log.i(TAG, "--- dispatchTouchEvent -> action_cancle");break;}return super.dispatchTouchEvent(ev);}
然后我们继续自定个TouchButton extends Button也如上重写了dispathTouchEvent 和 onTouchEvent方法,然后再Activity中也写上这两个方法,我们主要通过log来分析分发手势,大致的界面布局为:


1.在Activity ParentLayout TouchButton中都按默认的分发的情况下:


可以看到在默认情况是按Activity-ParentLayout-ChildLayout-TouchButton来进行分发,且在TouchButton中return true,所以我们可以看出手势分发是从activity往上分发手势,在默认情况下成功的在TouchButton中消耗掉,在dispathTouchEvent中down move up中任何一个地方返回true 那么该手势就不会往下分发直接在本控件内消耗了。

2.当在ParentLayout中的onInterceptTouchEvent中的ACTON_DOWN中返回true的时候:


如果在onInterceptTouchEvent中被拦截了 导致事件无法继续传递下去 且 无法接收到继续的move 和 up事件,所以最终的时间仍然回到了activity消耗了。

3.当我们在onInterceptTouchEvent中的ACTION_MOVE中返回true的话:


会分发cancle事件下去给child和button 然后把事件传递给ontouchevent 且 child和button无法接收到move和up事件,这种情况下我们最经常需要到,很多情况下都是拦截该分发手势来进行移动从而达到自定义ViewGroup的滑动效果。

最后说两句:

我们根据dispathTouchEvent来分发手势,如果在该方法中就return true的情况下 那么接下来的手势只能在本View或者Activity消耗了,反之最后的手势会在TouchButton中消耗掉。

在onInterceptTouchEvent的move中返回true的话那么上层的View只能接收到ACTION_CANCLE事件而不会受到任何别的事件,最终在本ViewGroup中消耗了。


更多相关文章

  1. Android(安卓)Input输入系统之一:KeyEvent事件监听
  2. Android(安卓)中文API (94) —— MediaController
  3. Android实现手势滑动(左滑和右滑)
  4. Android中添加和识别手势操作
  5. Android防止过快点击造成多次事件执行(防止按钮重复点击)
  6. android事件分发机制
  7. Android事件总线 浅谈 EventBus
  8. Android第四十二期 - 关于微信手势退出Activity的操作
  9. Android(安卓)编程下 Touch 事件的分发和消费机制

随机推荐

  1. 分享45个android实例源码,很好很强大
  2. android intent filter浏览器应用的设置,
  3. 有关Android 平台解析XML
  4. 第五篇 ImageSwitcher篇
  5. kotlin入门系列二---基本语法
  6. 手动修改android模拟器system.img
  7. android EventBus 3.0 官方的混淆配置
  8. RTL8723BU wifi 及 热点移植和测试
  9. 安卓-开发常见问题之android:onClick未定
  10. android级联下拉菜单