利用PorterDuffXfermode,绘制组合图形,过程我分成了4个步骤(onDraw方法里面):
1、通过canvas.saveLayout()先绘制一个背景图层(这里位置大小很重要,应该根据覆盖层来定义)(如果没有背景层,产生效果可能和预期不太一样)
2、canvas.drawXXX()画底部图形Dst;
4、paint.setXfermode()设置图形相交模式
5、canvas.drawBitmap(maskBm, x, y, paint)画覆盖图形
下面是圆形与矩形SRC_OUT模式下重叠后效果图:
上图实现代码:
package com.example.d_customprogressbar.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
public class PorterDuffXferView extends View{
private Paint mPaint;
private Paint mPaint2;
private Rect rect;
private Bitmap maskBm;//遮罩层
public PorterDuffXferView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
mPaint.setColor(Color.YELLOW);
mPaint.setAntiAlias(true);
mPaint.setStyle(Style.FILL);
mPaint2 = new Paint();
mPaint2.setColor(Color.BLUE);
mPaint2.setAntiAlias(true);
mPaint2.setStyle(Style.FILL);
//绘制遮罩层
rect = new Rect(0,0, 250, 100);
maskBm = Bitmap.createBitmap(250, 100, Config.ARGB_8888);
Canvas canvas = new Canvas(maskBm);
canvas.drawRect(rect, mPaint2);
// canvas.saveLayer(0,0, 250, 100, 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);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制背景图层(这里位置大小很重要,应该根据覆盖层来定义)(如果要实现SRC-OUT效果:那么左上点与覆盖层一样)
int sc= canvas.saveLayer(100,100, 500, 500, 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);
//画圆-DST
canvas.drawCircle(100, 100, 100, mPaint);
//设置图形相交模式
mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
//画覆盖层(蓝色矩形)SRC
canvas.drawBitmap(maskBm, 100f, 100f, mPaint);
// mPaint.setXfermode(null);
// canvas.restoreToCount(sc);
}
}
效果分析:
如果把背景层代码注释,覆盖层就变黑了,如下图:
总结:用PorterDuffXfermode时,一定要先saveLayout()绘制背景层
Demo:http://download.csdn.net/detail/u013372185/9560935