1. View 的绘制
- View 的绘制流程是从 ViewRootImpl 的 performTraversals() 方法开始的,它经过测量(measure)、放置(layout)和绘制(draw)三个过程才能把一个 View 绘制出来,measure() 方法用于测量 View 的宽高,layout() 用于确定 View 在父容器中的放置位置,draw() 负责做具体的绘制操作。

2. Android事件分发机制
- 事件分发流程
1.1 Activity——>PhoneWindow——>DecorView——>ViewGroup——>自己的view ——>View
1.2 ViewGroup的事件传递方法:
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
1.3 View的事件传递方法:
View的dispatchTouchEvent
View的onTouchEvent
当点击事件产生时,Activity会调用dispatchTouchEvent()
方法; 从Activity如果传到最下层的View都没有组件处理该事件,该事件会依次回传到Activity
- 事件分发流程
- 事件分发的本质
2.1 将点击事件(MotionEvent)传递到某个具体的View & 处理的整个过程
2.2 事件传递的过程 = 分发过程。
- 事件分发的本质
- 事件在哪些对象之间进行传递?
3.1Activity
、ViewGroup
、View
。Android的UI界面由Activity、ViewGroup、View 及其派生类组成
UI界面
- 事件在哪些对象之间进行传递?
- 事件分发的顺序 ?
4.1 事件传递的顺序:Activity -> ViewGroup -> View
4.2 1个点击事件发生后,事件先传到Activity、再传到ViewGroup、最终再传到 View
- 事件分发的顺序 ?
- 如果事件一直没有被消费,最后会传给Activity,如果Activity也不需要就被抛弃。
- 判断事件是否被消费是根据返回值,而不是根据你是否使用了事件。
-
-
onTouchListener
,onTouchEvent
和onClick
的优先级别
onTouchListener—–>onTouchEvent—>onclick
-
-
- View的事件分发机制实际上就是一个经典的责任链模式,
责任链模式:当有多个对象均可以处理同一请求的时候,将这些对象串联成一条链,并沿着这条链传递修改请求,直到有对象处理它为止。
- onClick()方法是在onTouchEvent()方法中的action==ACTION_UP的时候才执行的;
onTouch()、onTouchEvent()、onClick()三个方法的执行优先级依次递减
- onClick()方法是在onTouchEvent()方法中的action==ACTION_UP的时候才执行的;
- view事件执行顺序dispatchTouchEvent-> setOnTouchListener的onTouch->onTouchEvent,如果setOnTouchListener返回ture,后续事件onTouchEvent不在执行
- onClick是在onTouchEvent(event)方法中的,所以onTouch优先于onClick执行
- Android 点击事件执行顺序是Activity—>ViewGroup—>View
- 如果子View将传递的事件消费掉,ViewGroup中将无法接收到任何事件
- 在
ViewGroup
中onInterceptTouchEvent
方法对事件传递进行拦截,onInterceptTouchEvent
方法返回true
代表不允许事件继续向子View
传递,把事件交给自己处理,则会执行自己对应的onTouchEvent
方法。返回false
代表不对事件进行拦截,事件继续向下传递,默认返回false
- 在
2.1 Android 事件冲突应用场景
- 外部拦截法和内部拦截法
1.1 外部拦截法: 就是在ViewGroup
里使用onInterceptTouchEvent()
拦截
1.2 内部拦截法: 在子View
的dispatchTouchEvent()
里调用 ,这行代码被调用,父类就不会拦截事件
当传入的参数为true
时,表示子组件要自己消费这次事件,告诉父组件不要拦截(抢走)这次的事件。
getParent().requestDisallowInterceptTouchEvent(true)
- 外部拦截法和内部拦截法
网友评论