Android-----Graphics-----Xfermode

1. Xfermode
可以通過修改Paint的Xfermode來影響在Canvas已有的圖像上面繪製新的顏色的方式
在正常的情況下,在已有的圖像上繪圖將會在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那麼它將完全遮擋住下面的Paint;如果它是部分透明的,那麼它將會被染上下面的顏色。

下面的Xfermode子類可以改變這種行爲:
AvoidXfermode  指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)。

PixelXorXfermode  當覆蓋已有的顏色時,應用一個簡單的像素XOR操作。

PorterDuffXfermode  這是一個非常強大的轉換模式,使用它,可以使用圖像合成的16條Porter-Duff規則的任意一條來控制Paint如何與已有的Canvas圖像進行交互。

要應用轉換模式,可以使用setXferMode方法,如下所示:

Java代碼
AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);     
 borderPen.setXfermode(avoid);   


 AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);  
  borderPen.setXfermode(avoid); 



2. 16條Porter-Duff規則
           1.PorterDuff.Mode.CLEAR
           2.PorterDuff.Mode.SRC
           3.PorterDuff.Mode.DST
           4.PorterDuff.Mode.SRC_OVER
           5.PorterDuff.Mode.DST_OVER
           6.PorterDuff.Mode.SRC_IN
           7.PorterDuff.Mode.DST_IN
           8.PorterDuff.Mode.SRC_OUT
           9.PorterDuff.Mode.DST_OUT
           10.PorterDuff.Mode.SRC_ATOP
           11.PorterDuff.Mode.DST_ATOP
           12.PorterDuff.Mode.XOR
           13.PorterDuff.Mode.DARKEN
           14.PorterDuff.Mode.LIGHTEN
           15.PorterDuff.Mode.MULTIPLY
           16.PorterDuff.Mode.SCREEN

 

3.

Java代碼 
// make a ckeckerboard pattern   
            Bitmap bm = Bitmap.createBitmap(new int[] { 0xFFFFFFFF, 0xFFCCCCCC,   
                                            0xFFCCCCCC, 0xFFFFFFFF }, 2, 2,   
                                            Bitmap.Config.RGB_565);   
            mBG = new BitmapShader(bm,   
                                   Shader.TileMode.REPEAT,   
                                   Shader.TileMode.REPEAT);   
            Matrix m = new Matrix();   
            m.setScale(6, 6);   
            mBG.setLocalMatrix(m); 

 

4.

Java代碼 
  
// draw the src/dst example into our offscreen bitmap   
                int sc = canvas.saveLayer(x, y, x + W, y + H, null,   
                                          Canvas.MATRIX_SAVE_FLAG |   
                                          Canvas.CLIP_SAVE_FLAG |   
                                          Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |   
                                          Canvas.FULL_COLOR_LAYER_SAVE_FLAG |   
                                          Canvas.CLIP_TO_LAYER_SAVE_FLAG);   
                canvas.translate(x, y);   
                canvas.drawBitmap(mDstB, 0, 0, paint);   
                paint.setXfermode(sModes[i]);   
                canvas.drawBitmap(mSrcB, 0, 0, paint);   
                paint.setXfermode(null);   
                canvas.restoreToCount(sc);  

// draw the src/dst example into our offscreen bitmap
                int sc = canvas.saveLayer(x, y, x + W, y + H, null,
                                          Canvas.MATRIX_SAVE_FLAG |
                                          Canvas.CLIP_SAVE_FLAG |
                                          Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
                                          Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
                                          Canvas.CLIP_TO_LAYER_SAVE_FLAG);
                canvas.translate(x, y);
                canvas.drawBitmap(mDstB, 0, 0, paint);
                paint.setXfermode(sModes[i]);
                canvas.drawBitmap(mSrcB, 0, 0, paint);
                paint.setXfermode(null);
                canvas.restoreToCount(sc);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章