Nasıl Android parçalarını'in (2D) çizim tuvalini boru hattı ile birbirine uygun?
Android (2 BOYUTLU) çizim tuvalini boru hattı bileşenleri bir araya nasıl daha iyi bir anlayışa sahip olmak istiyorum.
Örneğin, nasılXferMode, Shader, MaskFilter ve ColorFilter etkileşim? Bu sınıflar için başvuru sayısı oldukça seyrek ve Canvas Paint dokümanlar gerçekten yararlı bir açıklama eklemeyin.
Bu da tam net değil bana nasıl çizim işlemleri var iç renk (örn: drawBitmap
karşı "vektör" ilkel gibi drawRect
) uyum içine tüm bu ... onlar her zaman Yoksay Paint
'In renk ve kullanın kendi içsel renk yerine?
Ayrıca kimse böyle bir şey yapabileceği gerçeği ile şaşırdı:
Paint eraser = new Paint();
eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawOval(rectF, eraser);
Bu oval siler. Daha önce fark ettim bu benim zihinsel model olduğunu çizimi için bir tuval (kavramsal olarak) çizer için ayrı bir "katman" ve o katman oluşur ile Tuval Bitmap kullanarak Boyanın transfer modu. Eğer o kadar basit olsaydı yukarıdaki kodu bütün bit Eşlem (kırpma bölgesi içinde) NET olarak silmek istiyorsunuzher zaman0 ayarlar rengi (alfa) kaynak alfa ne olursa olsun. Bu maskeleme ek bir sıralama var bir oval silme sınırlamak için devam anlamına gelir.
Buldum API demos ama her demo çalışıyor "boşluk" ve belli olmuyor nasıl bir şey odaklanır (örn: XferModes) etkileşim ile diğer şeyler (örn: ColorFilters).
Birlikte yeterince zaman ve çaba edebilirim ampirik olarak anlamaya nasıl bu parçaları bir ilişki ya da git deşifre kaynağı, ama umuyorum ki başka biri var zaten çalıştı bu, ya da daha iyisi bu bir gerçek belge boru hattı/çizim-model özledim.
Bu soru this answer to another SO question kod görerek ilham kaynağı oldu.
Güncelleme
Sırasında etrafa bakmak için bazı belgeler geldi bana o zamandan beri çok şeyler ilgilendiğim burada sanırım bir çok ince kaplama üzerinde skia, belki bazı skia belgeleri bu yararlı olacaktır. Bulabildiğim en iyi şey diyor: the documentation for SkPaint
Bu etkileri 6 türü vardır bir boya için atanmış:
- Geometri değişiklikler (yolu) yaratır önce SkPathEffect - alfa maskesi (örneğin Atılgan)
- SkRasterizer - özel maske katmanları oluşturma (örneğin gölge)
- Renklendirilen önce SkMaskFilter - alfa maskesi değişiklikler ve çizilmiş bulanıklık, kabartma olarak (örn
- - Örneğin geçişlerini (doğrusal, radyal, süpürme), SkShader bitmap desenleri (kelepçe, tekrar ediyorum, ayna)
- SkColorFilter - kaynak(lar) renk xfermode uygulamadan önce değiştir (örneğin; renk matrix)
- SkXfermode - örneğin porter-duff transfermodes, karışım modları
Açıkça ifade değil, ama etkileri buradan sipariş hattı order olduğunu tahmin ediyorum.
CEVAP
Romain gibi Adam " dedi, "Bu soruya cevap vermek zor StackOverflow üzerinde". Gerçekten tam belgeleri yoktu, ve eksiksiz Dokümantasyon burada eklemek için büyük olacaktır.
Kaynak yoluyla okuma ve deneyler bir sürü yapar oldum. Yol boyunca notlar aldım, ve burada görebileceğiniz bir belge dönüştürerek sona erdi:
bu diyagram:
""Normal uyarılar uygulanır. bu, açıkçası, bu gayri resmi
Yukarıdaki dayanarak, burada bazı cevaplar "alt sorular":
Ayrıca tamamen bana nasıl net değil içsel olan çizim işlemleri renkler (örn: karşı
drawBitmap
, "vektör"drawRect
gibi temel öğeler) her zaman mı bu olayaPaint
Yoksay'In renk ve kullanın kendi iç rengi yerine?
"Kaynak renkleri" Shader
geliyor. drawBitmap
Shader
eğer sigara-ALPHA_8
Bitmap
bir kullanılırsa geçici olarak BitmapShader
ile değiştirilir. Shader
sadece düz bir renk, Paint
oluşturduğu Shader
's renk kullanılır. belirtilen diğer durumlarda
Ayrıca aslında şaşırdım böyle bir şey yapabilirsiniz:
Paint eraser = new Paint(); eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); canvas.drawOval(rectF, eraser);
Bu oval siler. Ben fark etmeden zihinsel model bu benim çizim oldu bir tuval (kavramsal olarak) bir çizer "katman" ve o katmanı ayrı Tuval Bitmap ile oluşur Boyanın aktarım modunu kullanarak. Eğer yukarıdaki o kadar basitti kod tüm bit Eşlem silmek istiyorsunuz (kırpma bölgesi içinde) NET olarak her zaman0 ayarlar rengi (alfa) kaynak alfa ne olursa olsun. Yani bu bir var anlamına gelir maskeleme ek sıralama olacak oval için silme sınırlamak.
Bu XferMode
geçerlidir "kaynak renkleri" (Shader
) ve "hedef renk" (Canvas
'23 *s*). Sonuç hedef Tarama maske hesaplanan kullanarak ile harmanlanmış. Yukarıdaki Aktarma aşamasında daha fazla ayrıntı için bkz.
Nasıl (dişliler) varlık boru hattı ile...
Raylar 3.1 varlık boru hattı: nasıl de...
Nasıl Raylar Varlık Boru hattı derleme...
Nasıl boru hattı girişi kabul eden bir...
Nasıl hata Ayıklama hattı Eclipse kull...