如何绘制多线,不同的颜色和撤消,重做机器人的路径?

如何绘制多线,不同的颜色和撤消,重做机器人的路径?

问题描述:

我要画上不同颜色的观点多行和撤消,重做机器人的路径。

I want to draw multiple lines on the view with different colors and undo,redo the paths in android.

我使用位图漆的选择,每个通道都有一个唯一的颜色,但撤消,重做不工作。

i use the bitmap paint option, each paths has a unique color but undo,redo is not working..

下面是我的$ C $ bitmappaint的C:

Here is my code of bitmappaint:

public MyView(Context context, Object object) {
    super(context);
    setFocusable(true);
    setFocusableInTouchMode(true);

    mPath = new Path();
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setColor(0xFFFFFF00);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(3);

    mBitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
}

protected void onSizeChanged(int w, int h, int oldw, int oldh) 
{
    super.onSizeChanged(w, h, oldw, oldh);
}

protected void onDraw(Canvas canvas) 
{
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    for (Path p : paths)
    {
        canvas.drawPath(p, mPaint);
    }
    canvas.drawPath(mPath, mPaint);
}

public boolean onTouchEvent(MotionEvent event)
{
    float x = event.getX();
    float y = event.getY();
    int action = event.getAction();
    int action1=event.getAction();
    switch (event.getAction())
    {
    case MotionEvent.ACTION_DOWN:
        undonePaths.clear();
        mPath.reset();
        mPath.moveTo(x, y);
        mX = x;
        mY = y;
        startPoint = new PointF(event.getX(), event.getY());
        endPoint = new PointF();
        invalidate();
        //   isDrawing = true;
        break;
    case MotionEvent.ACTION_MOVE:
        float dx = Math.abs(x - mX);
        System.out.println("action move");
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE)
        {
            //  currentDrawingPath.path.quadTo(mX,mY,(x + mX)/2, (y + mY)/2);
        }
        mX = x;
        mY = y;
        endPoint.x = event.getX();
        endPoint.y = event.getY();
        isDrawing = true;
        invalidate();
        break;
    case MotionEvent.ACTION_UP:
        mPath.lineTo(mX, mY);
        paths.add(mPath);
        mPath = new Path();
        //  mCanvas.drawPath(mPath, ppaint);
        endPoint.x = event.getX();
        endPoint.y = event.getY();
        isDrawing = false;
        invalidate();
        break;
    default:
        break;
    }       
}

![bitmappaint画布输出] [1]      [1]: http://i.stack.imgur.com/9aQvE.png

![output of bitmappaint canvas][1] [1]: http://i.stack.imgur.com/9aQvE.png

不使用位图我所面临的色差问题,如果我选择一个蓝色的路径是指所有的previous路径将变为蓝色;

without bitmap using i faced the color problem if i select a blue color for a path means all the previous paths will be changed to blue color;

下面是我的code

protected void onDraw(Canvas canvas) 
{
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    for (Path p : paths)
    {
        canvas.drawPath(p, mPaint);
    }
    canvas.drawPath(mPath, mPaint);
}

![而不使用Canvas绘图位图输出] [2]       [2]: http://i.stack.imgur.com/eDp5Y.png

![output of without bitmap using canvas drawing][2] [2]: http://i.stack.imgur.com/eDp5Y.png

请帮我打水的不同颜色的android系统中唯一的路径有多条路径。 谢谢advancde ........

pls help me to draw multiple paths with different color of unique paths in android. Thanks in advancde........

在处理MotionEvent.ACTION_UP:你需要保存用于绘制路径像这样的颜色:

When you handle the MotionEvent.ACTION_UP : you need to save the color used to draw the path with something like this :

case MotionEvent.ACTION_UP:
    paths.add(mPath);
    colorsMap.put(mPath,selectedColor); // store the color of mPath
    ...

绘制路径之前,您需要设置的油漆颜色:

Before drawing a path, you need to set the paint color:

protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    for (Path p : paths)
    {
        mPaint.setColor(colorsMap.get(p));
        canvas.drawPath(p, mPaint);
    }
    mPaint.setColor(selectedColor);
    canvas.drawPath(mPath, mPaint);
}

而colorsMap是一个简单的实例变量:

And the colorsMap is a simple instance variable:

private Map<Path, Integer> colorsMap = new HashMap<Path, Integer>();    

要实现撤销/重做功能,你只需要删除的路径的最后一个元素(并将其存储在一个undoneList,这样就重做可以恢复)。看到的Andr​​oid帆布重做和撤消操作

To implement the Undo/Redo feature, you just have to remove the last element from paths (and store it in a undoneList so that on redo can restore it). see Android Canvas Redo and Undo Operation