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

帆布橡皮擦在画一条黑线

贲功
2023-03-14

我已经在谷歌上搜索了这个问题,并提出了各种解决方案。
但是,没有一个对我有效。

我在一个应用程序中有一个绘图画布。
画布的背景被设置为活动中的png图像,该活动使用自定义视图(drawView);

Bundle extras = intent.getExtras();
    if (extras != null) {
        if (extras.containsKey("background")) {

            //set the background to the resource in the extras
            int imageResource = intent.getIntExtra("background",-1);
            Drawable image = getResources().getDrawable(imageResource);
            drawView.setBackground(image);
        }
    }

在DrawingView类(drawview是实例)中,我将绘制的路径存储在一个PathPaints集合中,该集合有3个属性(路径、使用的油漆以及如果是橡皮擦);

private ArrayList<PathPaint> paths = new ArrayList<PathPaint>();
protected void onDraw(Canvas canvas) {

    //if the drawing is new - dont draw any paths
    if (isNew != true) {

        //go through every previous path and draw them
        for (PathPaint p : paths) {

            if (!p.isErase)
            {
                canvas.drawPath(p.myPath, p.myPaint);
            }
            else
            {
                //Paint eraserPaint = setDefaultPaint();
                //eraserPaint.setAlpha(0xFF);
                //eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                //eraserPaint.setColor(Color.TRANSPARENT);
                //canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
                canvas.drawPath(p.myPath, p.myPaint);
            }
            canvas.drawBitmap(canvasBitmap, 0, 0, null);

        }
    }

我已经尝试在drawpath上设置油漆,以设置所有各种注释掉的属性。

我已经尝试在位图上绘制,然后将该位图加载到画布(canvas.drawbitmap(canvasBitmap,0,0,null))

我已经关闭了这个类的构造函数中的硬件加速

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

//If we are making a new drawing we don't want to go through all the paths
    if (isNew != true && erase ==false) {

        //go through every previous path and draw them


        for (PathPaint p : paths) {

            if (!p.isErase)
            {
                canvas.drawPath(p.myPath, p.myPaint);
            }
            //this section now takes place in the elseIF
            else
            {
                Paint eraserPaint = setDefaultPaint();
                eraserPaint.setAlpha(0xFF);
                eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                eraserPaint.setColor(Color.TRANSPARENT);


                canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
                canvas.drawPath(p.myPath, p.myPaint);
            }
        }
    }
    else if (isNew != true && erase ==true)
    {   
        //This works correctly for Erasing but I dont have the ability to Undo/Redo with this approach! 
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);

    }

共有1个答案

麻和雅
2023-03-14

看起来您只使用一个视图(层),首先放置背景图像,然后绘制路径,这些路径替换了背景。如果是这样,当您擦除时,您将从唯一的视图/层中移除,其中包括路径和背景。如果使用两个层(Framelayout中的两个视图),一个在后面,在那里加载背景,一个在前面,在那里放置所有的路径,那么在顶层擦除只是删除路径,背景就会通过。

分层有不同的方法。例如,这个FrameLayout替换了当前保存背景和绘制路径的视图(在代码中称为XXXView)

<FrameLayout
   android:layout_width= ...copy from the existing XXXView ...
   android:layout_height= ...copy from the existing XXXView ... >

   <ImageView 
      android:id = "@+id/background"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      ...
      ... the background is loaded here />


   <XXXView (this the existing view where the paths are drawn onto)
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      ...
      ... no background here />

</FrameLayout>
 类似资料:
  • 我想使用Fabric.js在我的web应用程序中实现eraser。在Fabric.js中有没有实现橡皮擦的方法?例如,如在MS Paint?

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

  • 我正在一个绘画应用程序,与撤消/重做功能,并希望添加橡皮擦功能。 橡皮擦上的代码怎么写得合适?(保留撤消/重做) 提前多谢!

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

  • 我试图将一个半透明的橡皮刷写进我正在开发的应用程序中,但发现了两个问题,这取决于它的实现方式。希望有一个解决办法,我可以指出。 代码示例在mono droid/xamarin中 所以,我通常有一个设置,在画布上绘制路径。我的视图的方法绘制它的基本位图,然后在其上绘制我的路径。 有人有什么东西我可以看一下,可以提出解决方案吗?Java很好,因为它很容易移植到C#。 多谢!奈杰尔

  • 我试图创建一个自定义视图,工作简单:有一个位图显示由弧路径-从0deg到360deg。度随着一些fps而变化。 我的问题是--如何设置模式以使其工作透明? 当然,是32位PNG,带有alpha通道。