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

Android: Slow performance using a big image in ImageView

我有一个 Activity,我在 ImageView 中有一个背景图像,图像顶部有九个透明按钮。

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

当我点击任何按钮时,背景顶部会出现 RelativeLayout

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

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

我正在使用 PNG 图片 2048 x 1536,它的重量大约是500k。 当我使用像 1024 x 768 这样的较小图像时,应用程序工作正常,但看起来很糟糕。

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

那个位图很大。您提到的 500k 是压缩后的大小。使用图像时,图像在内存中未压缩。您实际看到的是 2048×1536×4 = 12582912 = 超过 12MB 的内存使用量。

如果您使用的是像 Nexus 9 这样具有该屏幕分辨率的设备,那么您可以合理地假设它也有内存、GPU 和总线带宽来处理该尺寸的图像。但是,如果您使用的是分辨率较低的设备(大多数设备都是,请记住,即使全高清也只有 65% 大),那么此图像会非常浪费内存。您现在可以购买 240x320 屏幕的低端设备,其中全屏位图仅为图像大小的 2.5%。

您将不得不在加载该图像时对其进行缩放。在加载图像之前使用 BitmapFactory.Options 设置所需的大小。

此外,您将文本直接放在它上面。文本渲染需要 alpha 透明度,这需要对底层图像进行采样。如果您可以将文本放在不透明的背景上并将其放在最上面,您也会节省一些 GPU 负载,但实际上我不确定这会给您带来多少性能。这可能没什么大不了的。

您可以使用 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'