2012-05-07 12 views
5

Per uno splashscreen utilizzo un'immagine che contiene uno sfondo bianco (bianco puro - selezionata in Photoshop). Per qualche ragione mostra una leggera bg verde rispetto alla bg bianca predefinita dell'attività, come indicato nello screenshot. Solo in alcuni dispositivi, come ilL'immagine non è completamente bianca nonostante sia correttamente bianca

ImageView graphic shows now white background despite the image uses white

aggiungo questo come un'unica vista in un layout cornice all'attività:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

<ImageView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:scaleType="fitCenter" 
    android:src="@drawable/splashscreen" /> 

</FrameLayout> 

Qualche idea? Ho letto dei problemi RGB888 rispetto a RGB565, ma non sono riuscito a trovare una soluzione adeguata.

Nota: sono sicuro che potrebbe rendere il bianco dell'immagine trasparente, ma preferirei capire il problema e trovare una soluzione adeguata.

risposta

9

Questo è davvero fastidioso. Mi chiedo, perché così poche persone hanno riscontrato questo problema come dovrebbe apparire su tutti i display a 32 bit.

Hai menzionato correttamente il formato RGB888. La causa del problema è che, indipendentemente dal formato bitmap originale nei file APK, tutti i bitmap vengono compressi (nel mio caso in 256-color indicizzati! Wtf?).

Non sono riuscito a trovare il modo di impedirlo, quindi se qualcuno conosce la soluzione adeguata, si prega di dire.

Tuttavia, ho trovato due soluzioni per il problema del colore bianco.

1) Per bitmap: Dire, abbiamo una risorsa bitmap drawable denominata @drawable/mypng, che causa il problema. Abbiamo bisogno di aggiungere un ulteriore XML drawable drawable/mypng_nofilter.xml

<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/mypng" 
    android:filter="false" 
/> 

e utilizzare @drawable/mypng_nofilter invece.

2) Per tutta l'attività: Nell'attività onCreate metodo che abbiamo bisogno di aggiungere

getWindow().setFormat(PixelFormat.RGB_565); 

Ora che la finestra è profondità di colore a 16 bit e tutte le bitmap appaiono "correttamente" bianco.

Ancora una volta, preferirei avere una profondità di colore a 32 bit, ma non so come controllare la compressione dell'immagine in fase di compilazione.

-1

Come l'immagine ha solo un'immagine nel suo mezzo, vi consiglio di impostare:

android:scaleType="centerCrop" 

Sarà ritagliare una parte della foto, a destra ea sinistra, ma userò l'intero schermo. ..

-1

È anche possibile definire uno sfondo per il vostro o la vostra FrameLayout ImageView utilizzando il colore della vostra immagine (che sembra essere F8FCF8):

android: background = "# F8FCF8"

+0

Come accennato, l'immagine utilizzata ha uno sfondo #FFFFFF puro. Lo sfondo verdastro viene generato quando Android aggiunge l'immagine, quindi è visibile sullo screenshot. – Bachi

+0

Hum ... è strano. Non l'ho mai visto. Allora forse prova la prima soluzione? –

+0

Non un'opzione, non è possibile ritagliare mentre riempie la parte inferiore (l'esempio sopra è tagliato per dimostrazione). – Bachi

2

ho risolto questo problema modificando il tipo Bitmap.CompressFormat a PNG anziché JPEG:

Resources res = getResources(); 
Drawable drawable = res.getDrawable(R.drawable.nouv); 
Bitmap bitmap = (Bitmap)((BitmapDrawable) drawable).getBitmap(); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
0

ho incontrato lo stesso problema con le immagini di rete caricato. Ho risolto il problema disabilitando il filtro bitmap. Poiché non ho il problema su ICS e sui dispositivi più recenti, ho disattivato il filtro bitmap solo per i dispositivi pre-ICS. Di seguito è riportato il codice che ho utilizzato (impostazione bitmap caricata di rete per ImageView.)

BitmapDrawable bitmapDrawable = new BitmapDrawable(imageView.getContext().getResources(), bitmap); 
bitmapDrawable.setFilterBitmap(false); 
imageView.setImageDrawable(bitmapDrawable);