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