ImageView:adjustViewBounds不能与layout_height =“fill_parent”一起使用?

时间:2011-03-23 10:40:21

标签: android imageview scale

我正在尝试将EditText与左侧的ImageView放在一行中。但我无法正确缩放图像以匹配文本输入的高度。

布局很简单:

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:adjustViewBounds="true"
            android:scaleType="fitStart"
            android:background="#f00"
            android:src="@drawable/icon" />
        <EditText
            android:id="@+id/text"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

(我用红色突出显示图像背景以查看ImageView分配的实际空间)


如果我指定ImageView的确切高度:

            android:layout_height="48dp"

然后我得到了我最需要的观点: enter image description here

但我不知道EditText的确切高度,因此我无法在ImageView指定它。


指定ImageView的高度以填充其父级(以匹配``EditText`高度):

            android:layout_height="fill_parent"

然后我在图像和文本输入之间得到意想不到的额外余量: enter image description here

实际上,在这种情况下,ImageView宽度等于未缩放图像宽度,而图像则缩放。


如果我将layout_height指定为48dp并将adjustViewBounds设置为false,则与下面显示的图片类似:

            android:layout_height="48dp"
            android:adjustViewBounds="false"

enter image description here


所以,这里的问题是:如何正确定义布局以缩放图像以匹配编辑条目高度,同时将ImageView的宽度缩小到缩放图像宽度?换句话说,如何摆脱这个额外的空间?

2 个答案:

答案 0 :(得分:7)

这是一个LinearLayout错误。如果您查看来源here中的forceUniformHeight。你可以看到,当LinearLayout设置为match_parent时,要处理提供wrap_content作为高度的子视图的大小,LinearLayout假装具有绝对高度,重新计算子高度,然后重用子宽度从上一次测量通过。基本上你的图像计算高度和宽度不受约束,并获得默认的宽度和高度,然后重新计算高度,但被迫使用旧的宽度。您需要提供一个高度或覆盖一些视图onMeasures

答案 1 :(得分:0)

你也可以将重力置于线性布局的中心

注意:你应该在drawables-hdpi / ldpi和mdpi中有不同的图像