一. 描述事件传递分发机制
Activity-->window-->顶级View(DecorView)-->ViewGroup-->View
dispatchTouchEvent
onInterceptTouchEvent 1.返回true拦截调用自己的false调用子类 2.View没有拦截方法
onTouchEvent 不消费则调用父类的onTouchEvent
requstDisallowInterceptTouchEvent子View干预父View
二. 事件分发中的onTouch和onTouchEvent有什么区别,该如何使用
onTouch方法优先级比onTouchEvent高,会先触发。假如onTouch方法返回false,会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。
三. View和ViewGroup分别有哪些事件分发相关的回调方法
ViewGroup
OndispathTouchEvent
OnInterceptTouchEvent
OnTouchEvent
View
OndispathTouchEvent
OnTouchEvent
View没有onInterceptTouchEvent
四. View刷新机制
在Android的View刷新机制中,父View负责刷新(invalidateChild)、布局(layoutChild)显示子View。而当子View需要刷新时,则是通知父View刷新子view来完成
invalidate()和postInvalidate() 的区别及使用
当Invalidate()被调用的时候,View的OnDraw()就会被调用;Invalidate()是刷新UI,UI更新必须在主线程,所以invalidate必须在UI线程中被调用,如果在子线程中更新视图的就调用postInvalidate()
postInvalidate()实际调用的方法,mHandler.sendMessageDelayed,在子线程中用handler发送消息,所以才能在子线程中使用
五. View绘制流程
Measure => setMeasuredDimension => onMeasure
onLayout
onDraw
六. 自定义View如何提供获取View属性的接口
- 在res/values目录下新建一个attrs.xml文件
<declare-styleable name="CustomView">
<attr name="color" format="color"/>
<attr name="font" format="dimension"/>
</declare-styleable>
- 使用自定义View 设置自定义属性
- 构造函数中可以获取自定义属性