Więc próbowałem kodu z tutaj: Creating an ImageView with a mask. Używam następujących obrazów jak oryginalne i maski:Android jak zastosować maskę na ImageView?
Jednak wynik otrzymuję to:
Zauważ, że okno nie jest czarne tło, ale światło holo (które w nexusie galaktyki wygląda na bardzo jasnoszare, nie całkowicie białe). Drugi obraz to wynik, który pojawia się, gdy element jest wybrany w widoku listy.
Jeśli zamiast tworzyć nową bitmapę za pomocą tego samego algorytmu, a następnie przekazać je do widoku obrazu zamiast przesłanianie OnDraw(), to rysuje poprawnie:
Canvas canvas = new Canvas();
Bitmap mainImage = //get original image
Bitmap maskImage = //get mask image
Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(result);
Paint paint = new Paint();
paint.setFilterBitmap(false);
canvas.drawBitmap(mainImage, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(maskImage, 0, 0, paint);
paint.setXfermode(null);
imageView.setImageBitmap(result);
uzyskać oczekiwany wynik:
Pamiętaj, że zanikanie zostało poprawnie zastosowane. Jest to bardziej oczywiste, gdy dokonuje się selekcji.
Co się dzieje w metodzie onDraw ImageView, aby stworzyć to czarne tło zamiast przepuszczać tło okna? Co ciekawe jest to, że jeśli sam obraz oryginału ma pewną przejrzystość, że przejrzystość jest przestrzegana, na przykład:
nie mogę zrozumieć to sam. Wolałbym móc to zrobić na onDraw zamiast wstępnego tworzenia bitmapy, ponieważ działa ona tylko dla bitmap jako źródło i maska. Chcę móc to zrobić z innymi rysunkami, takimi jak gradienty i jednolite kolory, ale w takich przypadkach szerokość i wysokość nie są ustawione.
Oto aktualizacja. Po przeczytaniu http://stackoverflow.com/questions/3467334/erase-bitmap-parts-using-porterduff-mode mógłbym odtworzyć to samo czarne zachowanie na działającym przykładzie, jeśli ustawię konfigurację Bitmapy na RGB_565 zamiast ARGB_8888. Mogłem również zawęzić problem do płótna przekazywanego w metodzie onDraw. Jeśli użyję płótna onDraw, pojawi się czarna ramka.Ponieważ płótno przekazywane do onDraw nie ma powiązanej bitmapy, może natywnie nie obsługuje przezroczystości? Inną rzeczą, którą odkryłem, jest to, że czarna ramka znika, gdy przewija się widok listy. – AngraX
Ok. Po przeczytaniu tego http://stackoverflow.com/questions/5231260/android-shader-behave-different-in-ondrawcanvas-and-new-canvasbitmap wygląda na to, że błąd polega na tym, że robię piksele z przezroczystego okna. jeśli zastosuję to na kanwie przekazanej do onDraw(). A za oknem jest czarne tło. Wygląda na to, że nie mam innego wyjścia niż użycie tymczasowej bitmapy i renderowanie jej, chyba że znajdę inny tryb DST, który działa. – AngraX
Próbuję zaimplementować podobną funkcjonalność, w której mam jeden obraz z obrazem, a drugą z czarną maską, po dotknięciu powinien pokazywać za obrazem w kręgu jako twój pokaz, czy możesz mi pomóc tutaj? – ViVekH