Android touchEvent事件传递
2015-07-22 17:30
531 查看
网上介绍touchevent事件非常多,这里通过一个简单的Demo来描述事件的传递和拦截过程。
先介绍touch event相关的知识点。
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE…->ACTION_MOVE->ACTION_UP
android系统中的每个View以及它的子类都具有下面两个和TouchEvent处理密切相关的方法:
public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
而每个ViewGroup以及它的子类都具有下面三个和TouchEvent处理密切相关的方法:
public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
当TouchEvent发生时, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,首先交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。
注意:View及其子类不存在onInterceptTouchEvent方法。
源码分析请参考:
Android触摸屏事件派发机制详解与源码分析一(View篇)
Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)
接下来通过code来看看具体的传递过程。
在布局文件中定义个container
自定义一些ViewGroup和View,重写一些和事件相关的方法。
在Activity的onCreate方法中给container添加相应的ViewGroup和View。
在TouchView上滑动一下,查看一些log输出。
上面的code不做任何修改。输出下面的log
我们发现,只输出了ACTION_DOWN事件。因为TouchViewGroup、TouchViewGroup2和TouchView的相应方法都返回的是false,导致没有相应view消费此次事件,所以这个事件“消失”了。
将TouchView的onTouchEvent返回值改为true。
输出log:
将TouchViewGroup2的onInterceptTouchEvent和onTouchEvent返回值改为true。
输出log:
我们发现TouchViewGroup2的onInterceptTouchEvent只在第一次ACTION_DOWN时调用了,之后都没有调用。
修改TouchView的onTouchEvent和TouchViewGroup2的onTouchEvent onInterceptTouchEvent方法。
输出log:
从log中可以看出,前两次的事件都是交付给TouchView的onTouchEvent处理。第三次由于TouchViewGroup2的onInterceptTouchEvent返回值为true,所以就向TouchView发送了ACTION_CANCEL事件。之后的事件都是传给了TouchViewGroup2的onTouchEvent处理。
暂时就先分析到这里。
先介绍touch event相关的知识点。
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE…->ACTION_MOVE->ACTION_UP
android系统中的每个View以及它的子类都具有下面两个和TouchEvent处理密切相关的方法:
public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
而每个ViewGroup以及它的子类都具有下面三个和TouchEvent处理密切相关的方法:
public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
当TouchEvent发生时, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,首先交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。
注意:View及其子类不存在onInterceptTouchEvent方法。
源码分析请参考:
Android触摸屏事件派发机制详解与源码分析一(View篇)
Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)
接下来通过code来看看具体的传递过程。
在布局文件中定义个container
[code]<FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" />
自定义一些ViewGroup和View,重写一些和事件相关的方法。
[code]public class TouchViewGroup2 extends LinearLayout{ public static final String TAG = "TouchEvent"; public TouchViewGroup2(Context context) { super(context); ViewGroup.LayoutParams vl = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); setLayoutParams(vl); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_CANCEL"); break; } return super.onTouchEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_CANCEL"); break; } return super.onInterceptTouchEvent(ev); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup2 dispatchTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup2 dispatchTouchEvent action:ACTION_CANCEL"); break; } return super.dispatchTouchEvent(ev); } }
[code]public class TouchViewGroup extends LinearLayout { public static final String TAG = "TouchEvent"; public TouchViewGroup(Context context) { super(context); ViewGroup.LayoutParams vl = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); setLayoutParams(vl); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup onTouchEvent action:ACTION_CANCEL"); break; } return super.onTouchEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup onInterceptTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup onInterceptTouchEvent action:ACTION_CANCEL"); break; } return super.onInterceptTouchEvent(ev); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup dispatchTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup dispatchTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup dispatchTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup dispatchTouchEvent action:ACTION_CANCEL"); break; } return super.dispatchTouchEvent(ev); } }
[code]public class TouchView extends View { public static final String TAG = "TouchEvent"; public TouchView(Context context) { super(context); ViewGroup.LayoutParams vl = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); setLayoutParams(vl); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchView onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchView onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchView onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchView onTouchEvent action:ACTION_CANCEL"); break; } return super.onTouchEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchView dispatchTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchView dispatchTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchView dispatchTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchView dispatchTouchEvent action:ACTION_CANCEL"); break; } return super.dispatchTouchEvent(event); } }
在Activity的onCreate方法中给container添加相应的ViewGroup和View。
[code]ViewGroup vg = (ViewGroup)findViewById(R.id.container); ViewGroup vg1 = new TouchViewGroup(this); ViewGroup vg2 = new TouchViewGroup2(this); View v1 = new TouchView(this); vg.addView(vg1); vg1.addView(vg2); vg2.addView(v1);
在TouchView上滑动一下,查看一些log输出。
上面的code不做任何修改。输出下面的log
[code]D/TouchEvent(19634): TouchViewGroup dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(19634): TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN D/TouchEvent(19634): TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(19634): TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN D/TouchEvent(19634): TouchView dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(19634): TouchView onTouchEvent action:ACTION_DOWN D/TouchEvent(19634): TouchViewGroup2 onTouchEvent action:ACTION_DOWN D/TouchEvent(19634): TouchViewGroup onTouchEvent action:ACTION_DOWN
我们发现,只输出了ACTION_DOWN事件。因为TouchViewGroup、TouchViewGroup2和TouchView的相应方法都返回的是false,导致没有相应view消费此次事件,所以这个事件“消失”了。
将TouchView的onTouchEvent返回值改为true。
[code]@Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchView onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchView onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchView onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchView onTouchEvent action:ACTION_CANCEL"); break; } //return super.onTouchEvent(event); return true; }
输出log:
[code]D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_DOWN D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_MOVE D/TouchEvent(21567): TouchViewGroup dispatchTouchEvent action:ACTION_UP D/TouchEvent(21567): TouchViewGroup onInterceptTouchEvent action:ACTION_UP D/TouchEvent(21567): TouchViewGroup2 dispatchTouchEvent action:ACTION_UP D/TouchEvent(21567): TouchViewGroup2 onInterceptTouchEvent action:ACTION_UP D/TouchEvent(21567): TouchView dispatchTouchEvent action:ACTION_UP D/TouchEvent(21567): TouchView onTouchEvent action:ACTION_UP
将TouchViewGroup2的onInterceptTouchEvent和onTouchEvent返回值改为true。
[code] @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_CANCEL"); break; } //return super.onTouchEvent(event); return true; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_CANCEL"); break; } //return super.onInterceptTouchEvent(ev); return true; }
输出log:
[code]D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(21964): TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_DOWN D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_MOVE D/TouchEvent(21964): TouchViewGroup dispatchTouchEvent action:ACTION_UP D/TouchEvent(21964): TouchViewGroup onInterceptTouchEvent action:ACTION_UP D/TouchEvent(21964): TouchViewGroup2 dispatchTouchEvent action:ACTION_UP D/TouchEvent(21964): TouchViewGroup2 onTouchEvent action:ACTION_UP
我们发现TouchViewGroup2的onInterceptTouchEvent只在第一次ACTION_DOWN时调用了,之后都没有调用。
修改TouchView的onTouchEvent和TouchViewGroup2的onTouchEvent onInterceptTouchEvent方法。
[code]@Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchView onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchView onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchView onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchView onTouchEvent action:ACTION_CANCEL"); break; } //return super.onTouchEvent(event); return true; }
[code] @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup2 onTouchEvent action:ACTION_CANCEL"); break; } //return super.onTouchEvent(event); return true; } private int count = 0; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "TouchViewGroup2 onInterceptTouchEvent action:ACTION_CANCEL"); break; } count++; if (count == 3) { return true; } return super.onInterceptTouchEvent(ev); }
输出log:
[code]D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_DOWN D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(22817): TouchViewGroup2 onInterceptTouchEvent action:ACTION_DOWN D/TouchEvent(22817): TouchView dispatchTouchEvent action:ACTION_DOWN D/TouchEvent(22817): TouchView onTouchEvent action:ACTION_DOWN D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchView dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchView onTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup2 onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchView dispatchTouchEvent action:ACTION_CANCEL D/TouchEvent(22817): TouchView onTouchEvent action:ACTION_CANCEL D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup2 onTouchEvent action:ACTION_MOVE D/TouchEvent(22817): TouchViewGroup dispatchTouchEvent action:ACTION_UP D/TouchEvent(22817): TouchViewGroup onInterceptTouchEvent action:ACTION_UP D/TouchEvent(22817): TouchViewGroup2 dispatchTouchEvent action:ACTION_UP D/TouchEvent(22817): TouchViewGroup2 onTouchEvent action:ACTION_UP
从log中可以看出,前两次的事件都是交付给TouchView的onTouchEvent处理。第三次由于TouchViewGroup2的onInterceptTouchEvent返回值为true,所以就向TouchView发送了ACTION_CANCEL事件。之后的事件都是传给了TouchViewGroup2的onTouchEvent处理。
暂时就先分析到这里。
相关文章推荐
- android BaseAdapter getView 理解
- Android之仿心跳动画实现
- 自定义Android Studio方法注释模板
- Android Studio Intent使用(显式、隐式) 第一行代码
- android Expandlistview实例实现
- Android平台使用SQLite数据库存储数据
- Android的NDK开发(3)——JNI数据类型的详解
- Android的NDK开发(3)——JNI数据类型的详解
- android几个漏洞
- Android 四大组件学习之Service五
- android 使用Theme + attr换肤
- android闹钟(五):实现闹钟功能
- Android——coredump解析
- 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(二)Android客户端功能展示
- Android的NDK开发(2)——利用Android NDK编写一个简单的HelloWorld
- Android的NDK开发(2)——利用Android NDK编写一个简单的HelloWorld
- android闹钟(四):实现计时器
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- 在AndroidStudio中创建java应用