0

它有点难以解释,但无论如何我都会尝试。

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

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

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

所以,我在这里所做的是将 View 设置为最大尺寸,并按照 ImageView 通常的方式设置图像。之后,我让 ImageView 进行布局,然后获取它的高度,因为这就是我希望 View 拥有的最大高度。

然后我计算我需要应用的缩放比例。我缩放图像并将视图设置为 Wrap content,因为它应该将视图以前的高度作为边界。

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

我的意思是,图像似乎可以正确缩放(缩放 53 倍后的 imageHeight),但图像几乎占据了整个屏幕。我不明白为什么它可以在其他 2 台设备上运行,但在 Nexus 上运行。

有没有关于我不知道的 Android 4.3 的 ImageView 的新 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;
        }
    });
}

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

调整ImageView的大小

考虑蓝色的东西是 ImageView 的大小,黑色的矩形是图像的实际大小。蓝色大小是我得到的,如果我将 ImageView 的大小设置为宽度 = matchParent 和高度 = 0,重量为 0.5。这是我希望 ImageView 拥有的 MAX 高度。

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

但这对于图像也是可能的。2*width = height 在这种情况下,我不希望 ImageView 做任何事情。只需保持其最大高度并显示给定图像。

正如我在某些设备上所说的那样,GT-I9000 和 Amazon 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/>
4

1 回答 1

0

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

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

于 2014-01-08T18:11:25.833 回答