Android(安卓)事件分发机制探析
16lz
2023-05-28
一基础知识
android的事件处理分为3步。
1)public booleandispatchTouchEvent(MotionEvent ev)这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEventev) 这个方法用来处理TouchEvent
二事件探析
场景:本想实现ttdt那种滑动页面结束activity的效果,摸索了好久终于实现,流畅效果很满意,但是activity布局上添加其他控件,比如giriView\listView等,会出现等层自己写的那个View获取不到焦点,导致滑动事件失效。
分析:当在顶层View上加其他View,默认情况都是顶层的事件要传给最上面的view处理,导致为处理情况下,我做的效果失效了;
下图为一个正常的View点击效果图:
1、ViewGroup3的dispatchTouchEvent()方法会被调用。
2、ViewGroup3调用ViewGroup2的dispatchTouchEvent()方法。
3、ViewGroup2调用ViewGroup1的dispatchTouchEvent()方法。
4、ViewGroup1会调用View1的dispatchTouchEvent()方法。
5、View1的dispatchTouchEvent()方法调用自己的onTouchEvent()方法。在onTouchEvent方法中处理点击事件。处理完了后会返回一个true给调用它的dispatchTouchEvent()方法。
6、ViewGroup1的dispatchTouchEvent()方法会返回一个true值给ViewGroup2的dispatchTouchEvent()方法。这样一直将则个true值返回到ViewGroup3的dispatchTouchEvent()方法。ViewGroup3在将这个值返回给调用它的方法。这样一个事件分发过程结束。
三问题解决
想到这里,基本上我们就可以利用View的分发拦截机制,将我们需要的Event拦截,不需要的转发。
在自己写的view重写onInterceptTouchEvent()在里面做下操作:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub switch (ev.getAction()) { case MotionEvent.ACTION_MOVE: mLastDownX = (int) ev.getX(); System.err.println("ACTION_DOWN=" + mLastDownX); return true; } return super.onInterceptTouchEvent(ev); }
四验证效果
运行程序,看效果,完美实现,流畅滑动,可以达到ttdt效果!
更多相关文章
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用
- python list.sort()根据多个关键字排序的方法实现
- android上一些方法的区别和用法的注意事项
- android实现字体闪烁动画的方法
- Android(安卓)Wifi模块分析(三)
- Android中dispatchDraw分析
- Android四大基本组件介绍与生命周期
- Android(安卓)MediaPlayer 常用方法介绍