android - 带有 PorterDuff.Mode.CLEAR 的橡皮擦总是画一条黑线,我想删除的地方

标签 android canvas path paint erase

我能否让它绘制路径,我移动手指用透明线删除,或者根本不绘制?

这就是我如何实例化我的橡皮擦:

 OnClickListener eraseListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            mPaint.setColor(0x00000000);
            mPaint.setXfermode(clear);
            mPaint.setAlpha(0x00);
            myView.setPaint(mPaint);
            LogService.log("PaintActivity", "------in eraseListener");

        }
    };

这将从我的包含 Canvas 的 View 中设置绘画。 这里我有以下 Action 事件:

private void touch_start(float x, float y) {
    mPath.reset();
    mPath.moveTo(x, y);
    mX = x;
    mY = y;
}
private void touch_move(float x, float y) {
    float dx, dy;
        dx = Math.abs(x - mX);
        dy = Math.abs(y - mY);
    if ((dx >= TOUCH_TOLERANCE) || (dy >= TOUCH_TOLERANCE)) {
        undoPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
        mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
            mX = x;
            mY = y;
    }
}
private void touch_up() {
    mPath.lineTo(mX, mY);
    mPath.moveTo(mX, mY);
    canvas.drawPath(mPath, paint);
    mPath.reset();
}
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        touch_start(x, y);
        break;
    case MotionEvent.ACTION_MOVE:
        touch_move(x, y);
        invalidate();
        break;
    case MotionEvent.ACTION_UP:
        touch_up();
        invalidate();
        break;
    }
    return true;
}

现在,如果我想删除,正如我所说,当我移动手指时,它会在该路径上绘制一条黑线。当我松开手指时,在触摸时,它会删除​​它绘制的黑线背面的内容。如果我评论 invalidate(); touch_move 函数中的线,那么它不会画那条黑线,而且,它只会在 touch_up 上删除。不能让它实时删除吗?

最佳答案

我是这样解决的:

private void touch_move(float x, float y) {
    float dx = Math.abs(x - mX);
    float dy = Math.abs(y - mY);
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
        mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);

        mPath.lineTo(mX, mY);
        // commit the path to our offscreen
        mCanvas.drawPath(mPath, mPaint);
        mPath.reset();
        mPath.moveTo(mX, mY);

        mX = x;
        mY = y;
    }
}

这里我在路径中添加了一条线,绘制了路径,重新设置了路径,并在touch_move方法中使用了moveTo

touch_up 上,我只使用 mPath.reset()

private void touch_up() {

    // kill this so we don't double draw
     mPath.reset();

}

这使我的橡皮擦变得透明——删除时不会画黑线。

关于android - 带有 PorterDuff.Mode.CLEAR 的橡皮擦总是画一条黑线,我想删除的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14998667/

相关文章:

javascript - 如何使用 d3 重新启动(恢复) Canvas 动画中暂停的计时器

UIWebViews 的 iOS 自定义字体路径

c# - 如何获取本地网络中已安装并存在的Sql Server实例(或SqlExpress)的列表

java - http 连接错误 javax.net.ssl.SSLPeerUnverifiedException : No peer certificate below jelly bean version

android - 在纯服务应用程序中使用 SpeechRecognizer。在主线程上运行代码

带有 Theme.AppCompat 的 Android 5.0 DatePicker

path - 路径组件的命名标准是什么?

java - Proguard 将所有混淆的类移动到一个包中

javascript - 将 Canvas 转换为 PDF

java - 安卓矩形碰撞