android - Canvas Eraser 正在绘制一条黑线

标签 android android-canvas eraser

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

我在应用程序中有一个绘图 Canvas 。
在使用自定义 View (drawView)的Activity中将canvas的背景设置为png图片;

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 是实例)中,我将绘制的路径存储在 PathPaint 的集合中,该集合具有 3 个属性(路径、使用的油漆以及是否为橡皮擦);

private ArrayList<PathPaint> paths = new ArrayList<PathPaint>();

然后我尝试在 OnDraw 中循环遍历这些路径,并每次使用绘制它们时所用的颜料(多种颜色)重新绘制它们;

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);

        }
    }

我在网上尝试了很多建议的选项,但都无济于事。

我已经尝试在绘图路径上设置绘画以设置所有各种注释掉的属性。

我尝试在位图上绘图,然后将该位图加载到 Canvas (canvas.drawBitmap(canvasBitmap, 0, 0, null))

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

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

但是要么没有画线,要么当集合重画路径时,橡皮擦画了一条黑线;

enter image description here

有趣的是,如果我在没有循环方面使用位图执行删除 - 橡皮擦会按预期工作;

//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);

    }

然而,这是一个问题,因为我希望能够撤消/重做删除(因此是收藏的重点)

谁能帮帮我?

最佳答案

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

分层有不同的方法。例如,这个 FrameLayout 替换了当前持有背景和绘制路径的 View (在代码中称为 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>

关于android - Canvas Eraser 正在绘制一条黑线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378268/

相关文章:

android:将 Canvas 转换为位图然后保存到SD卡

java - 为 Android 绘图应用程序创建橡皮擦

java - 使用身份验证 cookie 打开 WebSocket 连接

android - 向上导航和保存的实例数据

android - 使用 setcontentview 两次

java - 使用 Canvas 的橡皮擦效果

java - 排序列表查看搜索数据

android - 禁用 wifi 时 ConnectException 与 IOException?

java - 如何在两个 CanvasView 对象上使用 onClickListener?