android事件分发原理及源码简读
2021/8/2 17:08:50
本文主要是介绍android事件分发原理及源码简读,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
当我们点击一个button的时候,会触发这么一系列的事件
- 正常情况下
// 分发 Activity.dispatchTouchEvent -> ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> View.dispatchTouchEvent -> // 消费 View.onTouch(setOnTouchListener) -> View.onTouchEvent -> View.onLongClick ->(由onTouchEvent 中触发,ACTION_DOWN超过一定时间就触发) View.onClick(由onTouchEvent 中触发,ACTION_UP)
- ViewGroup的dispatchTouchEvent,return true时,就不再往下分发,也不会触发消费事件
Activity.dispatchTouchEvent -> ViewGroup.dispatchTouchEvent
- ViewGroup的dispatchTouchEvent,return false时,就不再往下分发,同时触发上一层viewGroup的消费事件
Activity.dispatchTouchEvent -> ViewGroup.dispatchTouchEvent -> Activity.onTouchEvent(多层嵌套的viewgroup时,会ViewGroup.onTouchEvent)
关于onTouchEvent
- onTouchEvent的传递顺序是view -> ViewGroup -> Activtiy传递,返回false则表示不消费,继续传递,返回true则消费事件,不再传递
- 默认super.onTouchEvent时,viewGroup返回false,Activtiy返回true,view返回true且可以触发onClickListener及onLongClick;
- 不论将super.onTouchEvent改为返回true还是false,都会导致onClickListener及onLongClick失效;
- view.setTouchListener其实和view.onTouchEvent一样的,都是从dispatchTouchEvent中被调用到,但是setTouchListener返回true时,事件将被消费,不再触发onTouchEvent
view.dispatchTouchEvent源码
public boolean dispatchTouchEvent(MotionEvent event) { ... boolean result = false; ... //noinspection SimplifiableIfStatement ListenerInfo li = mListenerInfo; if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { result = true; } if (!result && onTouchEvent(event)) { result = true; } } ... return result; }
通过源码可以验证mOnTouchListener.onTouch(this, event)返回true时,事件将被消费,不再触发onTouchEvent
view.onTouchEvent源码
public boolean onTouchEvent(MotionEvent event) { ... if (mTouchDelegate != null) { if (mTouchDelegate.onTouchEvent(event)) { return true; } } ... if (clickable || (viewFlags & TOOLTIP) == TOOLTIP) { switch (action) { case MotionEvent.ACTION_UP: ... if (mPerformClick == null) { // 触发 onClickListener mPerformClick = new PerformClick(); } if (!post(mPerformClick)) { performClickInternal(); } ... break; case MotionEvent.ACTION_DOWN: ... if (!clickable) { // 检查是否长按事件,是的话将触发onLongClick事件 checkForLongClick( ViewConfiguration.getLongPressTimeout(), x, y, TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__LONG_PRESS); break; } ... break; ... return false; }
这篇关于android事件分发原理及源码简读的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-18android.permission.read_media_video
- 2024-01-18android_getaddrinfo failed eai_nodata
- 2024-01-18androidmo
- 2024-01-15Android下三种离屏渲染技术
- 2024-01-09Android 蓝牙使用
- 2024-01-06Android对接华为AI - 文本识别
- 2023-11-15代码安全之代码混淆及加固(Android)
- 2023-11-10简述Android语音播报TTS
- 2023-11-06Android WiFi工具类
- 2023-07-22Android开发未来的出路