2012-05-07 26 views
5

Dla ekranu powitalnego używam obrazu, który zawiera białe tło (czysto białe - zaznaczone w Photoshopie). Z jakiegoś powodu pokazuje nieznacznie zieloną bryłę w porównaniu z domyślną białą kreską aktywności zaznaczoną na zrzucie ekranu. Tylko w niektórych urządzeniach, jakObraz nie jest całkowicie biały, mimo że jest poprawnie biały

ImageView graphic shows now white background despite the image uses white

dodam to za jednym widoku w układzie ramki do aktywności:

<?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> 

jakiś pomysł? Czytałem o problemach RGB888 vs. RGB565, ale nie mogłem znaleźć odpowiedniego rozwiązania.

Uwaga: na pewno mogę zmienić kolor bieli na obrazie na przezroczysty, ale wolałbym zrozumieć problem i znaleźć odpowiednie rozwiązanie.

Odpowiedz

9

To naprawdę denerwujące. Zastanawiam się, dlaczego tak mało osób napotkało ten problem, ponieważ powinien pojawić się na wszystkich 32-bitowych wyświetlaczach.

Wspominałeś o formacie RGB888. Przyczyną problemu jest to, że niezależnie od oryginalnego formatu bitmapy w plikach APK wszystkie bitmapy są kompresowane (w moim przypadku w indeksowane 256-kolorowe! Wtf?).

Nie mogłem znaleźć sposobu, aby temu zapobiec, więc jeśli ktoś zna odpowiednie rozwiązanie, proszę powiedzieć.

Jednak znalazłem dwa rozwiązania problemu białego koloru.

1) Per-bitmap: Powiedzmy, że mamy drawowalny zasób mapy bitowej o nazwie @drawable/mypng, który powoduje problem. Musimy dodać dodatkowy XML rozciągliwej rozciągliwej/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" 
/> 

i używać @drawable/mypng_nofilter zamiast.

2) Dla całej działalności: W działalności onCreate metody musimy dodać

getWindow().setFormat(PixelFormat.RGB_565); 

Teraz okno ma 16-bitową głębię koloru i pojawiają się wszystkie bitmapy „właściwie” białe.

Ponownie, wolałbym mieć 32-bitową głębię kolorów, ale nie wiem, jak kontrolować kompilację kompilacji obrazu.

-1

Ponieważ obraz ma tylko obraz w jego środku, radzę Ci ustawić:

android:scaleType="centerCrop" 

To będzie przyciąć jakąś część swojego obrazu, na lewo i prawo, ale użyje cały ekran. ..

-1

można również zdefiniować tło do swojej FrameLayout lub swojej ImageView korzystając kolor swojego obrazu (co wydaje się być F8FCF8):

android: tło = "# F8FCF8"

+0

Jak wspomniano, używany obraz ma czyste tło #FFFFFF. Zielonkawe tło jest generowane, gdy Android dodaje obraz - wtedy jest widoczny na zrzucie ekranu. – Bachi

+0

Hum ... to dziwne. Nigdy tego nie widziałem. Więc może wypróbuj pierwsze rozwiązanie? –

+0

Brak opcji, nie można przyciąć, wypełniając dolną część (powyższy przykład jest wycinany w celu demonstracji). – Bachi

2

Mam rozwiązać ten problem poprzez zmianę rodzaju Bitmap.CompressFormat do PNG zamiast 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

I napotkał ten sam problem z siecią załadowany obrazów. Rozwiązałem problem przez wyłączenie filtra bitmapowego. Ponieważ nie mam problemu z ICS i nowszymi urządzeniami, wyłączyłem filtr bitmapowy tylko dla urządzeń poprzedzających ICS. Oto kod, którego użyłem (ustawienie mapy bitowej załadowanej do sieci do ImageView).

Powiązane problemy