您的位置:首页 > 移动开发 > Android开发

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

2013-01-08 15:56 471 查看
一、自定义组件大小的设置

不管你怎么设置,自定义组件似乎总是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐