Android面试——个人理解

1.Android事件分发机制

Activity:

事件最开始传递给当前ActivitydispatchTouchEvent()方法,在此方法中会调用windowsuperDispatchTouchEvent(),如果superDispatchTouchEvent()返回true。则表示事件被消费,否则表示事件暂未被消费,就调用当前ActivityonTouchEvent(),并将其的返回值作为Activity#dispatchTouchEvent()的返回值。

window是一个抽象类,唯一实现是PhoneWindow,在Activity#dispatchTouchEvent中调用的就是PhoneWindow#superDispatchTouchEvent()方法。PhoneWindow#superDispatchTouchEvent()中调用了DecorView#superDispatchTouchEvent(),使DecorView调用父级的dispatchTouchEvent()

DecorViewActivity根View,继承了FrameLayout,所以DecorView父级的dispatchTouchEvent方法就是ViewGroup#dispatchTouchEvent,这样就完成了事件从ActivityViewGroup的分发。

ViewGroup:

事件被传递到ViewGroup#dispatchTouchEvent(),此方法首先判断这次事件是不是DOWN操作,如果是则清空之前所有的状态,表示这次是一个新的事件。然后再判断次此事件是否为DOWN操作或者mFirstTouchTarget!=null,来判断是否需要拦截次此事件。mFirstTouchTarget表示处理事件的子类,如果为空则表示没有子类处理此次事件。如果需要拦截,则调用ViewGroup#OnInterceptTouchEvent(),默认返回false,表示不拦截。

然后倒序遍历子View,从最上层开始遍历,判断子元素是否能接收点击事件事件。每次遍历都判断点击事件是否在子View的范围之内或者子View是否没有播放动画,如果判断成功则就调用子View#dispatchTouchEvent(),如果都不符合则判断下一个。如果有符合条件的,则执行ViewGroup#dispatchTransformedTouchEvent(),此方法判断传入的View是否为null,如果为null则调用super.dispatchTouchEvent(),也就是View#dispatchTouchEvent(),否则调用子view#dispatchTouchEvent()。事件完成了ViewGroupView的传递。

View:

View#dispatchTouchEvent()方法会判断此View是否设置了TouchListeener监听,如果有则调用onTouch(),如果返回true,则表示事件被onTouch()消费,结束次此事件分发。如果返回false,则调用View#onTouchEvent()View#onTouchEvent()判断此View是否可以点击或者长按,可以通过setClickablesetLongClickablesetOnClickListenersetOnLongClickListener,这些操作可以把这个View设置成可点击或可长按。如果可以点击或长按则判断是次此操作是否为UP(抬起操作),如果是的则调用performClick(),在performClick()回调点击或者长按监听方法,并且返回true,表示次此事件被消费了。

2.Android View绘制流程

你可能感兴趣的:(Android面试——个人理解)