【问题标题】:Erase paths that are redrawn out of a List擦除从列表中重绘的路径
【发布时间】:2014-04-28 18:11:47
【问题描述】:

我最近一直在开发一款适用于 Android 的绘图应用程序,但现在遇到了一个我无法解决的问题。 这个想法是能够在两个绘图层上绘图。切换到第 2 层时,您只能看到该层的图纸,而在第 1 层中,您可以看到两个层,而第 2 层稍微透明。

为此,我有两个列表来保存绘制的路径和绘画。

case MotionEvent.ACTION_DOWN:
    //save a path to the list
    Paint strokePaint=new Paint();
    Path strokePath=new Path();
    setupDrawingPaint(strokePaint); //some initialization           
    stroke = new Stroke(strokePath, strokePaint); //object to save the paths
    stroke.movePath(touchX, touchY);

    if(drawingLayer==1){
        strokeListL1.add(stroke);
    }
    else{
        strokeListL2.add(stroke);
    }

    //draw the path
    drawingPath.moveTo(touchX, touchY);
    break;

case MotionEvent.ACTION_MOVE:           
    stroke.linePath(touchX, touchY);
    drawingPath.lineTo(touchX, touchY);
    break;

case MotionEvent.ACTION_UP:             
    canvas.drawPath(drawingPath, drawingPaint);
    drawingPath.reset()             
    break;

invalidate();

现在在 onDraw() 方法中,路径正常绘制,除非图层被更改,然后从列表中绘制笔划对象。

canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    //draw the layer(s)
    if(layerChanged)
    {
        if(drawingLayer==1){
            for(Stroke stroke : strokeListL1)
                canvas.drawPath(stroke.getPath(), stroke.getPaint());
            for(Stroke stroke : strokeListL2){
                Paint paint = stroke.getPaint();
                paint.setAlpha(50);
                canvas.drawPath(stroke.getPath(), paint);
            }
        }
        else{
            for(Stroke stroke : strokeListL2){
                Paint paint = stroke.getPaint();
                paint.setAlpha(255);                
                canvas.drawPath(stroke.getPath(), paint);   
            }
        }
    }
    else
        canvas.drawPath(drawingPath, drawingPaint);
    layerChanged=false;

从这里开始问题。只要我不更改图层擦除工作正常,但只要我更改图层而不是擦除它只会清除整个画布。 擦除方法如下所示:

public void setErase(boolean erase){
    eraseMode=erase;
    if(eraseMode)
        drawingPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));        
    else
        drawingPaint.setXfermode(null);
}

如果我在更改图层之前进行一些擦除,一旦我更改回该图层,“擦除笔触”也会以颜色绘制。我不确定我是否把自己逼入了死胡同,或者我只是没有得到它。希望大家帮帮我。

到目前为止

【问题讨论】:

    标签: android path drawing erase


    【解决方案1】:

    好的,所以这个错误很愚蠢。问题是每次用户绘制新路径时都会重新初始化 Paint 对象。当然,这会取消设置 Xfermode。

    case MotionEvent.ACTION_DOWN:
    Paint strokePaint=new Paint();

    解决方法是将当前的 Paint 对象交给构造函数。

    Paint strokePaint=new Paint(drawingPaint);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2018-10-18
      • 2012-12-29
      • 1970-01-01
      • 2012-06-23
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多