当前位置: 首页 > 知识库问答 >
问题:

画布上的半透明橡皮刷

卫才哲
2023-03-14

我试图将一个半透明的橡皮刷写进我正在开发的应用程序中,但发现了两个问题,这取决于它的实现方式。希望有一个解决办法,我可以指出。

代码示例在mono droid/xamarin中

所以,我通常有一个设置,在画布上绘制路径。我的视图的ondraw方法绘制它的基本位图,然后在其上绘制我的路径。

    // Canvas is set up elsewhere
    canvasBitmap = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888);
    DrawCanvas.SetBitmap(canvasBitmap);


    protected override void OnDraw(Canvas canvas)
    {
        base.OnDraw(canvas);

        // Draw the saved canvas bitmap
        canvas.DrawBitmap(canvasBitmap, 0, 0, canvasPaint);

        // On top of that draw the current path
        canvas.DrawPath(DrawPath, DrawPaint);
    }



    public bool OnTouch(View view, MotionEvent ev)
    {
        float touchX = ev.GetX();
        float touchY = ev.GetY();


        switch (ev.Action)
        {
            case MotionEventActions.Down:

                if (Editable)
                {
                    // I've removed a bunch of code here but it basically
                    // moves the path start to the touch point and sets
                    // up the brush to start erasing. It does set the
                    // porterduff mode to dstOur
                    DrawPaint.SetMaskFilter(null);
                    DrawPaint.SetXfermode( new PorterDuffXfermode(PorterDuff.Mode.DstOut));

                    DrawPath.MoveTo(touchX, touchY);

                } else { return false;  }
                break;

            case MotionEventActions.Move:

                // Just draws a line to the new touch coordinates
                DrawPath.LineTo(touchX, touchY);

                break;
            case MotionEventActions.Up:
            case MotionEventActions.Cancel:

                // saves some data about the path and draws to the drawing canvas.
                DrawCanvas.DrawPath(DrawPath, DrawPaint);

                // Recycle it
                DrawPath.Reset();

                break;

        }
        return true;
    }

有人有什么东西我可以看一下,可以提出解决方案吗?Java很好,因为它很容易移植到C#。

多谢!奈杰尔

共有1个答案

万英武
2023-03-14

在没有比我更有经验/智慧的人提出建议的情况下,我以以下可怕的方式绕过了它。当我继续寻找更聪明的方法时,它可能仍然对其他人有帮助。

down事件发生时,我将位图的干净副本抓取到临时变量中。在每个ondraw事件中,我读取清除位图,然后在其上绘制擦除路径。

可怕的是,每个ondraw事件中都有一个位图复制方法,以确保擦除路径不会加倍。

OnDraw( Canvas canvas )
{
            tempBitmap.Recycle();
            tempBitmap = _drawingBitmap.Copy(_drawingBitmap.GetConfig(), true);

            DrawCanvas.DrawColor(Color.Transparent, PorterDuff.Mode.Clear);
            DrawCanvas.DrawBitmap(tempBitmap, 0, 0, DrawPaint));
            DrawCanvas.DrawPath(DrawPath, DrawPaint);
}
 类似资料:
  • 我想使用Fabric.js在我的web应用程序中实现eraser。在Fabric.js中有没有实现橡皮擦的方法?例如,如在MS Paint?

  • 我已经在谷歌上搜索了这个问题,并提出了各种解决方案。 但是,没有一个对我有效。 我在一个应用程序中有一个绘图画布。 画布的背景被设置为活动中的png图像,该活动使用自定义视图(drawView); 在DrawingView类(drawview是实例)中,我将绘制的路径存储在一个PathPaints集合中,该集合有3个属性(路径、使用的油漆以及如果是橡皮擦); 我已经尝试在drawpath上设置油漆

  • 在画布上画画是非常好的。即使橡皮擦也能工作得很好。问题是当画布保存为图像时,它画的是黑线,而不是橡皮擦。 为了更好地理解,我添加了屏幕、镜头和代码。 1.在擦除图的同时- 我不明白为什么橡皮移动被替换为黑色,而保存画布作为一个图像。

  • 这是我的舱单: 而这里是我的活动布局: 在我启动活动后,它停止,这是一个错误:

  • 我已经创建了一个HTML5绘图应用程序,它具有基本功能,允许用户选择一种颜色来绘制,改变绘图工具的大小(半径),撤消,重做,以及完全清除画布。 我最近添加了一个橡皮擦工具,使用globalCompositionProperty(desitnation-out)擦除画布的选定区域。这部分工作良好,但当我去撤销擦除,整个画布被清除,重做功能不起作用。当我用常规的绘图工具(使用source-over)恢

  • 我正在尝试做一些非常简单的事情(见上文)。我希望画布的所有像素都是纯色,除了填充中心圆圈的像素。我已经阅读了数百篇关于这个主题的stack overflow帖子,并尝试了数百种方法,包括设置porterduff.mode。下面是MyView extends视图的当前onDraw(): 我是不是误解了什么,为什么我不能用透明油漆在现有的像素上油漆。当我这样做时,像素保持不变。当我使用PorterDu