Android:在ImageView中使用大图导致性能缓慢

8

我有一个带有ImageView背景图片和九个透明按钮的Activity。

http://i.stack.imgur.com/GGQqd.png

当我点击任何一个按钮时,我会在背景的顶部显示一个RelativeLayout。

http://i.stack.imgur.com/JvKQK.jpg

问题是:当我在布局中使用大分辨率图片作为背景时,性能非常差。

我正在使用一张PNG图片,大小为2048 x 1536,文件大小约为500k。 当我使用像1024 x 768这样的较小图片时,应用程序运行良好,但看起来很糟糕。

是否有限制或方法可使用大图片而不失去性能?

2个回答

11

那个位图非常大。你提到的500k是压缩后的大小。当你使用它们时,图像在内存中是未经压缩的。实际上,你正在查看2048×1536×4 = 12582912 =超过12MB的内存使用量。

如果你在像Nexus 9这样具有该屏幕分辨率的设备上,那么你可以合理地假设它也具有处理此大小的图像所需的内存、GPU和总线带宽。然而,如果你在低分辨率设备上(大多数设备都是如此,请记住即使全高清分辨率也只有原图的65%),那么这张图片对内存的浪费是极其严重的。现今市面上购买的低端设备屏幕分辨率为240x320,全屏位图仅占你的图片大小的2.5%。

你需要在加载图像时对图像进行缩放。使用BitmapFactory.Options来设置所需的大小,然后再加载图像。

此外,你直接将文本放在它上面。文本渲染需要阿尔法透明度,这需要对底层图像进行采样。如果你可以将文本放在不透明的背景上并将其放在顶部,那么你也可以节省一些GPU负载,但我实际上不确定这将为你带来多少性能提升。这可能并不是一个大问题。


谢谢你的回答。例如,我正在一个 2560 x 1600 的平板上测试应用程序,如果我将其缩小,背景看起来不太好。我正在尝试使用 BitmapFactory.Options - Diego Alejandro Ossa

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:

编译 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'

(翻译:compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接