转自:
一、自定义组件大小的设置
不管你怎么设置,自定义组件似乎总是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