Android:在ImageView中使用大图像时性能下降

时间:2015-07-21 18:14:45

标签: android image performance imageview relativelayout

我有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 时,应用程序运行正常,但看起来很糟糕。

在不损失性能的情况下使用大图像是否有限制或方法?

2 个答案:

答案 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'