在android中绘制多个路径

时间:2013-09-03 12:19:09

标签: java android android-canvas

我正在使用手指移动在Android画布中绘制封闭路径。这是我的代码

switch (event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                    startPoint = new PointF(event.getX(), event.getY());
                    endPoint = new PointF();
                    hotSpot = new HotSpots();
                    endPoint.x = event.getX();
                    endPoint.y = event.getY();
                    wallpath = new Path();
                    wallpath.moveTo(endPoint.x,endPoint.y);
                    break;
                case MotionEvent.ACTION_MOVE:
                    PointF point = new PointF(event.getX(),event.getY());
                    endPoint.x = event.getX();
                    endPoint.y = event.getY();
                invalidate();
                    break;
                case MotionEvent.ACTION_UP:

                    endPoint.x = startPoint.x;//event.getX();
                     isFinished = true;                    
                    break;
                default:
                    break;
            }

    @Override
    protected void onDraw(Canvas canvas)
    {
        wallpath.lineTo(endPoint.x, endPoint.y);
            canvas.drawPath(wallpath, paint);

       if(isFinished)
        {
            wallpath.lineTo(endPoint.x, endPoint.y);
            canvas.drawPath(wallpath, paint);
        }
    }

在每一次新的触摸中,我都在创造一条新的道路。但是当绘制新路径时,旧路径将被删除。如何在画布上绘制多条路径,并为每条路径绘制不同的填充颜色。

1 个答案:

答案 0 :(得分:2)

当ACTION_DOWN是触发事件时,您使用wallpath = new Path()语句重置wallpath,放弃之前的值。这个新路径是你的onDraw方法中唯一被绘制的东西,每次需要重绘画布时都会调用它。

考虑构建路径列表,在ACTION_DOWN是触发事件时向列表添加新路径,并在onDraw方法中绘制列表中的每个路径。

详细说明:

在代码的其他地方,添加:

pathList = new ArrayList<Path>;

在ACTION_DOWN案例中,添加一行:

wallpath = new Path();
pathList.add(wallpath); // <-- Add this line.

在ACTION_MOVE案例中:

endPoint.x = event.getX();
endPoint.y = event.getY();
wallpath.lineTo(endPoint.x, endPoint.y); // <-- Add this line.

最后,使用以下内容替换onDraw方法中的代码:

for (Path path : pathList) {
    canvas.drawPath(path, paint);
}

删除条件,这是不必要的。