所以,我正在试验用户手指触摸后的“绘画”路径。我首先提到this tutorial,它有一个明显的问题,它不会连接触点。所以,我发现this question直接引用了相同的教程和问题。我在处理三次样条函数的部分上使用了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语句的补充。虽然,这似乎没有多大作用。如果您能提供任何帮助,我们将不胜感激,谢谢!
答案 0 :(得分:0)
经过一段时间的反复试验,我发现了如何开始一条“新”路径。事实上,我可以使用相同的路径。我在问题中放置的代码只会删除arraylist中的所有值(我认为这是开始新路径的第一步)。虽然,由于某种原因,它甚至没有这样做。然而,我发现的工作只是使用clear()方法,如下所示:
points.clear();
虽然,我发现,这并不能解决我的问题。它只删除以前绘制的路径。我需要做的是使用moveTo()方法,它允许路径中断创建一个外观,好像有多个路径。因此,每次我从屏幕上移开手指(ACTION_UP)时,我都将'points'arraylist的大小添加为另一个arraylist中的值:
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);
这样,在第一个点之前的路径中以及从我从屏幕抬起手指的每个点都会出现中断,直到我再次将其放回原位。这解决了我在问这个问题时遇到的最初问题,但它导致了其他一些问题。例如,在将我的手指替换到屏幕上时线的起点和终点发生变化。如果我找不到自己的解决方案,我会在另一个问题中提出这个问题。我希望这对遇到类似问题的人有用!