PorterDuffXfermode,设置两张图片重叠的效果
他有以下过滤模式:(SRC:ImageView 的src ;DST:ImageView的Background)
android.graphics.PorterDuff.Mode. SRC :只绘制源图像
android.graphics.PorterDuff.Mode. DST :只绘制目标图像
android.graphics.PorterDuff.Mode. DST_OVER :在源图像的顶部绘制目标图像
android.graphics.PorterDuff.Mode. DST_IN :只在源图像和目标图像相交的地方绘制目标图像
android.graphics.PorterDuff.Mode. DST_OUT :只在源图像和目标图像不相交的地方绘制目标图像
android.graphics.PorterDuff.Mode. DST_ATOP :在源图像和目标图像相交的地方绘制目标图像,在不相交的地方绘制源图像
android.graphics.PorterDuff.Mode. SRC_OVER :在目标图像的顶部绘制源图像
android.graphics.PorterDuff.Mode. SRC_IN :只在源图像和目标图像相交的地方绘制源图像
android.graphics.PorterDuff.Mode. SRC_OUT :只在源图像和目标图像不相交的地方绘制源图像
android.graphics.PorterDuff.Mode. SRC_ATOP :在源图像和目标图像相交的地方绘制源图像,在不相交的地方绘制目标图像
android.graphics.PorterDuff.Mode. XOR :在源图像和目标图像重叠之外的任何地方绘制他们,而在不重叠的地方不绘制任何内容
android.graphics.PorterDuff.Mode. LIGHTEN :获得每个位置上两幅图像中最亮的像素并显示
android.graphics.PorterDuff.Mode. DARKEN :获得每个位置上两幅图像中最暗的像素并显示
android.graphics.PorterDuff.Mode. MULTIPLY :将每个位置的两个像素相乘,除以255,然后使用该值创建一个新的像素进行显示。结果颜色=顶部颜色*底部颜色/255
android.graphics.PorterDuff.Mode. SCREEN :反转每个颜色,执行相同的操作(将他们相乘并除以255),然后再次反转。结果颜色=255-(((255-顶部颜色)*(255-底部颜色))/255)
代码:
package com.lei.demo.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.CornerPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.lei.demo.utils.Logs;
/**
* Created by lei on 2016/5/11.
*/
public class XFormodeView extends View {
private Paint mPaint;//用来绘制path的
private Paint mContentPaint;
private Bitmap mSrcBit;//上面覆盖的一层
private Bitmap mObjBit;//刮出来的结果图
private Path mPath;//绘制刮的路径
private Canvas mCanvas;
private Rect mRect;
private String mContent = "恭喜发财";//显示的文字,可以将此暴露出去自定义
public XFormodeView(Context context) {
super(context);
initView();
}
public XFormodeView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public XFormodeView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
mObjBit = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
mSrcBit = Bitmap.createBitmap(mObjBit.getWidth(), mObjBit.getHeight(), Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mSrcBit);
mCanvas.drawColor(getResources().getColor(android.R.color.black));
mPath = new Path();
initPathPaint();
initContentPaintRect();
}
//初始化滑动路径的画笔
void initPathPaint() {
mPaint = new Paint();
mPaint.setAntiAlias(true);//抗锯齿true
mPaint.setAlpha(0);//将此透明度设为0,完全透明
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeWidth(10f);
mPaint.setPathEffect(new CornerPathEffect(0.3f));
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));//设置过滤模式
}
//初始化描述内容画笔和区域
void initContentPaintRect() {
mContentPaint = new Paint();
mRect = new Rect();
mContentPaint.setColor(getResources().getColor(android.R.color.holo_red_dark));
mContentPaint.setTextSize(50);
mContentPaint.getTextBounds(mContent, 0, mContent.length(), mRect);//通过rect得到文字的宽高
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(mObjBit, 0, 0, null);
canvas.drawText(mContent, (mSrcBit.getWidth() - mRect.width()) / 2, (mSrcBit.getHeight() - mRect.height()) / 2, mContentPaint);
canvas.drawBitmap(mSrcBit, 0, 0, null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Logs.v("onTouchEvent");
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPath.reset();
mPath.moveTo(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE:
mPath.lineTo(event.getX(), event.getY());
break;
}
mCanvas.drawPath(mPath, mPaint);//绘制路径
invalidate();
return true;
}
}
效果图: