0

因此,我正在尝试跟随用户手指触摸的“绘画”路径。我首先提到了这个教程,它工作但有一个明显的问题,它不会连接触摸点。所以,我发现这个问题直接提到了相同的教程和问题。我在处理三次样条的部分使用了 johncarl 的解决方案,发现它非常有用。但是,我注意到,当您将手指从屏幕上移开(ACTION_UP)然后再将其放回原位(ACTION_DOWN)时,它会将最后一个点连接到这个新点并稍微改变路径。

现在,我的问题是,一旦用户移开手指并将其放回屏幕上,您将如何开始新路径?我的意思是新点不会连接到最后一个点。

我已经尝试了一些东西,我最新的尝试是这样的:

    else if (event.getAction() == MotionEvent.ACTION_UP){
        for (int i = 0; i <= points.size() - 1; i++){
            points.remove(i);
        }
    } 

上面的代码是 onTouch() 方法中 if 语句的附加代码。不过,这似乎并没有多大作用。如果您能提供任何帮助将不胜感激,谢谢!

4

1 回答 1

0

经过一段时间的反复试验,我发现了如何开始一条“新”路径。事实上,我可以使用相同的路径。我放在问题中的代码只会删除 arraylist 中的所有值(我认为这是开始新路径的第一步)。虽然,出于某种原因,它甚至没有这样做。然而,我发现确实有效,只是使用 clear() 方法,如下所示:

points.clear();

虽然,正如我发现的那样,这并不能解决我的问题。它只删除先前绘制的路径。我需要做的是使用 moveTo() 方法,该方法将允许路径中断,创建看起来好像有多个路径。因此,每次我将手指从屏幕上移开 (ACTION_UP) 时,我都会将“points”数组列表的大小作为一个值添加到另一个数组列表中:

startValues.add(points.size());

这将为我提供调用 moveTo() 方法的索引值。现在,在 onDraw() 方法中,我添加了以下代码(查看我要求查看我正在使用的所有代码的问题中的链接):

    boolean first = true;
    for(int i = 0; i < points.size(); i++){
        Point point = points.get(i);

        for (int index = 0; index <= startValues.size() - 1; index++){
            if (i == startValues.get(index)){
                lineChange = true;
                endNumber = (startValues.get(index) - 1);
                break;
            }
        }

        if(first || lineChange){
            first = false;
            lineChange = false;
            path.moveTo(point.x, point.y);
        }else{
            Point prev = points.get(i - 1);
            path.cubicTo(prev.x + prev.dx, prev.y + prev.dy, point.x - point.dx, point.y - point.dy, point.x, point.y);
        }

    }

    canvas.drawPath(path, paint);

这样,在第一个点之前的路径中以及从我从屏幕上抬起手指的每个点上都会有中断,直到我再次将其放回原位。这解决了我在问这个问题时遇到的最初问题,但它导致了其他一些问题。例如,当我的手指更换到屏幕上时,一条线的起点和终点会发生变化。如果我自己找不到解决方案,我会在另一个问题中问这个问题。我希望这对面临类似问题的人有用!

于 2012-11-27T23:32:39.717 回答