我正在使用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%垂直)。
查看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]}
这是Android 4.2.2中的ImageView
中的错误,修正于4.3。 现在的问题是,如何在4.2.2中添加此修复程序?覆盖ImageView.onMeasure()
并非100%无关紧要,因为正在调用许多私有函数。
答案 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);