灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2959回复:0

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

楼主#
更多 发布于:2013-01-10 15:42
一、自定义组件大小的设置
不管你怎么设置,自定义组件似乎总是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;  
        ...  
    }  
}  

喜欢0 评分0
游客

返回顶部