View的三次onMeasure,两次Layout,一次onDarw

image.png

在第一次 performMeasure() 方法调用后, 如果子View 需要的空间大于父容器为它测量的大小,那么对应的 verticalWeight 和 horizontalWeight 将会大于0,即这两个字段分别对应垂直和水平的情况下子 View 需要的额外空间。这时候会将 measureAgain 设置为 true, 并且开始第二次测量。


父视图可以使用unspecified dimensions来将它的每个子视图都测量一次来算出它们到底需要多大尺寸,如果所有这些子视图没被限制的尺寸的和太大或太小,那么它会用精确数值再次调用measure()(也就是说,如果子视图不满意它们获得的区域大小,那么父视图将会干涉并设置第二次测量规则

总结:

measure首先调用两次是因为父布局需要测量两次,而第三次测量是因为performtravals()方法被调用了两次,所以onmeasure和onlayout被再次调用了,因为第一次surface还没有创建出来,(即初始化RenderThread),所以newsurface为true,然后第二次newsurface为false的时候才开始执行ondraw了

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容