2015-07-21 24 views
7

Ho uno Activity in cui ho un'immagine di sfondo in un ImageView e nove pulsanti trasparenti nella parte superiore dell'immagine.Android: prestazioni lente con una grande immagine in ImageView

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

Quando si tocca uno dei pulsanti che fanno un RelativeLayout appare nella parte superiore dello sfondo.

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

Il problema è: Quando uso un'immagine di grande risoluzione come sfondo nel layout le prestazioni è molto povera.

che sto utilizzando un'immagine PNG di 2048 x 1536, ed è peso è di circa 500k. Quando uso un'immagine più piccola come 1024 x 768 l'applicazione funziona bene, ma sembra terribile.

Esiste una restrizione o un metodo per utilizzare le immagini grandi senza perdere prestazioni?

risposta

10

Quella bitmap è enorme. Il 500k che hai menzionato è la dimensione compressa. Le immagini non sono compresse in memoria quando le usi. In realtà stai guardando 2048 × 1536 × 4 = 12582912 = oltre 12 MB di memoria utilizzata.

Se sei su un dispositivo come Nexus 9 che ha quella risoluzione dello schermo, allora puoi ragionevolmente presumere che abbia anche la memoria, la GPU e la larghezza di banda del bus per gestire un'immagine di quelle dimensioni. Tuttavia, se si utilizza un dispositivo a bassa risoluzione (la maggior parte dei dispositivi è, tenere presente che anche Full HD è solo il 65% più grande), quindi questa immagine è fenomenale spreco di memoria. Oggi puoi acquistare dispositivi di fascia bassa con uno schermo 240x320, in cui una bitmap a schermo intero è solo il 2,5% delle dimensioni della tua immagine.

È necessario ridimensionare l'immagine quando la si carica. Utilizzare BitmapFactory.Options per impostare la dimensione desiderata prima di caricare l'immagine.

Inoltre, stai mettendo il testo direttamente sopra di esso. Il rendering del testo richiede la trasparenza alfa, che richiede il campionamento dell'immagine sottostante. Se riesci a mettere il testo su uno sfondo opaco e lo metti sopra, risparmierai anche qualche carico di GPU, ma in realtà non sono sicuro di quante prestazioni ti possano ottenere. Potrebbe non essere un grosso problema.

+0

Grazie per la risposta. Per esempio sto testando l'applicazione su un tablet ** 2560 x 1600 ** e lo sfondo non sembra molto buono se lo ridimensiono. Sto provando a usare 'BitmapFactory.Options' –

1

È possibile utilizzare Dave Morissey Subsampling Scale Image View come sostituzione della visualizzazione dell'immagine standard.

di layout XML:

<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:scaleType="fitXY" 
        android:id="@+id/photo"/> 
      </RelativeLayout> 

immagine Insieme nel codice e toccare disabilitazione:

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'