码迷,mamicode.com
首页 > 其他好文 > 详细

match_parent、wrap_parent、具体值 和 MeasureSpec 类中 mode 的对应关系

时间:2014-11-21 20:36:22      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:android   style   blog   http   io   ar   os   使用   sp   

测试结果如下:

 * wrap_parent -> MeasureSpec.AT_MOST
 * match_parent -> MeasureSpec.EXACTLY
 * 具体值 -> MeasureSpec.EXACTLY

一个 view 的 onMeasure 方法最终得到的测量规格值(测量约束值)中包含的测量模式和上面不一定对的上,这是因为 onMeasure 方法中得到的测量规格值(测量约束值)是 measure 方法传过来的,父 view 在调用 measure 方法的时候可以根据自己的情况不使用 ViewGroup 提供的 measureChildren 方法,而改变上面的映射关系,比如 RelativeLayout 中就结合其他 Layout 属性综合确定 MeasureSpec 中的模式。上面的映射关系可以直接查看 ViewGroup 类的 measureChildren 方法,这是最简单的 measure 方式.

ViewGroup 中 measureChild 方法如下:

    protected void measureChild(View child, int parentWidthMeasureSpec,
            int parentHeightMeasureSpec) {
        final LayoutParams lp = child.getLayoutParams();

        final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
                mPaddingLeft + mPaddingRight, lp.width);
        final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
                mPaddingTop + mPaddingBottom, lp.height);

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
    }

测试代码如下

TestView.java

/**
 * 测试 match_parent、wrap_parent、具体值 和 MeasureSpec 中  mode 的对应关系
 */
package com.example.testmeasurespec;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class TestView extends View {

    private static final String TAG = "TestView";

    public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public TestView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TestView(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.i(TAG, "onMeasure:" + getTag());
        setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
                getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
    }

    public static int getDefaultSize(int size, int measureSpec) {
        int result = size;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        switch (specMode) {
            case MeasureSpec.UNSPECIFIED:
                Log.i(TAG, "specMode:MeasureSpec.UNSPECIFIED");
                result = size;
                break;
            case MeasureSpec.AT_MOST:
                Log.i(TAG, "specMode:MeasureSpec.AT_MOST");
            case MeasureSpec.EXACTLY:
                Log.i(TAG, "specMode:MeasureSpec.EXACTLY");
                result = specSize;
                break;
        }
        return result;
    }
}

TestLayout.java

public class TestLayout extends ViewGroup {
    
    public TestLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public TestLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TestLayout(Context context) {
        super(context);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

    }
    
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        measureChildren(widthMeasureSpec, heightMeasureSpec);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

main_activity.xml

<com.example.testmeasurespec.TestLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.example.testmeasurespec.TestView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_launcher"
        android:tag="test1" />

    <com.example.testmeasurespec.TestView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/ic_launcher"
        android:tag="test2" />

    <com.example.testmeasurespec.TestView
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:background="@drawable/ic_launcher"
        android:tag="test3" />

</com.example.testmeasurespec.TestLayout>


match_parent、wrap_parent、具体值 和 MeasureSpec 类中 mode 的对应关系

标签:android   style   blog   http   io   ar   os   使用   sp   

原文地址:http://blog.csdn.net/zhaoyw2008/article/details/41355819

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!