setXfermode
設置兩張圖片相交時的模式
我們知道 在正常的情況下,在已有的圖像上繪圖將會在其上面添加一層新的形狀。 如果新的Paint是完全不透明的,那么它將完全遮擋住下面的Paint;
而setXfermode就可以來解決這個問題
一般來說 用法是這樣的
Canvas canvas = new Canvas(bitmap1); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(mask, 0f, 0f, paint);
就是在圖片bitmap1上面繪制圖片mask時 處理兩者相交時候顯示的問題
canvas原有的圖片 可以理解為背景 就是dst
新畫上去的圖片 可以理解為前景 就是src
Mode的值 如下圖 
PorterDuff.Mode.CLEAR 清除畫布上圖像
PorterDuff.Mode.SRC 顯示上層圖像
PorterDuff.Mode.DST 顯示下層圖像
PorterDuff.Mode.SRC_OVER上下層圖像都顯示,上層居上顯示
PorterDuff.Mode.DST_OVER 上下層都顯示,下層居上顯示
PorterDuff.Mode.SRC_IN 取兩層圖像交集部門,只顯示上層圖像
PorterDuff.Mode.DST_IN 取兩層圖像交集部門,只顯示下層圖像
PorterDuff.Mode.SRC_OUT 取上層圖像非交集部門
PorterDuff.Mode.DST_OUT 取下層圖像非交集部門
PorterDuff.Mode.SRC_ATOP 取下層圖像非交集部門與上層圖像交集部門
PorterDuff.Mode.DST_ATOP 取上層圖像非交集部門與下層圖像交集部門
PorterDuff.Mode.XOR 取兩層圖像的非交集部門
畫圖示例(畫圓角矩形軌跡 常用語市面上流行的poker倒計時):
package com.k.gameview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; public class GameView1 extends View implements Runnable { /* 聲明Paint對象 */ private Paint mPaint = null; public GameView1(Context context) { super(context); /* 構建對象 */ mPaint = new Paint(); /* 開啟線程 */ new Thread(this).start(); } float arc; public void onDraw(Canvas canvas) { super.onDraw(canvas); if(arc>360) arc=0; /* 設置畫布的顏色 */ canvas.drawColor(Color.BLACK); /* 設置取消鋸齒效果 */ mPaint.setAntiAlias(true); mPaint.setAlpha(255); if(arc>200){ mPaint.setColor(Color.YELLOW); }else{ mPaint.setColor(Color.GREEN); } mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5); RectF rf = new RectF(10, 10, 90, 140); canvas.drawRoundRect(rf, 10, 10, mPaint); mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); mPaint.setAlpha(0); mPaint.setStyle(Paint.Style.FILL); canvas.drawArc(new RectF(-100, -75, 200, 225), 240, arc, true, mPaint); arc+=2.5; } // 觸筆事件 public boolean onTouchEvent(MotionEvent event) { return true; } // 按鍵按下事件 public boolean onKeyDown(int keyCode, KeyEvent event) { return true; } // 按鍵彈起事件 public boolean onKeyUp(int keyCode, KeyEvent event) { return false; } public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { return true; } public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // 使用postInvalidate可以直接在線程中更新界面 postInvalidate(); } } }

注注:部分內容來源網絡
