2013-01-10 10 views
7

Sto usando un viewpager per scorrere tra i frammenti nella mia app. Definisco lo sfondo nell'XML, quindiL'immagine di sfondo Android rallenta l'app

android:background="@drawable/bg_final" 

Se utilizzo un colore di sfondo semplice, la mia app funziona in modo molto fluido. Se lo uso con questa immagine di sfondo, l'fps diminuisce e la mia app diventa solo passabile. Non è lento, solo non così liscio, tuttavia su dispositivi più deboli potrebbe funzionare in scia. È un cattivo modo di applicare un'immagine di sfondo? L'immagine intera è una png 480x800 con una dimensione di 14.7kB. Quale potrebbe essere il problema?

(il profilo dei frammenti sono trasparenti, il viewpager è in una main.xml che ha il suo fondo con questa immagine)

+0

Potrebbe caricare l'immagine di sfondo? Se sono sfumature di nero, puoi rimuoverli usando photoshop e aggiungerlo manualmente sul tuo file xml. O qualsiasi altro colore ripetitivo per quella materia. –

risposta

1

La ragione di questo potrebbe essere che l'immagine viene allungato, e Android ha prestazioni problemi con lo stretching delle immagini di sfondo.

Invece, è necessario sostituire l'immagine di sfondo con un colore di sfondo o see this answer per ripetere l'immagine anziché allungarla.

9

Ci sono molte risposte là fuori che puntano al pre-ridimensionamento della bitmap. Questo è molto importante e dovresti farlo se puoi, tuttavia dopo aver provato diverse cose, il maggior guadagno di prestazioni che ho avuto è stato creare una vista e sovrascrivere il metodo onDraw.

La classe potrebbe essere semplice come questo:

public class DTImageView extends View { 

    public Bitmap imageBitmap; 

    public DTImageView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     if(imageBitmap != null) 
      canvas.drawBitmap(imageBitmap, 0, 0, null); 
    } 
} 

Richiamare il codice utilizzando una bitmap prescalato:

DTImageView bgImageView = new DTImageView(context); 
bgImageView.imageBitmap = Bitmap.createScaledBitmap(bitmap,width,height,true); 

A questo punto è possibile aggiungere questa vista per la gerarchia della vista a cui appartiene . Nel mio caso, la mia gerarchia di vista aveva una bgImage, una via di mezzo in cui si verificavano tutte le altre funzionalità e fgImage.

Usa lo strumento sdk di Android Hierarchy Viewer per profilare l'app e vedere quanto velocemente ogni vista sta prendendo il disegno. La mia app ha speso 30-40 ms per disegnare bgImage e fgImage. Il pre-ridimensionamento e l'override diDraw hanno ridotto da 30 a 40 ms a circa 1,5 ms.

Ecco uno screenshot della performance Draw per uno dei miei punti di vista, prima e dopo:

PRIMA: Using setImageBitmap instead of overriding onDraw.

DOPO: Using the above DTImageView which simply overrides OnDraw

1

Ho avuto lo stesso problema e l'ho risolto utilizzando questo metodo:

Aggiungi la tua immagine alla cartella mipmap che si trova sotto la directory res. Aggiungerà l'immagine in base alla sua densità.

6

Sono un po 'in ritardo, ma questo mi ha solo morso, e quando ho eseguito il debugger della GPU, ho notato che il sistema ingrandiva la mia immagine! Avevo un'immagine 1920x1080 e si presentava come una trama 3780x6720!

Idealmente, si dovrebbero avere trame per ogni densità nella rispettiva cartella (res/drawable-mdpi, res/drawable-hdpi, ecc.).

Tuttavia, se pensate che il vostro una tessitura è fine, metterlo in res/drawable-nodpi, nonres/drawable. Se lo inserisci in res/drawable-nodpi, il sistema non lo scalerà in base al dpi.

Nel mio caso, è stata modificata una semplice interfaccia utente da 10 fps su un pixel XL fino alla frequenza fotogrammi massima di 60 fps.

3

Avevo un'immagine di sfondo, non di grandi dimensioni, ma con dimensioni strane, quindi l'allungamento e le cattive prestazioni. Ho creato un metodo con parametri Context, una vista e un ID drawable (int) che corrisponderà alle dimensioni dello schermo del dispositivo. Utilizzalo, ad esempio, su Fragments onCreateView per impostare lo sfondo.

public void setBackground(Context context, View view, int drawableId){ 
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableId); 
    int width = Resources.getSystem().getDisplayMetrics().widthPixels; 
    int height = Resources.getSystem().getDisplayMetrics().heightPixels; 
    bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true); 
    BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), bitmap); 
    view.setBackground(bitmapDrawable); 
} 
+0

Questo ha funzionato bene per me! –

0

Crea aggiungere una sola immagine di sfondo con dimensioni 1080x1920 e metterlo nella cartella drawable-nodpi e che risolto questo problema