子父布局wrap_content和match_parent相对onMeasure的作用浅析

来源:互联网 发布:淘宝roi 编辑:程序博客网 时间:2024/04/30 15:16

安卓自定义控件中,对于尺寸测量都在onMeasure方法中进行的,而尺寸测量中用到xml属性最重要的两个,layout_width,layout_height,下面来分析下,这两个属性(父控件和子控件)对测量的影响。

看布局文件:

<?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="wrap_content"    android:orientation="horizontal">    <TextView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:text="第一个控件"        android:background="#123456"/></LinearLayout>

 首先,父控件layout_width属性为match_parent,这个很好理解,在父控件onMeasure方法中,传入的第一个参数通过
MeasureSpec.getMode(widthMeasureSpec) 得到的模式值为 MeasureSpec.EXACTLY
可见该控件的父控件给了一个确定的值,这样外层控件的宽度值确定了,现在来看子控件TextView的layout_width属性,也是
match_parent,在TextView的onMeasure方法中的第一个参数仍然可以得到该控件准确的宽度值了,由此可见整个宽度值是填满屏幕的。
以上都好理解,下面看看layout_height属性。
外层控件(父控件),layout_height:wrap_content,在对应的onMeasure方法中,得到的模式值为MeasureSpec.AT_MOST,所以
此时无法确定高度大小,得继续测量子控件高度。现在来看TextView的layout_height的值为match_parent,而此时父控件的高度值交给
子控件来完成,所以最终确定高度值得子控件告诉外层父控件。而此时子控件TextView的onMeasure方法被调用多次,第一次调用时,高度模式为
MeasureSpec.AT_MOST,当通过子控件的测量方法获取到外层控件的高度值后,会再次调用TextView的onMeasure方法,而这次调用时,
传入的高度模式值为MeasureSpec.EXACTLY,从而确定子控件高度。

0 0
原创粉丝点击