【Android】PorterDuffXfermode使用(通过消除背景层与重叠部分绘制组合图形)

    利用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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值