mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
模式有:SRC_ATOP:不相交地方绘制目标图像,相交处绘制源图像,会受alpha影响。
DST_ATOP:与上相反。
XOR:不想交地方按原样绘制源图像和目标图像相交地方受alpha,颜色影响,都完全不透明,相交处不绘制,
其他模式见纸面总结
代码
import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * Created by YRC on 2017/10/22. */ public class XfermodeView extends View { Paint mPaint; Canvas canvas; Path path; Bitmap downBitmap,upBitmap; public XfermodeView(Context context) { super(context); initView(); } public XfermodeView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initView(); } public XfermodeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { mPaint=new Paint(); mPaint.setAlpha(0); mPaint.setStrokeWidth(50); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); //圆滑笔触 mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); path=new Path(); downBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.test3); upBitmap=Bitmap.createBitmap(downBitmap.getWidth(),downBitmap.getHeight(), Bitmap.Config.ARGB_8888); canvas=new Canvas(upBitmap); canvas.drawColor(Color.GRAY); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: path.reset(); path.moveTo(event.getX(),event.getY()); break; case MotionEvent.ACTION_MOVE: path.lineTo(event.getX(),event.getY()); break; case MotionEvent.ACTION_UP: break; } canvas.drawPath(path,mPaint); invalidate(); return true; } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(downBitmap,0,0,null); canvas.drawBitmap(upBitmap,0,0,null); } }