在Nexus 4上错误缩放ImageView宽度?

时间:2013-08-23 15:09:56

标签: android imageview horizontalscrollview nexus-4

我正在使用here描述的技术。以下行适用于所有我的设备,但Nexus 4除外:

int imageWidth = horizontalScrollView.getChildAt(0).getMeasuredWidth();

布局很简单:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <HorizontalScrollView
        android:id="@+id/main_scroller"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ImageView
            android:id="@+id/main_image"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop" />
    </HorizontalScrollView>
</RelativeLayout>

进入此HorizontalScrollView我以编程方式创建一个大约500x1000像素的位图。因此,图像将被拉伸以填充大致 1200x2400(参见centerCrop)。 因此,ImageView的宽度应为2400。它就是!在我的Nexus 7,三星S3 Mini和其他一些低密度设备上。但不是我的Nexus 4!在Nexus 4上,它确实有高度拉伸而不是宽度(是的,难以置信):1000x1000像素。我已经尝试了getWidth()getMeasuredWidth()。当我尝试滚动它时,我只能看到50%的图像水平(但100%垂直)。

更新1:

查看mDrawMatrix的{​​{1}},我发现它有所不同:

Nexus 7: 矩阵{[2.2979167,0.0,0.0] [0.0,2.2979167,0.0] [0.0,0.0,1.0]}

Nexus 4: 矩阵{[2.1458333,0.0, -623.0 ] [0.0,2.1458333,0.0] [0.0,0.0,1.0]}

更新2:

这是Android 4.2.2中的ImageView中的错误,修正于4.3。 现在的问题是,如何在4.2.2中添加此修复程序?覆盖ImageView.onMeasure()并非100%无关紧要,因为正在调用许多私有函数。

1 个答案:

答案 0 :(得分:3)

我在Samsung Galaxy S4 4.2.2和S3 4.1.1上遇到了同样的问题,无论我做了什么,编程设置的Bitmap都不会扩展以填充它的父ViewGroup的宽度。我尝试了scaleType的所有组合都无济于事。

对我来说,解决方法是在显示之前将位图上的密度设置为特定值。

        Bitmap myBitmap = ... 

        // S3 and S4 get confused about displaying bitmaps without a specific density,
        // and fail to scale them properly. Setting the density to this value helps (is possible ANY density helps, but haven't tested this)
        myBitmap.setDensity(DisplayMetrics.DENSITY_HIGH);

        myImageView.setImageBitmap(myBitmap);