0%

Android_View的绘制

Android View的绘制流程

View相关
1.View树的绘制流程
考点:

绘制的大致流程
requestLayout和invalidate区别
measure核心的两个类
layout的核心方法
绘制的5大步骤
参考答案:

绘制大致流程:
activity接收到焦点,就开始请求绘制布局,入口是ViewRoot的performTraversal()函数,判断是否需要重新measure、layout、draw(测量、摆放、绘制)
requestLayout和invalidate区别:
invalidate()请求重绘View树,即draw过程,假如视图发生大小没有变化就不会调用layout()过程,并且只绘制那些调用了invalidate()方法的 View。
requestLayout()当布局变化的时候,比如方向变化,尺寸的变化,会调用该方法,在自定义的视图中,如果某些情况下希望重新测量尺寸大小,应该手动去调用该方法,它会触发measure()和layout()过程,但不会进行draw
measure核心的两个类:LayoutParams(View自身的布局参数)、MeasureSpecs(父视图对子视图对测量要求)
LayoutParams注意可能的强制类型转换错误
MeasureSpecs有UNSPECIFIED、EXACTLY、AT_MOST(不约束、精确约束、限定最大尺寸)三种模式
子视图的具体位置都是相对于父视图而言的,View的onLayout方法为空实现。
draw的五大步骤:背景(background.draw(canvas))、自身(onDraw)、子视图(dispatchDraw)、装饰(onDrawScrollBars)
2.View的事件分发机制
点击事件产生后,首先传递给 Activity 的 dispatchTouchEvent 方法,通过 PhoneWindow 传递给 DecorView,然后再传递给根 ViewGroup,进入 ViewGroup 的 dispatchTouchEvent 方法,执行 onInterceptTouchEvent 方法判断是否拦截,再不 拦截的情况下,此时会遍历 ViewGroup 的子元素,进入子 View 的 dispatchToucnEvent 方法,如果子 view 设置了 onTouchListener,就执行 onTouch 方法,并根据 onTouch 的返回值为 true 还是 false 来决定是否执行 onTouchEvent 方法,如果是 false 则继续执行 onTouchEvent,在 onTouchEvent 的 Action Up 事件中判断,如果设置了 onClickListener,就执行 onClick 方法。


Link:

  1. https://www.jianshu.com/p/f34e5e21fa0d