度量UI性能耗时的标准制定调研

假设LinearLayout里有个RecyclerView,以下描述都是微秒计,1000微妙(us)=1毫秒:
A. 当RecyclerView的layout_width和layout_height都设置为300dp时,LinearLayout的onMeasure耗时是700us。
B. 当RecyclerView的layout_width=match_parent,而layout_height=wrap_content时,LinearLayout的onMeasure耗时是40000us。
所以我们应该使劲压榨设计出图时,必须给出一个确定尺寸的RecyclerView?

但是事实上,B方案的onLayout花了700us,而A方案的onLayout花了40000us,(这两个不是精确数值),然后你怎么想?
当太监看到此处,遂练会了乾坤大挪移,使劲逃逸转嫁耗时。江湖人见 别人花40毫秒测量,他只用了不到1毫秒。

另一个大神过来,将RecyclerView硬是替换成了可滚动的LinearLayout,然后耗时从40000us变成了3000us,因为此处布局带来的内存不同无法体现啊,两位大哥终将狭路相逢。

承然,有RecyclerView的布局相对来说要耗时一些,但是拿它们的直接onMeasure数据(一个50毫秒,一个3毫秒)进行对比是不公平的。
首先,RecyclerView的item是需要即时从layout.xml中解析穿针引线的,可以看到onCreateViewHolder有明显的耗时。
其次,RecyclerView除了支持viewholder的复用(减少资源浪费),而且支持众item的联动动画,dispatchLayoutStep1,dispatchLayoutStep2,dispatchLayoutStep3有大部分都是为此服务的,动画中布局不稳定,width,height不稳定,所以耗时也是可以理解的,扩展性越好,功能越复杂,越耗时,合理公平。
上面的A, B的总耗时基本一致(B确实会更耗时一点)。但是最重要的不公平来了,我们以B方案为例,它的onMeasure耗时40毫秒,但是它的onMeasure里包括了所有子item的onMeasure,onLayout阶段耗时并且包括view系统在此穿针引线的代码耗时,你说这对它公平?

另一个不公平的点是,Activity启动会测量两次,如果你的布局在第一次测量时需要进行(因为此时Window的size可能还未定?),那么比第二次才开始的测量要耗时。另一个层面上讲,一个自定义MyTextView,在第一次从布局加载时,此类才会被加载(就是有类加载的耗时)。而且第一次一定没有测量的缓存。所以谁跑在第一个位置谁吃亏。(建议只进行水平对比测试)

综上。
视图性能的指标不能孤立的对比onMeasure,onLayout,onDraw。

个人愚见,目前还只是初步设想,指标应从两个方面反映,并体现公平性。

  1. 从用户等待的角度,分成布局时间指标(onMeasure的开始处计时到onLayout的结尾处结束计时)和绘制时间指标(draw方法的前后,和过去一样);
  2. 从开发者的角度,

A: recyclerview的布局指标,测量item的onMeasure,和onLayout,而不是包含recyclerview本身的视图,外视图本身比较简单,布局功力体现在item上。

B: 绘制指标关注此方法中是否频繁创建对象这样的内存指标,以及systrace中vsync的影响。

  1. 横划类不与普通类的模板进行对比,分成两类。
  2. 只度量模板在RecyclerView中首次出现的情况,最好是将其置顶进行鞭打。

另外:

我印象中draw方法里用Path的方法本身不会导致耗时,但是Path好像无法硬件加速,后面真正渲染在surface或bitmap时的耗时没有考虑在内。所以单纯的测量draw的耗时,有时起不到作用。
我之前另一个测试结论。RelativeLayout会测量其子view们两次,假设onMeasure分别耗时是700us,200us,(再次说明以某一次的onMeasure,比如200us进行衡量没有意义),ConstraintLayout在此种情况下只测量了一次其子view, 但是onMeasure的耗时是4000us。所以onMeasure的次数不应该左右你做出布局的决定,除非你知道会测量两次,但是其子view数众多。不过这种积少成多一般会反映在自己的onMeasure耗时上。
假设:

MyLinearLayout里有RecyclerView。

RecyclerView里的item布局顶层是MyFrameLayout,MyFrameLayout里有MyTextView。

测试数据:

RecyclerView的layout_width=“match_parent”, layout_height=“200dp”:

2018-11-29 12:43:09.391 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.407 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.407 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.408 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 733
2018-11-29 12:43:09.408 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …I. 0,0-0,0}: onMeasure end 1477
2018-11-29 12:43:09.408 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …ID 0,0-1080,126}: onLayout start
2018-11-29 12:43:09.409 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.409 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.409 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …ID 0,0-1080,126}: onLayout end
2018-11-29 12:43:09.416 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.416 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.416 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 290
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …I. 0,0-0,0}: onMeasure end 784
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …ID 0,126-1080,252}: onLayout start
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …ID 0,126-1080,252}: onLayout end
2018-11-29 12:43:09.424 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.425 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.425 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 325
2018-11-29 12:43:09.425 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …I. 0,0-0,0}: onMeasure end 864
2018-11-29 12:43:09.425 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …ID 0,252-1080,378}: onLayout start
2018-11-29 12:43:09.426 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.426 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.426 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …ID 0,252-1080,378}: onLayout end
2018-11-29 12:43:09.432 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.433 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.433 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 284
2018-11-29 12:43:09.433 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …I. 0,0-0,0}: onMeasure end 763
2018-11-29 12:43:09.434 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …ID 0,378-1080,504}: onLayout start
2018-11-29 12:43:09.434 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.434 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.434 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …ID 0,378-1080,504}: onLayout end
2018-11-29 12:43:09.441 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.441 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.441 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 306
2018-11-29 12:43:09.441 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …I. 0,0-0,0}: onMeasure end 820
2018-11-29 12:43:09.442 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …ID 0,504-1080,630}: onLayout start
2018-11-29 12:43:09.442 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.442 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.442 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …ID 0,504-1080,630}: onLayout end
2018-11-29 12:43:09.443 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-0,0}: onMeasure end 51177
2018-11-29 12:43:09.443 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-1080,525}: onLayout start
2018-11-29 12:43:09.443 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-1080,525}: onLayout end

RecyclerView的layout_width=“match_parent”, layout_height=“wrap_content”:
2018-11-29 12:43:53.634 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.634 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …I. 0,0-0,0}: onMeasure end 120
2018-11-29 12:43:53.634 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-1080,525}: onLayout start
2018-11-29 12:43:53.649 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.650 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.650 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 685
2018-11-29 12:43:53.651 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …I. 0,0-0,0}: onMeasure end 1443
2018-11-29 12:43:53.651 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …ID 0,0-1080,126}: onLayout start
2018-11-29 12:43:53.651 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.651 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.652 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …ID 0,0-1080,126}: onLayout end
2018-11-29 12:43:53.658 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.659 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.659 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 361
2018-11-29 12:43:53.659 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …I. 0,0-0,0}: onMeasure end 971
2018-11-29 12:43:53.660 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …ID 0,126-1080,252}: onLayout start
2018-11-29 12:43:53.660 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.660 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.660 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …ID 0,126-1080,252}: onLayout end
2018-11-29 12:43:53.666 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.667 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.667 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 250
2018-11-29 12:43:53.667 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …I. 0,0-0,0}: onMeasure end 711
2018-11-29 12:43:53.667 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …ID 0,252-1080,378}: onLayout start
2018-11-29 12:43:53.668 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.668 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.668 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …ID 0,252-1080,378}: onLayout end
2018-11-29 12:43:53.674 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.674 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.674 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 296
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …I. 0,0-0,0}: onMeasure end 780
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …ID 0,378-1080,504}: onLayout start
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …ID 0,378-1080,504}: onLayout end
2018-11-29 12:43:53.682 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.682 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.682 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 282
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …I. 0,0-0,0}: onMeasure end 804
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …ID 0,504-1080,630}: onLayout start
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …ID 0,504-1080,630}: onLayout end
2018-11-29 12:43:53.684 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-1080,525}: onLayout end

猜你喜欢

转载自blog.csdn.net/kslinabc/article/details/84647049