16

目前,我有一个看起来像这样的布局。它包含。

  • 标题文本视图和价格文本视图,始终可见。
  • 描述文本视图,可以是可见的或消失的,取决于展开或折叠。

折叠(在应用程序启动期间)

在此处输入图像描述

扩展(当用户点击它时)

在此处输入图像描述

我想围绕它制作一些漂亮的动画。所以,我提到了https://stackoverflow.com/a/13381228/72437

关键元素之一是知道Description Text View的确切高度,甚至在它可见之前。

但是,我实现了几种类型的代码。它们不准确

// v is description text view.
v.measure(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
final int targtetHeight = v.getMeasuredHeight();

// v is description text view.
v.measure(MeasureSpec.makeMeasureSpec(LayoutParams.MATCH_PARENT, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.EXACTLY));
final int targtetHeight = v.getMeasuredHeight();

这将返回值 32。(正确的测量高度假设为 92)。这是第一行文本的高度。这结束了我的动画结束于

在此处输入图像描述

我可以知道,确定视图测量高度的正确方法是什么,甚至在它从 GONE 变为 VISIBLE 之前?

我的布局代码如下:

        <LinearLayout
            android:clickable="true"
            android:id="@+id/chart_linear_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/dummy"
            android:orientation="vertical">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:orientation="horizontal">
                <TextView
                    android:layout_width="0dp"
                    android:width="0dp"
                    android:layout_weight="0.6"
                    android:layout_height="match_parent"
                    android:gravity="left"
                    android:textSize="20sp" 
                    android:textColor="#ff000000"
                    android:text="Summary chart" />
                <TextView
                    android:id="@+id/chart_price_text_view"
                    android:layout_width="0dp"
                    android:width="0dp"
                    android:layout_weight="0.4"
                    android:layout_height="match_parent"
                    android:gravity="right"
                    android:textSize="20sp" 
                    android:textColor="#ffF76D3C"
                    android:text="$2.99" />

            </LinearLayout>
            <TextView
                android:visibility="gone"
                android:id="@+id/chart_description_text_view"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginBottom="10dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"         
                android:text="@string/currency_exchange_description"
                android:textColor="#ff626262"
                android:textSize="15sp" />                 
        </LinearLayout>
4

2 回答 2

43

您的第二个代码片段几乎是正确的,但您需要指定像素大小 - 而不是FILL_PARENT/MATCH_PARENT. 这应该有效:

v.measure(MeasureSpec.makeMeasureSpec(parentView.getWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(MAX_HEIGHT, MeasureSpec.AT_MOST));
final int targetHeight = v.getMeasuredHeight();

您需要引用作为v其子级的 ViewGroup 以获取其宽度,并定义MAX_HEIGHT(或者可能使用父视图的高度?)。

此外,您应该将水平 LinearLayout 内的两个 TextView 的高度参数更改为wrap_content,因为match_parent在这里使用可能会导致问题。LinearLayout 设置为 wrap_content,但两个子级没有指定高度。

于 2013-10-08T20:41:40.753 回答
3

我为我的手风琴组件完成了这个。我面临着完全相同的问题,即扩展需要“目标”高度的手风琴,即扩展后所需的高度。这将返回正确的高度:

/***
 * This function returns the actual height the layout. The getHeight() function returns the current height which might be zero if
 * the layout's visibility is GONE
 * @param layout
 * @return
 */
public static int getFullHeight(ViewGroup layout) {
    int specWidth = View.MeasureSpec.makeMeasureSpec(0 /* any */, View.MeasureSpec.UNSPECIFIED);
    int specHeight = View.MeasureSpec.makeMeasureSpec(0 /* any */, View.MeasureSpec.UNSPECIFIED);


    layout.measure(specWidth,specHeight);
    int totalHeight = 0;//layout.getMeasuredHeight();
    int initialVisibility = layout.getVisibility();
    layout.setVisibility(View.VISIBLE);
    int numberOfChildren = layout.getChildCount();
    for(int i = 0;i<numberOfChildren;i++) {
        View child = layout.getChildAt(i);
        if(child instanceof ViewGroup) {
            totalHeight+=getFullHeight((ViewGroup)child);
        }else {
            int desiredWidth = View.MeasureSpec.makeMeasureSpec(layout.getWidth(),
                    View.MeasureSpec.AT_MOST);
            child.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
            totalHeight+=child.getMeasuredHeight();
        }

    }
    layout.setVisibility(initialVisibility);
    return totalHeight;
}

您可以在 GitHub 上查看手风琴组件和动画:​​Android Accordion View

于 2016-11-28T08:07:55.997 回答