layout_height应该是layout_width的函数

时间:2012-11-09 20:44:22

标签: android layout android-imageview

假设是肖像模式,我有一个ImageView,其图像的大小可变(但总是方形)。我希望ImageView的宽度始终等于布局的宽度(fill_parent),你可以看到scaleType是“centerCrop”,它将进行缩放。

问题在于,如果我将* layout_height *设置为“fill_parent”,那么,如果centerCrop保留原始宽高比,则高度优先,并且图像在左侧和右侧被裁剪。 (这当然假设屏幕比它宽)。但是,如果我将layout_height设置为“wrap_content”,则不再缩放高度,我最终得到一个裁剪的矩形。这样做是因为它尊重图像的原始高度。

是否有layout_height设置优先于layout_width为“fill_parent”?

<ImageView
    android:id="@+id/iv_image"
    android:layout_width="fill_parent"
    android:layout_height="?"
    android:layout_below="@id/header"
    android:layout_centerHorizontal="true"
    android:contentDescription="@string/cd_image"
    android:padding="0dp"
    android:scaleType="centerCrop"
    android:src="@drawable/blank_album" />

删除android:layout_height属性会导致崩溃: java.lang.RuntimeException:二进制XML文件行#16:您必须提供layout_height属性。

设置android:layout_height =“0dp”会垂直压缩图像。

答案:结合其他用户的回复,我找到了一个适合我的简单解决方案。

首先,图像视图具有此配置(请注意 fitStart ):

<ImageView
    android:id="@+id/iv_album"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@id/header"
    android:layout_gravity="top"
    android:background="#FF00FF00"
    android:contentDescription="@string/app_name"
    android:padding="0dp"
    android:scaleType="fitStart"
    android:src="@drawable/blank_album" />

然后以编程方式对图像高度进行小幅修改以匹配宽度(在Activity.onResume()内)

        ImageView iv = (ImageView)findViewById(R.id.iv_album);
        boolean bPost = iv.post(
                new Runnable()
                {
                    public void run()
                    {
                        ImageView iv = (ImageView)findViewById(R.id.iv_album);
                        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)iv.getLayoutParams();
                        params.width = ASong.this.findViewById(R.id.song_view_layout_top).getWidth();
                        params.height = params.width;                           
                        iv.setLayoutParams(params);
                    }
                });

        if (bPost == false)
        {
            throw new RuntimeException("runnable not posted");
        }

2 个答案:

答案 0 :(得分:2)

昨天我不得不处理这个问题。这是解决我问题的XML:

<ImageView
                android:id="@+id/character"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_alignParentBottom="true"
                android:background="@android:color/transparent"
                android:scaleType="fitCenter"
                android:src="@drawable/ma_un1_001" />

请参阅此处的主题:Center drawable and scale height

简而言之:

android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitCenter"

答案 1 :(得分:2)

或者,您可以通过编程方式执行此操作:

使用LinearLayout

环绕ImageView
<LinearLayout
android:id="@+id/container"
android:layout_below="@id/header"
android:layout_centerHorizontal="true"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
    <ImageView
    android:id="@+id/iv_image"
    android:layout_width="fill_parent"
    android:layout_height="?"
    android:contentDescription="@string/cd_image"
    android:padding="0dp"
    android:scaleType="centerCrop"
    android:src="@drawable/blank_album" />
</LinearLayout>

然后,在你的onCreate()中插入

findViewById(R.id.container).post(
    new Runnable() {
    public void run() {
        LinearLayout container = (LinearLayout)findViewById(R.id.container);
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)container.getLayoutParams();
        params.height = params.width;
        container.setLayoutParams(params);
    }}
);

代码必须是post(),因为主进程不能直接修改布局结构。