2015-11-02 14 views
6

arkasındaki opak siyah arkaplanını geride bırakır. Özel bir görünümüm var ve onDraw()'da, bitmap maskelemeyi gerçekleştirmeye çalışıyorum. Ben tüm görünümü dolduran bir squareBitmap (kırmızı renk) var ve ben maske gibi davranan bir circleBitmap (mavi renk) var. Modu kullanıyorum: PorterDuff.Mode.DST_IN.Android Bitmap Masking (Xfermode),

Beklediğim sonuç, KIRMIZI dolu bir dairedir. Bunu anlıyorum, ama ayrıca siyah opak bir arka plan elde ediyorum. Bu opak arka planını istemiyorum, şeffaf olmalı. Figure 1 aldığım sonucu ve Figure 2 aradığım sonuçtur.

Figure 1 : The Result I gotFigure 2: The Result that I am looking for

Benim kod: (Bu soru amacı için onDraw() içindeki her şeyi taşımış)

protected void onDraw(Canvas canvas) { 

    final int width = canvas.getWidth(); 
    final int height = canvas.getHeight(); 

    Bitmap circleBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    Canvas circleCanvas = new Canvas(circleBitmap); 
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 
    p.setStyle(Paint.Style.FILL_AND_STROKE); 
    p.setColor(Color.BLUE); 
    circleCanvas.drawCircle(width/2, height/2, width/2, p); 

    p.setColor(Color.RED); 
    Bitmap squareBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas squareCanvas = new Canvas(squareBitmap); 
    final Rect squareRect = new Rect(0, 0, width, height); 
    squareCanvas.drawRect(squareRect, p); 

    Paint q = new Paint(Paint.ANTI_ALIAS_FLAG); 
    canvas.drawBitmap(squareBitmap, 0, 0, q); 
    q.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
    canvas.drawBitmap(circleBitmap, 0, 0, q); 
    q.setXfermode(null); 
} 


Nerede yanlış gidiyorum? Bu siyah opak arka planı nasıl önleyebilirim?

+0

deneyin 'yerine DST_IN'' arasında DST_OUT'. Veya "SRC_IN". –

+0

@ FrankN.Stein Hayır, çalışmıyor. Şimdi siyah dolu daireyi ve kırmızı bir arka planı aldım. 'SquareBitmap' nedeniyle arkaplan kırmızı, ancak daire neden siyah? İdeal olarak, daire şeffaf olmalı ve dolayısıyla mavi (arka plan düzeninin rengi) olmalıdır. – Henry

+0

Burada bir cevap bulabilirsiniz: http://ssp.impulsetrain.com/porterduff.html –

cevap

11

Xfermode bitini tamamladıktan sonra çizimi bir ekran dışı bitmap'e yönlendirmem gerekiyor. Bu yüzden aşağıdakileri eklemek sorunumu çözdü.

canvas.saveLayer(0, 0, canvas.getWidth(), canvas.getHeight(), q); 

Ama sonra tekrar, saveLayer ait documentation pahalı olduğundan bu yöntemi kullanmaktan kaçının diyor. Bu yöntem yerine harware layer kullanılması önerilir. Resim bağlar, büyük, özellikle de bu yöntemi kullanarak

kaçının veya CLIP_TO_LAYER_SAVE_FLAG saveFlags parametresinden atlanırsa. Bu yöntemden daha fazla gerçekleştireceğinden, bir xfermode, renk filtresi veya alfa uygulamasının bir Görünüm üzerinde bir donanım katmanı kullanmanız önerilir.

Bu nedenle, intead saveLayer yöntem, aşağıdaki ilave edilerek düzeltmek mümkün:

setLayerType(LAYER_TYPE_HARDWARE, q); 
+0

Çizim bitmap, maske ve kullanılan boya ve XferMode gösteren tam örnek sağlayan sakıncası olur mu? Teşekkürler! – thumbmunkeys

+1

Sorumun konusu kodun tam örneğidir. Görünüm'ü genişleten bir dersim var. Ve ben soruda sahip olduğum 'onDraw()' yöntemim var. Çalıştırmak için eklediğim tek şey cevapta: 'setLayerType'. Buna gerçek bir dünya senaryosu için bir göz atmak isteyebilirsiniz: http://stackoverflow.com/a/33483600/4747587 – Henry

+0

Bu hızlı cevap için teşekkürler! – thumbmunkeys

İlgili konular