android 自定义控件canvas,画笔设置成透明,每次画笔移动造成图层叠加的效果

Azings 2016-12-19 12:08:26
我现在想做一个蒙版区域选择的功能,有两个canvas,一个用来放背景图片,另一个做蒙版的效果,做蒙版的时候用到两支画笔,一直用来做透明的背景,属性设置成#66666666,另一只画笔作为两支笔的交接区域的判断,两支画笔之间交叉画图的方式是XOR,现在的问题是,我在界面上触摸事,虽然两支画笔之间的交接的地方空白了,但是每一次点一下,作为透明模板的颜色就会加深一部分,就好像有两个背景叠加一样。
private int width;
private int height;
private Bitmap mBitmap;
private Paint mPaintCircel;
private Paint mPaintRect;
private Canvas canvasBit;
private Bitmap mBitmapBackground;
private Bitmap mBitmapBackground1;
private Matrix matrix;
public boolean isfirstpaint = true;

public MyBitmapTwo(Context context) {
super(context);
}

public MyBitmapTwo(Context context, AttributeSet attrs) {
super(context, attrs);

path = new Path();

mBitmapBackground = ((BitmapDrawable) getBackground()).getBitmap();

matrix = new Matrix();
mPaintCircel = new Paint();
mPaintCircel.setColor(Color.parseColor("#00000000"));
mPaintCircel.setAlpha(0);
mPaintRect = new Paint();
mPaintRect.setColor(Color.parseColor("#666666"));
mPaintRect.setAlpha(80);
PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.XOR);//交叉的部分显示背景
mPaintCircel.setXfermode(mode);
mPaintCircel.setStrokeJoin(Paint.Join.ROUND);//设置线段中间用圆形填充
mPaintCircel.setStrokeCap(Paint.Cap.ROUND);//设置线段开头是圆形
mPaintCircel.setStrokeWidth(100);
mPaintCircel.setStyle(Paint.Style.FILL_AND_STROKE);//非空心
mPaintCircel.setPathEffect(new CornerPathEffect(360));
mPaintCircel.setAntiAlias(true);//消锯齿

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);//设置画布的大小,长和宽
mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
canvasBit = new Canvas(mBitmap);

}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(mBitmapBackground, new Rect(0, 0, mBitmapBackground.getWidth(), mBitmapBackground.getHeight()), new Rect(0, 0, width, height), null);//用图片做背景
canvasBit.drawPath(path, mPaintCircel);//按路径画图形,
canvasBit.drawRect(0, 0, width, height, mPaintRect);//跟view大小一样的透明背景
canvas.drawBitmap(mBitmap, 0, 0, null);
}

float x;
float y;
float old_x;
float old_y;
private Path path;

@Override//点击事件
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
path.moveTo(x, y);
invalidate();
old_x = x;
old_y = y;
return true;
case MotionEvent.ACTION_MOVE:
x = event.getX();
y = event.getY();
path.moveTo(old_x, old_y);
path.lineTo(x, y);
invalidate();
old_x = x;
old_y = y;
return true;
}
return super.onTouchEvent(event);
}
...全文
436 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dghenrik8888 2019-03-20
  • 打赏
  • 举报
回复
应该是另一支画笔的问题吧,透明度80,一下也许看不清,多点了几下就看着有问题了

80,359

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧