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

我正在使用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>

在此Horizo​​ntalScrollView中,我以编程方式创建了一个500×1000像素左右的位图.因此,图像将被拉伸以填充大约1200×2400(请参见centerCrop).因此,ImageView的宽度应为2400.在我的Nexus 7上,三星S3 Mini和其他一些低密度设备.但不是在我的Nexus 4上!在Nexus 4上,确实确实将其高度拉长了,但宽度却没有拉长(是的,令人难以置信):1000×1000像素.我已经尝试过getWidth()和getMeasuredWidth().当我尝试滚动时,我只能水平看到50%的图像(但垂直只能看到100%).

更新1:

查看我的ImageView的mDrawMatrix,我可以看到它有所不同:

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.onMeasure()中的错误,已在4.3中修复.现在的问题是,如何在4.2.2中添加此修复程序?覆盖onMeasure()并不是100%琐碎的,因为调用了许多私有函数.

解决方法:

我在Samsung Galaxy S4 4.2.2和S3 4.1.1上遇到了相同的问题,无论我做什么,以编程方式设置的位图都无法缩放以填充其父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);
上一篇:Java 一个字符串在另外一个字符串出现次数


下一篇:android-将ImageView完全放在VideoView上