在Android中绘制之前测量所有视图层次结构

时间:2012-07-11 05:54:47

标签: android android-layout view measurement

我有下一个观点hiererchy:

     <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:gravity="center">
        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/group_bg"
            android:gravity="center_vertical" 
            android:baselineAligned="false">
            <LinearLayout
                android:id="@+id/itemplace"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginRight="5dp"
                android:layout_weight="1" >
                <include
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    layout="@layout/pin" />
            </LinearLayout>
            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/arrow_black"/>
        </LinearLayout>
    </LinearLayout>

我需要在此层次结构绘制之前获得itemplace宽度。我不能使用OnLayoutChangeListener,因为我使用API​​级别7。

我知道我必须使用measure()和layout()方法来计算我的视图大小,但我不知道要做什么。

我的层次结构中的根视图必须填满屏幕的所有宽度,因此itemplace宽度取决于父级大小,父级填充和FrameLayout宽度。

我必须做些什么来获得宽度?

2 个答案:

答案 0 :(得分:2)

我找到了获取视图宽度的方法。我可以在android测量之后但在使用ViewTreeObserver中的OnPreDrawListener进行绘制之前得到它:

    view.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener()
    {
        @Override
        public boolean onPreDraw()
        {
            int avaliableWidth = view.getWidth() - view.getPaddingLeft() - view.getPaddingRight();

            Log.d("width", String.valueOf(avaliableWidth));

            return true;
        }
    });

来自Android文档:

  

在即将绘制视图树时要调用的回调方法。   此时,树中的所有视图都已经过测量并给出了一个   帧。客户端可以使用它来调整其滚动边界甚至是   在绘图之前请求新的布局。

答案 1 :(得分:0)

自API 1起可用:

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

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
}