我正在使用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中,我以编程方式创建了一个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);