View
2020-07-18 15:53:37 0 举报
Android的View绘制流程图
作者其他创作
大纲/内容
getChildMeasureSpec(...)之后
foreground.draw(canvas)
implement
step6绘制前景和滚动条
sizeChanged =比较上次和本次宽高
addView(view...)
ltrb任意一个改变就会重新布局
onDraw(canvas)
onDrawForeground(canvas)
handleResumeActivity(...)
绘制前景
给每个子View设置动画
实现方法
step3绘制当前View的内容
调用
dispatchDraw(canvas)
保存本次的ltrb
之后遍历
getDefaultSize()
extends
布局发生改变
绘制滚动条
child.measure
DecorView没有重写View的draw方法
重写的onMeasure
host=mview
mWindow.getWindowManager()
将DecorView赋给全局的ViewmView=view
performMeasure()
((WindowManagerImpl)wm).createLocalWindowManager(this)
字段
设置子View动画
WindowManagerGlobal
onDrawScrollIndicators(canvas);
内部类TraversalRunnable
是Viwe还是ViewGroup
mTraversalRunnable
performDraw()
DecorView没有重写View的layout方法
step5
getSuggestedMinimumWidth()
Runnable
DecorView-onMeasure
是View
ViewRootImpl
开始布局动画
遍历
mView.draw(canvas)
是ViewGroup
判断是否给Canvas边距进行剪裁
例如LinearLayout
a.getWindowManager()
绘制滚动条指示器
performLayout()
onDrawScrollBars(canvas);
之后
drawSoftware(Surface...)
doTraversal()
ViewGroup没有onMeasure和measure方法
root.setView(view...)
View.draw(canvas)
setMeasuredDimension()测量结束标志
判断ViewGroup容器是否设置动画
drawChild(...)
DecorView-onLayout
Window
ViewGroup中的dispatchDraw(canvas)
getSuggestedMinimumHeight()
run()
得到布局动画控制器controller
开始绘制View
例如
得到子布局的ltrb/不绘制属性为GONE的
child.draw
scheduleTraversals()
DecorView重写了View的onmeasure方法
DecorView没有重写View的measure方法
绘制滑动时边框的渐变效果
Activity
设置动画监听mAnimationListener
final TraversalRunnable mTraversalRunnable = new TraversalRunnable();
draw(...)
step4绘制子View
measureChildBeforeLayout(child...)
getRootMeasureSpec(...)之后
run() { doTraversal();}
WindowManagerImpl
step1绘制背景
FrameLayout
ActivityThread
drawBackground(canvas)
requestLayout()
measureChildWithMargins()
step2
ViewOnMeasure
super.onMeasure(...)
performTraversals()
DecorView重写了View的onLayout方法
controller.start()
从Surface.lockCanvas中得到Canvas
设置foreground的边距
0 条评论
下一页