【android】自定义组件及其内组件大小的正确设置

一、自定义组件大小的设置

不管你怎么设置,自定义组件似乎总是match_parent。我们需要覆盖onMeasure方法,并在其内正确设置组件大小。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
	//注意:为尽可能简洁本文只讨论EXACTLY和AT_MOST模式
	int mode = MeasureSpec.getMode(widthMeasureSpec);
	if(mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) {
		this.widthMeasureSpec = widthMeasureSpec;
		this.heightMeasureSpec = heightMeasureSpec;
		int width = MeasureSpec.getSize(widthMeasureSpec);
		int height = MeasureSpec.getSize(heightMeasureSpec);
		setMeasuredDimension(width, height);
	} else if(mode == MeasureSpec.UNSPECIFIED) {
		Log.d("WOGU", "mode=UNSPECIFIED");
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}
}

二、自定义组件内的组件的大小设置

除了覆盖onMeasure还需覆盖onLayout,在其内设置子元素的大小。

public class MyViewGroup extends ViewGroup {
	protected int widthMeasureSpec, heightMeasureSpec;

	@Override
	protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
		if(changed) {
			View view = getChildAt(0);
			//measure将触发View的onMeasure。
			//widthMeasureSpec包括尺寸和模式
			//int width = MeasureSpec.getSize(widthMeasureSpec);
			//int height = MeasureSpec.getSize(heightMeasureSpec);
			//int mode = MeasureSpec.getMode(widthMeasureSpec);
			//mode的可能值MeasureSpec.AT_MOST,MeasureSpec.EXACTLY,MeasureSpec.UNSPECIFIED
			//这里只是简单的在onMeasure中记录widthMeasureSpec和heightMeasureSpec
			//其实MeasureSpec提供了根据sizet和模式合成widthMeasureSpec,heightMeasureSpec的方法
			//int widthMeasureSpec = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY);
			//int heightMeasureSpec = MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY);
			view.measure(widthMeasureSpec, heightMeasureSpec);
			view.layout(0, 0, getWidth(), getHeight());
		}
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		this.widthMeasureSpec = widthMeasureSpec;
		this.heightMeasureSpec = heightMeasureSpec;
		...
	}
}


三、demo下载


四、联系方式

QQ:88433062

android交流群:33455842


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值