如何在保持纵横比的同时使图像尽可能大

时间:2011-09-20 14:19:33

标签: android android-layout imageview

我的图像比我希望它适合的容器小。我希望图像能够拉伸,保持其纵横比,使其达到最大可能尺寸。

为了说明这个问题:

<ImageView  android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/thumbnail"
            android:scaleType="fitXY"
            android:adjustViewBounds="true"/>

上面的ImageView将被拉伸以填充容器的宽度。它所包含的@drawable也会沿x轴伸展,以适合ImageView的宽度,这是完美的。然而,问题是标记为wrap_content的维度(在这种情况下为高度)与@drawable的初始高度保持相同的大小。

我已阅读有关ScaleType here的文档,但无法在那里找到答案。

下图描述了上述代码:

enter image description here enter image description here

  Current behaviour               Desired Behaviour

修改

给定ImageView的{​​{1}}会准确地扩展/缩小其内部的scaleType="fitCenter"以尽可能大地增长,同时保持其宽高比。

@drawable尺寸是在ImageView以任何方式缩放之前定义的。 @drawable尺寸不受缩放包含ImageView的影响。

2 个答案:

答案 0 :(得分:7)

<强> XML

XML中唯一的解决方案是尽可能使用"match_parent"或离散最大值而不是"wrap_content"。这将确保ImageView的大小正确,这意味着添加scaleType="fitCenter"将确保@drawable将正确缩放。

<强>编程方式

这很难看,但是你可以在给尺寸给出离散值后调整ImageView的大小:

    final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail);  

    ViewTreeObserver thumbnailViewVto = thumbnailView.getViewTreeObserver();
    thumbnailViewVto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        private boolean changed = false;
        @Override
        public void onGlobalLayout() {
            if(!changed) {
                Drawable image = getResources().getDrawable(R.drawable.thumbnail);
                float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight();
                int height = thumbnailView.getHeight();

                thumbnailView.setLayoutParams(
                        new LayoutParams(
                                (int) (height * heighToWidthRatio), height));
                changed = true;
            }
        }
    });

修改

    final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail);  

    thumbnailView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            // Remove the GlobalOnLayout Listener so it only fires once.
            thumbnailView.getViewTreeObserver().removeGlobalOnLayoutListener(this)

            // Find the images Height to Width ratio
            Drawable image = getResources().getDrawable(R.drawable.thumbnail);
            float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight();

            // Use this ratio to discover the ratio of the ImageView to allow it to perfectly contain the image.
            int height = thumbnailView.getHeight();
            thumbnailView.setLayoutParams(new LayoutParams(
                                (int) (height * heighToWidthRatio), height));
        }
    });

答案 1 :(得分:1)

看起来你想要fitCenter,它使用 Matrix.ScaleToFit CENTER