一个 forceLayout() 和 requestLayout() 的测试

本文探讨了Android中View的forceLayout()和requestLayout()的区别与应用场景。通过测试case展示了它们如何影响子View的onMeasure(), onLayout(), layout(), draw()和onDraw()调用。forceLayout()在下次layout bypass中强制重新测量和布局,而requestLayout()不仅强制布局,还会触发布局传递。理解这两个方法对于优化Android应用的性能至关重要。" 106681196,9091652,配置zipkin服务端连接rabbitmq进行链路追踪,"['链路追踪', 'zipkin', 'rabbitmq']
摘要由CSDN通过智能技术生成

两个view:

一个是系统默认的FrameLayout,  A

一个是自己自定义的MyView extends View,重载了onMeasure函数(): B

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// TODO Auto-generated method stub
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		// Log.e(TAG, "onMeasure " + MeasureSpec.getSize(widthMeasureSpec)
		// 		+ " " + MeasureSpec.getSize(heightMeasureSpec));
		setMeasuredDimension(MeasureSpec.makeMeasureSpec(mW-=10, MeasureSpec.EXACTLY),
				MeasureSpec.makeMeasureSpec(mH-=10, MeasureSpec.EXACTLY));
	}
逻辑很简单,每次只要B的onMeasure被触发,那么B的尺寸就原来小10.

A包含B,

几个测试case: (measure() 是final的,无法覆盖,不过B的measure()应该是每次被调到的)

1. A.requestLayout();                                    不会调用到B.onMeasure() 和 B.onLayout(), 会调用B.layout() (注意连draw()都没有被调到,这意味着B被A认为完全没变,不需要重绘)

2. B.forceLayout(); A.requestLayout()           会调用到B的.onMeasure() 和 onLayout() 以及 layout(), draw(), onDraw()

3. B.requestLayout()                                      会调用到B的.onMeasure() 和 onLayout() 以及 layout(),draw(), onDraw()

4. B.invalidate()                                               B的layout(), onLayou

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值