8

Poiché il costruttore senza parametri BitmapDrawable è deprecato, è necessario fornire l'ID risorsa al costruttore.Cosa sono le "risorse" nel costruttore di BitmapDrawable?

BitmapDrawable bitmapDrawable = new BitmapDrawable(res, bmap); 

Dove res è generalmente getResources().

Perché il costruttore ha bisogno di esso e come possiamo definire tale valore se stiamo usando una cache di immagini generale?

+0

per quanto ho capito dall'API: "Vedi anche la classe Bitmap, che gestisce la gestione e la trasformazione della grafica bitmap grezza, e dovrebbe essere usata quando si disegna su un Canvas.", Dovresti usare Bitmap invece di BitmapDrawable se Hai un'immagine non definita in Risorse. – Opiatefuchs

+0

Sembra che anche "setImageBitmap" usi internamente "BitmapDrawable". ('ImageView.class') – frankish

risposta

3

In questo costruttore, getResources() è necessario "per impostare la densità di destinazione iniziale in base alle metriche di visualizzazione della risorsa". Lo capisco in questo modo: prendi le metriche del display, che contengono informazioni su dimensioni, densità, ridimensionamento dei caratteri e passa queste informazioni al costruttore. Probabilmente se nella tua immagine della cartella res/ sono disponibili dimensioni diverse, in sub-cartelle appropriate, ad esempio drawable-ldpi, drawable-hdpi, otterrai informazioni diverse.

Per utilizzarlo nella cache delle immagini, è necessario passare un contesto ad esso, e quindi richiamare in questo modo: Context ctx; ctx.getResources(); Speranza che aiuta.

+1

Grazie per il vostro tempo. Ma ho impostato una bitmap personalizzata che non si trova all'interno di res/folder? – frankish

4

Perché il costruttore ne ha bisogno?

Dalla documentazione di BitmapDrawable(Resources res, Bitmap bitmap):

Creare drawable da una bitmap, impostare la densità target iniziale in base alle metriche di visualizzazione delle risorse.

Quindi, ciò che è necessario al fine di impostare una densità obiettivo iniziale utilizzando le metriche di visualizzazione, e la DisplayMetrics sarebbe prelevato dalla Resources che si sta fornendo come parametro per BitmapDrawable.

Come possiamo definire tale valore se si utilizza una cache di immagini generale?

Siamo spiacenti, non è possibile capire la domanda. Puoi riformulare?

Se ho già scalato il Bitmap me stesso, perché non BitmapDrawable bisogno di risorse?

Come può BitmapDrawable sapere, che avete già scalato il Bitmap? Normalmente, se stai creando un BitmapDrawable, non dovresti occuparti di ridimensionarlo da solo, ecco perché l'API è progettata in questo modo.

Sembra che l'unico modo per evitare il ridimensionamento quando si converte un Bitmap ad un Drawable è quello di utilizzare il costruttore deprecato?

Sebbene suoni male, ma puoi vedere come le classi del framework di transizione usano quel costruttore, ad es. ChangeBounds, Crossfade.

ho scavato fonti un po 'e ho trovato questo pezzo di codice in Bitmap classe:

static public int scaleFromDensity(int size, int sdensity, int tdensity) { 
    if (sdensity == DENSITY_NONE || tdensity == DENSITY_NONE || sdensity == tdensity) { 
     return size; 
    } 

    // Scale by tdensity/sdensity, rounding up. 
    return ((size * tdensity) + (sdensity >> 1))/sdensity; 
} 

Questo viene chiamato in seguito a catena:

* BitmapDrawable#constructor 
* BitmapDrawable#updateLocalState() 
* BitmapDrawable#computeBitmapSize() 
* Bitmap#getScaledWidth() 
* scaleFromDensity(getWidth(), mDensity, targetDensity) 

Che cosa succede se si imposta in modo esplicito la densità del tuo Bitmap a DENSITY_NONE? Quindi il controllo if verrà valutato su true e non verrà eseguito alcun ridimensionamento.

Bitmap bitmap = ... 
bitmap.setDensity(Bitmap.DENSITY_NONE); 

Non hanno testato, solo facendo ipotesi basate su fonti.

+0

Grazie per questa informazione. Ho completamente perso il fatto che le bitmap hanno una proprietà di densità. GetDensity per un bitmap per impostazione predefinita "è la stessa densità del display corrente" https://developer.android.com/reference/android/graphics/Bitmap.html#getDensity() in modo che non venga eseguito alcun ridimensionamento sul BitmapDrawable a meno che non si imposti esplicitamente una densità su Bitmap. Questo ha senso per me ora! –

0

Per quanto riguarda Costruttore deprecato e nuovo costruttore

BitmapDrawable(Resources res) /* deprecated constructor */ 

BitmapDrawable(android.content.res.Resources, android.graphics.Bitmap) /* new constructor they introduced to replace above deprecated constructor */ 

Il costruttore deprecato crea un disegnabile vuoto, non si tratta di densità. Tuttavia, il nuovo costruttore crea drawable da una bitmap, impostando la densità di destinazione iniziale in base alle metriche di visualizzazione delle risorse. L'utilizzo del nuovo costruttore ti dà tutta la potenza che puoi avere con Bitmap (classe finale).

Cosa succede se non si passa la variabile Bitmap tramite costruttore? Quando si passa una variabile dal parametro, non è necessario creare una nuova variabile bitmap lì dove si è passati. Hai creato un'altra variabile che fa riferimento (riferimento statico) alla tua Bitmap. Poiché i bitmap sono file di grandi dimensioni, quando si passa il riferimento si risparmia molto spazio e potenza di elaborazione che è necessario utilizzare per caricare bitmap all'interno di ImageView. quindi ti aiuta a non ottenere OutOfMemory Exception.

Es,

public void passA(String); /* method signature*/ 
String s = "dfsfsdf"; 
passA(s); /* method calling */ 

Un altro lato:

public void passA(String newVar) { 
    /* newVar simply points (references) to the memory of "dfsfsdf". */ 
    /* passing references */ /* for Bitmap creating new copy is expensive 
    operations */ 
/*Note: Java does manipulate objects by reference, and all object variables are references */ 
} 

Un'altra idea passavano variabile bitmap (android.graphics.Bitmap) perché bitmap è Parcelable (se implementa Parcelable). Gli oggetti parcelable possono essere contenuti in bundle. E i bundle sono le cose fondamentali per IPCS (comunicazione tra processi) e comunicazione tramite vari componenti Android).

Per quanto riguarda il generale cache immagine si imposta tutto il necessario densità e altre cose dalla Bitmap approvato una variabile tramite nuovo costruttore. Quindi è possibile creare una HashMap nella cache Least Recently Used (Lru) in cui si definisce la stringa key per indicare Bitmap variable configurato. Ad esempio, LruCache. Ora, nella Cache meno recente del tuo processore, hai configurato Bitmap. Ciò consente di risparmiare molta potenza di elaborazione.

https://developer.android.com/reference/android/util/LruCache.html

speranza, la mia risposta ti aiuta!

Problemi correlati