我有Activity
我在ImageView中有背景图像,图像顶部有9个透明按钮。
http://i.stack.imgur.com/GGQqd.png
当我点按任何按钮时,我会在背景顶部显示RelativeLayout
。
http://i.stack.imgur.com/JvKQK.jpg
问题是:当我在布局中使用大分辨率图像作为背景时,性能非常差。
我使用 2048 x 1536 的 PNG 图片,它的重量约为500k。 当我使用较小的图像,如 1024 x 768 时,应用程序运行正常,但看起来很糟糕。
在不损失性能的情况下使用大图像是否有限制或方法?
答案 0 :(得分:10)
该位图巨大。你提到的500k是压缩大小。使用它们时,图像在内存中未压缩。你实际上看的是2048×1536×4 = 12582912 =超过12MB的内存使用。
如果您使用的是具有该屏幕分辨率的Nexus 9设备,那么您可以合理地假设它还具有内存,GPU和总线带宽来处理该大小的图像。但是,如果你使用的是分辨率较低的设备(大多数设备,请记住即使是全高清也只有65%),那么这个图像显然会浪费内存。您现在可以购买240x320的低端设备,全屏位图仅为图像大小的2.5%。
加载时,您必须缩放该图像。在加载图片之前,请使用BitmapFactory.Options
设置所需的尺寸。
此外,您将文本直接放在它上面。文本渲染需要Alpha透明度,这需要对底层图像进行采样。如果您可以将文本放在不透明的背景上并将其置于顶部,那么您也将节省一些GPU负载,但我实际上并不确定能够获得多少性能。这可能不是什么大不了的事。
答案 1 :(得分:1)
您可以使用Dave Morissey Subsampling Scale Image View代替标准图片视图。
XML布局:
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:id="@+id/photo"/>
</RelativeLayout>
在代码中设置图片并禁用触摸:
photo = (SubsamplingScaleImageView) view.findViewById(R.id.photo);
photo.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
photo.setImage(ImageSource.uri(Uri.fromFile(new File("/somepath/file.png"))));
的build.gradle:
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'