2015-07-21 53 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'