在第一次 performMeasure() 方法调用后, 如果子View 需要的空间大于父容器为它测量的大小,那么对应的 verticalWeight 和 horizontalWeight 将会大于0,即这两个字段分别对应垂直和水平的情况下子 View 需要的额外空间。这时候会将 measureAgain 设置为 true, 并且开始第二次测量。
父视图可以使用unspecified dimensions来将它的每个子视图都测量一次来算出它们到底需要多大尺寸,如果所有这些子视图没被限制的尺寸的和太大或太小,那么它会用精确数值再次调用measure()(也就是说,如果子视图不满意它们获得的区域大小,那么父视图将会干涉并设置第二次测量规则
总结:
measure首先调用两次是因为父布局需要测量两次,而第三次测量是因为performtravals()方法被调用了两次,所以onmeasure和onlayout被再次调用了,因为第一次surface还没有创建出来,(即初始化RenderThread),所以newsurface为true,然后第二次newsurface为false的时候才开始执行ondraw了
网友评论