问:Android的事件分发机制流程是怎么样的?
这道题描述起来还真有点费劲,先思考下,答案在美女下面
美女镇楼
答案:
这个问题可以写个长篇大论,但在面试时被问到时要从以下几个方面入手。
记住这个原则:Android的事件总是从父控件往子控件分发。子控件都不处理时事件再回传父控件。很多问题可以根据这个原则推导出来。
三个方法:
- dispatchTouchEvent:负责接收事件,返回false则表示向子控件分发事件。
- onInterceptTouchEvent:返回true表示拦截,同时调用onTouchEvent方法。
- onTouchEvent:处理事件,一般重写此方法,返回true表示消耗掉该事件并不再传递下去,返回false表示不处理事件并把事件退回父控件。
View和ViewGroup
所有的控件都继承自View。
所有的布局都继承自ViewGroup,ViewGroup则继承自View。
View没有onInterceptToutchEvent方法,所以dispatchTouchEvent直接调用onTouchEvent。
流程(Activity > ViewGroup > View)
- Activity是事件的起点,事件分被封装成MotionEvent对象发给Activity的dispatchTouchEvent方法。
- dispatchTouchEvent内部会把事件传给setContentView指定的布局,即根布局ViewGroup。
- 根布局的dispatchTouchEvent在接收到事件后调用onInterceptTouchEvent方法。
- onInterceptTouchEvent方法会判断是否拦截该事件,如果拦截就将事件传给onTouchEvent方法处理。不拦截就直接把事件传给子控件。
- onTouchEvent方法负责处理事件,返回值决定是否要消费掉该事件,返回true表示以后由此控件来处理该事件,返回false表示以后也不再接收该事件。
- 当所有控件的onTouchEvent都返回false时事件由Activity的onTouchEvent来处理。
优先级
OnTouchListener,onTouchEvent,onClickListener执行顺序
onTouch(ACTION_DOWN) => onTouchEvent(ACTION_DOWN) => onTouch(ACTION_UP) => onTouchEvent(ACTION_UP) => onClick
点击链接加入QQ群聊:https://jq.qq.com/?_wv=1027&k=5z4fzdT
或关注微信公众号:口袋里的安卓
网友评论