SORU
23 NİSAN 2011, CUMARTESİ


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
9 Mayıs 2011, PAZARTESİ


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" drawRectgibi temel öğeler) her zaman mı bu olaya PaintYoksay'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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kruno j

    kruno j

    6 Mayıs 2007
  • TheMasterOfHell100

    TheMasterOfH

    13 AĞUSTOS 2011