android 设置组件大小,[android]自定义组件及其内组件大小的正确设置

本文介绍了如何在Android开发中自定义组件大小的设置,包括覆盖onMeasure方法以处理不同模式下的尺寸计算,以及onLayout用于设置子元素布局。重点在于理解和应用MeasureSpec来精确控制组件尺寸。
摘要由CSDN通过智能技术生成

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

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

[java]

@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,在其内设置子元素的大小。

[java]

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;

...

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值