自定义View onMeasure、onLayout、onDraw方法流程
2021-03-08 18:24:37 0 举报
View绘制流程图详解
作者其他创作
大纲/内容
performTraversals方法
Measure方法为final类型不可以被复写但 measure 调用链最终会回调 View/ViewGroup 对象的 onMeasure()方法,因此自定义视图时, 只需要复写 onMeasure() 方法即可
再次调用onDraw方法,不进行测量绘制
phoneWindow
<User input>
树的遍历是有序的,由父视图到子视图,每一个 ViewGroup 负责测绘它所有的 子视图,而最底层的 View 会负责测绘自身。
layout
View.draw(Canvas)如需调用该方法,需要先调用super.draw(canvas)完成系统的绘制,然 后再进行自定义的绘制。绘制流程:1.绘制背景2.绘制view自身内容3.绘制View的子视图4.绘制fade edges和layer5.绘制ScrollBar如果不需要绘制layer时将跳过第二条和第五条
invalidate
重新调用测量和摆放位置不进行绘制
ViewGroup
处理chaildView的动画,绑定、启动view动画最后drawChild调用了view.Draw发起子视图绘制
view
ViewRoot.java类
onAttachedToWindow
View 的 onLayout 方法为空实现,而 ViewGroup 的 onLayout 为 abstract 的,因此, 如果自定义的 View 要继承 ViewGroup 时,必须实现 onLayout 函数。
onMeasure
dispatchDraw() 发起对子视图的绘制。View 中默认是空实现,ViewGroup 复写 了 dispatchDraw()来对其子视图进行绘制。该方法我们不用去管,自定义的 ViewGroup 不应该对 dispatchDraw()进行复写。
传递尺寸的两个类1.ViewGroup.LayoutParams(View自身的布局参数)getLayoutParams获取的为父布局lauout参数2.MeasureSpecs(父视图对子视图的测量要求)三种测量规格3.核心方法setMeasuredDimension。将计算得到的宽高传递给该方法,测量结束。根据MeasureSpecs获取到的宽高
Constructor
View
DecorView
onDraw
Activity
View 树的绘图流程在ViewRoot.java类的performTraversals函数展开的,
Draw
onLayout
addView
dispatchDraw
requestLayout
Measure
0 条评论
下一页