同时使用maxHeight和weight

时间:2016-03-07 11:03:36

标签: android android-layout android-studio android-layout-weight

我的父母LinearLayout里面有ImageView和孩子LinearLayoutLinearLayout子项中包含可以具有不同长度的文本。我希望ImageView总是具有相同的大小(200dpx200dp),并且如果子LinearLayout的文本溢出,则只按比例缩小

为此,我在ImageView子级中使用了layout_weightmaxHeight,但由于layout_weight,maxHeight无法正常工作。当子ImageView的文本没有溢出时,LinearLayout不是平方的,而是显示为矩形。

我怎么能这样做?

这是代码

<ImageView
        android:id="@+id/charImage"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:maxWidth="200dp"
        android:maxHeight="200dp"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"
        android:src="@drawable/jon_snow" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:orientation="vertical">
        ----some childs----
   </LinearLayout>

它应该是这样的,一个正方形 ImageView,下面有一些文字,与文字的长度无关。

enter image description here修改

我试图修改自定义ImageView的onMeasure(),但它没有正确调整大小,它占用了LinearLayout子节点的一些空间并且文本溢出

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

    int height = Math.min(widthMeasureSpec, Math.min(heightMeasureSpec, dpToPx(200)));
    setMeasuredDimension(height, height);

}

private int dpToPx(int dp){

    float density = getResources().getDisplayMetrics().density;
    return Math.round((float)dp * density);
}

1 个答案:

答案 0 :(得分:0)

没有承诺图像将被平方,因为它的最大宽度和高度是平方的。所有这些意味着如果它在两个方向上填充其最大尺寸,那么它将是方形的。如果你想确保它的平方,子类ImageView并覆盖onMeasure以强制它的方形尺寸。

我也不知道重量是否适用于maxXXX。但更糟糕的是,你可以通过强制它不超过200来使它在onMeasure中全部工作。