2011-01-22 10 views
19

Staram się zmusić androida do przytępienia obrazu tła działania - do tej pory bez powodzenia. Nie mam zielonego pojęcia, co jest nie tak.android: dither = "true" nie dither, co jest nie tak?

To co zrobiłem:

Element główny mojego układu działalności jest LinearLayout:

<LinearLayout android:id="@+id/AbsoluteLayout01" 
android:layout_width="fill_parent" android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:gravity="center_horizontal" 
android:background="@drawable/background_dither"> 

gdzie dodałem @ odkształcalne/background_dither jako obraz tła. umieścić plik XML „background_dither.xml” w odkształcalne-hdpi o następującej treści:

<?xml version="1.0" encoding="utf-8"?> 
<bitmap 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/backimg" 
android:src="@drawable/background" 
android:dither="true" 
android:antialias="true" /> 

który odwołuje się do rzeczywistej background.png obrazu w rozciągliwej-hdpi. Obraz, który zawiera duży gradient kolorów, pokazuje się, ale z ciężkimi kolorami. Z tego, czego się dowiedziałem z zestawu SDK, można to złagodzić, stosując definicję obrazu serwera/powyżej i określając android: dither = "true". To jednak nie ma żadnego efektu.

Czego mi brakuje, aby dithering działał?

EDIT: dodane sources here

EDIT2: Po żaden z proponowanych metod pomógł pozbyć banding koloru, po przeczytaniu this blog post from Romain Guy miałem pomysł, aby sprawdzić, czy mój PNG tło ma kanał alfa. Tak nie było. Po dodaniu jeden, faktycznie wydaje się, że Android używa RGB8888, jak wspomniano w poście, a banding już nie istnieje (również dla 2.2). Wciąż zastanawiasz się, dlaczego inne metody nie działają.

EDIT3: Należy upewnić się, że PNG ma nie tylko kanał alfa, ale także co najmniej jeden piksel o wartości alpha! = FF, w przeciwnym razie narzędzia budujące Androida ponownie usuwają tę bitmapę do zindeksowanego paleta bez kanału alfa.

Odpowiedz

0

Wiele osób zgłaszających ten sam problem zgłosiło, że ustawienie setDither (true) w zasobie losowym w kodzie Java działa, gdy atrybut XML tego nie robi. W takim przypadku, jeśli możesz uzyskać odwołanie do LinearLayout w metodzie onCreate, spróbuj:

linearLayout.getBackground(). SetDither (true).

Alternatywą byłoby spróbować ustawić inny format piksela jak opisano tutaj:

http://stuffthathappens.com/blog/2010/06/04/android-color-banding/

Powodzenia!

+0

Dzięki. Wypróbowałem obie opcje. Żadna z nich nie zmienia renderowania, więc myślę, że to nadal nie działa. :-( – machtnix

3

spróbować umieścić tę linię

getWindow().setFormat(PixelFormat.RGBA_8888); 

tuż po super.onCreate() i sprawdzić, czy to pomaga.

+1

Dziękuję, ale przykro mi, nie, nie widzę żadnej różnicy. Przesłałem kod tutaj http://rapidshare.com/files/444144083/lottofee.zip Może ktoś zauważy ten problem – machtnix

+0

Bez różnicy :( –

23

Zrobiłem to także dzisiaj i znalazłem i użyłem twojego rozwiązania: Utwórz png w Photoshopie z zestawem przezroczystości ORAZ posiadającym co najmniej jeden piksel za pomocą alfy. W rzeczywistości ustawiłem warstwę na 99% nieprzezroczystości. Nie ma wpływu na kolory ani nic, i sprawi, że kompilator Androida opuści mój png sam.

+0

To jest odpowiednia odpowiedź. Dziękuję, bardzo mi to pomogło :) –

+0

To zadziałało dla mnie, dziękuję! –

+0

Dude, ty rock, dziękuję! – tokudu

0

W systemie Android 2.2.1 i poniżej występuje błąd powodujący wyłączenie ditheringu, jeśli włączone jest filtrowanie. W systemach Android 2.3.3 i 3.0 ten problem wydaje się być naprawiony.Nie jestem pewien, czy to samo może dotyczyć antialias, tak jak zostało włączone.

2

Też miałem te problemy, naprawiłem, stosując funkcję dziewięciu łatek do obrazu tła.

Nadzieję, że ta pomoc