2015-07-21 58 views
7

我有一个Activity,我在ImageView中有一个背景图像,在图像顶部有9个透明按钮。Android:在ImageView中使用较大图像的性能较差

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

当我点击任何按钮,我做一个RelativeLayout出现在背景的顶部。

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

的问题是:当我用大分辨率的图像作为布局的表现是非常差的背景。

我使用的2048×1536一个PNG图像,并且它的重量大概是500K。 当我使用较小的图像,如1024 x 768该应用程序工作正常,但它看起来很糟糕。

是否有限制或使用大图像而不会丢失性能的方法?

回答

10

该位图是巨大。你提到的500k是压缩的大小。使用它们时,图像在内存中未压缩。实际上你正在寻找2048×1536×4 = 12582912 =超过12MB的内存使用量。

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

您将不得不在缩放图像时加载它。在加载图像之前,使用BitmapFactory.Options设置所需的大小。

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

+0

感谢您的回答。例如,我正在测试** 2560 x 1600 **平板电脑上的应用程序,如果我缩小它的话,背景看起来不太好。 我想使用'BitmapFactory.Options' –

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'