当指定布局的宽度为wrapcontent时,自定义控件的onMesure方法的参数的值为什么是父控件的大小?
啥佛大学 2016-04-21 03:30:26 这是布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.example.test_viewmeasure.MyLinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#f00" >
<TextView
android:text="哈哈"
android:textColor="#000"
android:layout_width="10dp"
android:layout_height="10dp"
/>
</com.example.test_viewmeasure.MyLinearLayout>
</LinearLayout>
这是自定义控件:
package com.example.test_viewmeasure;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;
public class MyLinearLayout extends LinearLayout {
public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
/*public MyLinearLayout(Context context) {
super(context);
}*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}
private int measureWidth(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
result = 200;
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
}
return result;
}
private int measureHeight(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
result = 200;
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
}
return result;
}
}
自定义布局的大小我写成了wrapcontent 那么 result = Math.min(result, specSize);的值就应该是textView和200中的较小值 TextView的大小我写成了10dp 肯定比200px小 但是 最终 的result的值竟然是200px 这是为什么 也就是说 此时的onMesur方法的参数值默认是父控件的大小的数值 而不是子控件的大小值。