从 ViewRootImpl.TraversalRunnable.run 到 onMeasure,onLayout,onDraw
函数栈
onMeasure的函数栈:
- android.view.ViewRootImpl.TraversalRunnable.run:::
- android.view.ViewRootImpl.doTraversal:::
- android.view.ViewRootImpl.performTraversals:::
- android.view.ViewRootImpl.measureHierarchy::View,WindowManager.LayoutParams,Resources,int,int:
- android.view.ViewRootImpl.performMeasure::int,int:
- android.view.View.measure::int,int:
- android.view.View.onMeasure::int,int:
其中在调用了android.view.ViewRootImpl.measureHierarchy之后, android.view.ViewRootImpl.performTraversals又调用了android.view.ViewRootImpl.performMeasure
onLayout的函数栈:
- android.view.ViewRootImpl.TraversalRunnable.run:::
- android.view.ViewRootImpl.doTraversal:::
- android.view.ViewRootImpl.performTraversals:::
- android.view.ViewRootImpl.performLayout::WindowManager.LayoutParams,int,int:
- android.view.View.layout::int,int,int,int:
- android.view.View.onLayout::boolean,int,int,int,int:
其中android.view.ViewRootImpl.performLayout::WindowManager.LayoutParams,int,int:中还调用了android.view.ViewRootImpl.measureHierarchy::View,WindowManager.LayoutParams,Resources,int,int:,android.view.View.layout::int,int,int,int:中还调用了android.view.View.onMeasure::int,int:
onDraw的调用栈
- android.view.ViewRootImpl.TraversalRunnable.run:::
- android.view.ViewRootImpl.doTraversal:::
- android.view.ViewRootImpl.performTraversals:::
- android.view.ViewRootImpl.performDraw:::
- android.view.ViewRootImpl.draw::boolean:
- android.view.ViewRootImpl.drawSoftware::Surface,AttachInfo,int,int,boolean,Rect:
- android.view.View.draw::Canvas:
- android.view.View.onDraw::Canvas:
子视图的绘制调用栈
- android.view.ViewRootImpl.TraversalRunnable.run:::
- android.view.ViewRootImpl.doTraversal:::
- android.view.ViewRootImpl.performTraversals:::
- android.view.ViewRootImpl.performDraw:::
- android.view.ViewRootImpl.draw::boolean:
- android.view.ViewRootImpl.drawSoftware::Surface,AttachInfo,int,int,boolean,Rect:
- android.view.View.draw::Canvas:
- android.view.ViewGroup.dispatchDraw::Canvas:
- android.view.ViewGroup.drawChild::Canvas,View,long:
- android.view.View.draw::Canvas,ViewGroup,long:
- android.view.View.draw::Canvas:
可以看出视图树的遍历通过函数 android.view.View.draw::Canvas: 的递归调用
android.view.ViewRootImpl.TraversalRunnable
这个类的源码很简单:
final class TraversalRunnable implements Runnable {
@Override
public void run() {
doTraversal();
}
}
这个类的实例只有:android.view.ViewRootImpl.mTraversalRunnable