关于onMeasure(),onlayout()方法的简单介绍

在继承ViewGroup类时,子类需要重写两个方法,分别是onMeasure,onLayout两个方法。

1、在onMeasure(int, int)中,必须调用setMeasuredDimension(int width, int height)来存储测量得到的宽度和高度值,如果没有这么去做会触发异常

IllegalStateException。

2、onLayout()的调用时机:在view给其孩子设置尺寸和位置时被调用。

3、执行的顺序:onMeasure(int, int)--->onLayout()


@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		
		int width=mesureWidth(widthMeasureSpec);
		int height=mesureHeight(heightMeasureSpec);
		
		//计算viewgroup子控件的大小
		measureChildren(width, height);
		
		//设置自定义viewgroup的大小
		setMeasuredDimension(width, height);
		
		
	}
	
	
	private int mesureWidth(int width){
		
		int result=0;
		//模式
		int mode=MeasureSpec.getMode(width);
		int widthsize=MeasureSpec.getSize(width);
		
		switch (mode) {
		
		case MeasureSpec.AT_MOST:
		case MeasureSpec.EXACTLY:
			
			result=widthsize;
			
			break;

		default:
			break;
		}
		
		 
		return result;
		
	}
	
    private int mesureHeight(int height){
		
		int result=0;
		//模式
		int mode=MeasureSpec.getMode(height);
		int heightsize=MeasureSpec.getSize(height);
		
		switch (mode) {
		
		case MeasureSpec.AT_MOST:
		case MeasureSpec.EXACTLY:
			
			result=heightsize;
			
			break;

		default:
			break;
		}
		
		 
		return result;
		
	}
	

   /**
     * 调用场景:在view给其孩子设置尺寸和位置时被调用*/
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		super.onLayout(changed, l, t, r, b);
		
		int appWidth=this.getWidth();
		int appHeight=this.getHeight();
		
		/*int chilcount=getChildCount();
		View childview=getChildAt(0);
		int h=childview.getMeasuredHeight();*/
		
		Log.i("------->", appWidth+"");
		Log.i("------->", appHeight+"");
		
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值