自定义组件大小的设置

转自:

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

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

  1. @Override  
  2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  3.     //注意:为尽可能简洁本文只讨论EXACTLY和AT_MOST模式  
  4.     int mode = MeasureSpec.getMode(widthMeasureSpec);  
  5.     if(mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) {  
  6.         this.widthMeasureSpec = widthMeasureSpec;  
  7.         this.heightMeasureSpec = heightMeasureSpec;  
  8.         int width = MeasureSpec.getSize(widthMeasureSpec);  
  9.         int height = MeasureSpec.getSize(heightMeasureSpec);  
  10.         setMeasuredDimension(width, height);  
  11.     } else if(mode == MeasureSpec.UNSPECIFIED) {  
  12.         Log.d("WOGU""mode=UNSPECIFIED");  
  13.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  14.     }  
  15. }  
二、自定义组件内的组件的大小设置

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

  1. public class MyViewGroup extends ViewGroup {  
  2.     protected int widthMeasureSpec, heightMeasureSpec;  
  3.   
  4.     @Override  
  5.     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {  
  6.         if(changed) {  
  7.             View view = getChildAt(0);  
  8.             //measure将触发View的onMeasure。  
  9.             //widthMeasureSpec包括尺寸和模式  
  10.             //int width = MeasureSpec.getSize(widthMeasureSpec);  
  11.             //int height = MeasureSpec.getSize(heightMeasureSpec);  
  12.             //int mode = MeasureSpec.getMode(widthMeasureSpec);  
  13.             //mode的可能值MeasureSpec.AT_MOST,MeasureSpec.EXACTLY,MeasureSpec.UNSPECIFIED  
  14.             //这里只是简单的在onMeasure中记录widthMeasureSpec和heightMeasureSpec  
  15.             //其实MeasureSpec提供了根据sizet和模式合成widthMeasureSpec,heightMeasureSpec的方法  
  16.             //int widthMeasureSpec = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY);  
  17.             //int heightMeasureSpec = MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY);  
  18.             view.measure(widthMeasureSpec, heightMeasureSpec);  
  19.             view.layout(00, getWidth(), getHeight());  
  20.         }  
  21.     }  
  22.   
  23.     @Override  
  24.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  25.         this.widthMeasureSpec = widthMeasureSpec;  
  26.         this.heightMeasureSpec = heightMeasureSpec;  
  27.         ...  
  28.     }  
  29. }  


三、demo下载


四、联系方式

QQ:88433062

android交流群:33455842

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值