Android ImageView - 填充宽度和调整大小以保持宽高比

时间:2013-01-03 04:58:29

标签: java android resize imageview aspect-ratio

我在View中使用了一行ListView

RowView由左侧的ImageView和水平TextView右侧的LinearLayout组成,其中图片占据了40%的空间,留下剩余的60%。

我希望布局能够以下列方式处理ImageView中图像的大小调整:

  1. 水平拉伸图像,使其填满LinearLayout
  2. 的40%
  3. 垂直调整ImageView以保持原始宽高比
  4. 这是我对布局的方法:

    protected class RowView extends LinearLayout {
    public ImageView iv = null;
    public TextView tv = null;
    
    private LinearLayout.LayoutParams ivlp = null;
    private LinearLayout.LayoutParams tvlp = null;
    
    public RowView(Context ct) {
        super(ct);
    
        setOrientation(LinearLayout.HORIZONTAL);
    
        // Create the views
        iv = new ImageView(ct);
        ivlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 0.4f);
        iv.setLayoutParams(ivlp);
        iv.setAdjustViewBounds(true);
        iv.setScaleType(ScaleType.FIT_XY);
    
        tv = new TextView(ct);
        tvlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 0.4f);
        tv.setLayoutParams(tvlp);
        tv.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
    
        // Add the views
        addView(iv);
        addView(tv);
    }
    

    }

    我得到的结果是这样的:

    enter image description here

    据我所知:

    • MATCH_PARENT正确地强制图像水平拉伸以填充40%的空间
    • ImageView.setAdjustViewBounds(true)应该允许调整ImageView的大小,这是我想要的。问题是ImageView.ScaleType似乎没有做我想要的事情
    • ImageView.ScaleType(ScaleType.FIT_XY)不是我想要的,因为它没有保持宽高比。但所有其他人,似乎没有伸展ImageView的高度(这使得ImageView.setAdjustViewBounds(true)几乎无用)。

    我做错了什么?这个简单的事情如此困难似乎是错的?

    或者我是否真的必须努力扩展ImageView和覆盖onMeasure以强制调整大小和宽高比?

    或者Matrix有一个聪明的伎俩来完成工作吗?

2 个答案:

答案 0 :(得分:3)

我相信这就是你要找的东西:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/myImage"
    android:scaleType="fitCenter"
    android:adjustViewBounds="true" />

答案 1 :(得分:0)

完全删除比例类型。另外,我认为你可能误解了setAdjustViewBounds的作用。如果缩放图像,则缩放ImageView中的位图,但不缩放ImageView。将setAdjustViewBounds设置为true将确保ImageView的边界始终与绘制的位图边界匹配。