gpt4 book ai didi

android - 在Android绘图应用程序中实现橡皮擦 - 黑色轨迹然后透明

转载 作者:可可西里 更新时间:2023-11-01 18:57:11 26 4
gpt4 key购买 nike

我有一个适用于 Android 的绘图应用程序,目前我正在尝试向其中添加一个真正的橡皮擦。以前,我只是用白色油漆作为橡皮擦,但现在我允许使用背景颜色和图像,所以不再这样做了。我通过在我的透明 Canvas 下方有一个 ImageView 来做到这一点。

我面临的问题是,每当我启用我的橡皮擦时,当我按下手指时它会画一条纯黑的轨迹,但一旦我松开它就会变成透明的。请参阅下面的屏幕截图:

这是我的手指在屏幕上时的样子 - 一条黑色实线 How it looks while my finger is still on the screen

这是我将手指从屏幕上移开后的样子 How it looks once I let go

所以,看起来我已经接近了,但我找不到正确的设置组合来避免我的手指在删除时触摸到的黑色痕迹。以下是一些相关的代码 fragment :

绘制

@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
canvas.drawPath(mPreviewPath, mPaint);
}

onTouchEvent

@Override
public boolean onTouchEvent(MotionEvent event) {
float currentX = event.getX();
float currentY = event.getY();

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchStart(currentX, currentY);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touchMove(currentX, currentY);
invalidate();
break;
case MotionEvent.ACTION_UP:
touchUp(currentX, currentY);
invalidate();
break;
}
return true;
}

当前尝试橡皮擦设置

public void startEraser() {
mPaint.setAlpha(0);
mColor = Color.TRANSPARENT;
mPaint.setColor(Color.TRANSPARENT);
mPaint.setStrokeWidth(mBrushSize);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setMaskFilter(null);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mPaint.setAntiAlias(true);
}

还有其他几篇关于橡皮擦的帖子,但大多数只是说使用 PorterDuff.Mode.CLEARsetMakFilter(null) 并且应该可以。就我而言,它没有。无论我尝试什么,我都是先得到黑色轨迹,然后在我释放后才得到想要的结果。

如有必要,我可以提供更多代码。

最佳答案

我建议您阅读 FingerPaint.java 的官方示例
它完全符合您要在此处实现的目标。

要在删除内容时不显示痕迹,请查看 onDraw() 方法和 eraserMode 变量:

@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xFFAAAAAA);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
if (!eraserMode) {
canvas.drawPath(mPath, mPaint);
}
}

boolean eraserMode = false;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
eraserMode = false;
mPaint.setXfermode(null);
mPaint.setAlpha(0xFF);
switch (item.getItemId()) {
/*...*/
case ERASE_MENU_ID:
// Add this line
eraserMode = true;
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
return true;
/*...*/
}
return super.onOptionsItemSelected(item);
}

关于android - 在Android绘图应用程序中实现橡皮擦 - 黑色轨迹然后透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25094845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com