Xfermode


Xfermode有三個子類:

AvoidXfermode  指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)。

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

PorterDuffXfermode  這是一個非常強大的轉換模式,使用它,

可以使用圖像合成的16條Porter-Duff規則的任意一條來控制Paint如何與已有的Canvas圖像進行交互。


設置方式如下:

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
canvas.drawBitmap(result,100,100,paint);


我們準備了兩張圖:

        

代碼有點問題,因爲下層圖的非交集部分總是顯示出來,知道原因的大神請告知,謝謝。

 public MissingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        Log.e("mag","1");
        init();
    }

    public boolean init(){
        result = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.m);
        Bitmap a = BitmapFactory.decodeResource(getResources(),R.drawable.mm);
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(a,50,50,paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
        canvas.drawBitmap(bitmap,100,100,paint);
        return  true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int w = getWidth();
        int h = getHeight();
        Log.e("w:",""+ w);
        Log.e("h:","" + h);
        // Bitmap bitmap = decodeBitmapFromResource(Math.min(w,h));
        paint.setXfermode(null);
        canvas.drawBitmap(result,0,0,paint);
    }



下面依次改變繪製圖片mm時的paint的PorterDuffXfermode

PorterDuffXfermode的十六條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( 取兩圖層全部區域,交集部分變爲透明色)


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