调整ImageView的大小以适合图像

时间:2013-10-14 10:23:30

标签: android imageview autoscaling

它有点难以解释,但不管怎么说都试试。

我在ImageView中显示图像,imageview设置为使用权重属性的ScreenHeight的50%。

现在,如果ImageAspectRatio不适合ImageView的比率,我在ImageView的底部和顶部有一个空白区域。

基本上我希望我的ImageView的maxSize是ScreenHeight的50%,但如果其中的图像不使用其全高,或者至少移动到ImageView的顶部,则缩小高度。

所以,我在这里做的是将视图设置为最大尺寸,然后按照ImageView的方式设置图像。之后,我将ImageView布局,然后获得它的高度,因为这是我希望视图具有的最大高度。

然后我计算我需要申请的Scaling。我缩放图像并将视图设置为包装内容,因为它应该将视图的前一个高度作为边界。

现在,这在运行CyagenoMod(Android 4.2.2)的三星GT-I9000上运行良好,也在Kindle HD上尝试过这种方法。但是当在Nexus 4(运行android 4.3)上做同样的事情时,似乎忽略了我所做的一切。

我的意思是,图像看起来可以正确缩放(缩放像53x之后的imageHeight),但图像几乎占据整个屏幕。我不明白为什么它可以在其他2台设备上工作,但在Nexus上。

是否有任何关于ImageView for Android 4.3的新API我不知道?

@Override
public void setImageResource(final int resId) {
    //      this.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 0.5f));
    super.setImageResource(resId);

    getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {

        @Override
        public boolean onPreDraw() {
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId);

            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            int boundingY = getHeight();
            int boundingX = getWidth();

            float xScale = ((float) boundingX) / width;
            float yScale = ((float) boundingY) / height;

            float scale = (xScale <= yScale) ? xScale : yScale;

            Matrix matrix = new Matrix();
            matrix.postScale(scale, scale);

            Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);

            MyImageView.this.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT ));

            MyImageView.super.setImageBitmap(scaledBitmap);

            getViewTreeObserver().removeOnPreDrawListener(this);
            return true;
        }
    });
}

好的,这是我试图做/做的事情的图片。

resizingImageView

考虑ImageView大小的蓝色东西,以及黑色矩形,图像的实际大小。如果我将ImageView的大小设置为width = matchParent而height = 0且权重为0.5,则蓝色大小是我得到的。这是我希望我的ImageView具有的MAX高度。

现在,Image可能具有宽度&gt; = ImageView的宽度。在这种情况下,我想调整高度,以适应图像的高度,所以我调整图像的大小,在这些边界内找到并将图像设置为WrapContent,因为图像是我希望视图的确切大小。

但这也适用于Image。 2 *宽度=高度 在那种情况下,我不希望ImageView做任何事情。只需保持其最大高度并显示给定图像。

正如我在某些设备上已经说过的那样,GT-I9000和亚马逊Kindle HD,但在Nexus 4上,高度比宽度大得多的图像往往会占据整个屏幕。

我调试了这个并检索了ImageViewHeight和BitmapHeight。两者都声称Image和ImageView的高度为534 PX。

我真的不明白为什么我在其他2台设备上工作,但没有在nexus上工作。

<include layout="@layout/own_action_bar" />

<*.view.MyImageView
    android:id="@+id/drawFragment_iv"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="0.5"
    android:adjustViewBounds="true"
    android:contentDescription="@string/hello" />

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="0.5" >
something in here
<RelativeLayout/>
<LinearLayout/>

1 个答案:

答案 0 :(得分:0)

在ImageView对象上调用setBackgroundResource而不是setImageResource,它会缩放图像以适合ImageView。

虽然这不是一种有效的方法,但是如果没有很多这样的ImageView,这应该可以解决这个问题。