Java Canvas.drawLines显示断开的线段

Java Canvas.drawLines显示断开的线段,java,android,drawing,gesture,Java,Android,Drawing,Gesture,可能重复: 我是Android和java编程新手,一直在玩手机应用开发。我最近创建了一个视图,它可以简单地使绘制线与用户的手指运动保持同步。但是,我在Canvas.drawLines方法方面遇到了一些问题 我不是在所有点之间获得一组连续的线,而是在线段之间获得更多的虚线图案: 以下是一组数据样本和简单代码,用于重现问题(点数据取自真实的手指滑动): 在画出每个点并将其覆盖在直线上之后,我意识到问题实际上是每个点都没有连接,只是每两点连接一次。该方法不是将点1连接到点2再连接到点3等等,而是将

可能重复:

我是Android和java编程新手,一直在玩手机应用开发。我最近创建了一个视图,它可以简单地使绘制线与用户的手指运动保持同步。但是,我在Canvas.drawLines方法方面遇到了一些问题

我不是在所有点之间获得一组连续的线,而是在线段之间获得更多的虚线图案:

以下是一组数据样本和简单代码,用于重现问题(点数据取自真实的手指滑动):

在画出每个点并将其覆盖在直线上之后,我意识到问题实际上是每个点都没有连接,只是每两点连接一次。该方法不是将点1连接到点2再连接到点3等等,而是将1连接到2,然后将3连接到4,如下所示:

我几乎可以通过再次调用
drawLines
并提供一个偏移量来获得我想要的,这样其他对也可以一起绘制,但这对我来说似乎效率很低,而且通常很笨重,而且线条仍然不是完全平滑的(在拐角处有点起伏)


所以我的问题是,;我做错了什么?在给定一定点数的情况下,我如何画一条简单、平滑的线?见鬼,忘记要点吧,如果有更好的方法用一条线追踪用户的手指,我洗耳恭听。提前感谢。

您得到的正是文档中指定的内容

一种方法是根据该数据构造一个绘图路径,并使用
drawPath
而不是
drawLines
。比如:

Path _path = new Path();
_path.moveTo(_data[0], _data[1]);
for (int i=2; i<_data.length; i+=2) {
  _path.lineTo(_data[i], _data[i+1]);
}
路径
文档:

Path类封装了复合(多轮廓)几何路径,这些路径由直线段、二次曲线和三次曲线组成。可以使用canvas.drawPath(路径,绘制)绘制,填充或笔划(基于绘制的样式


因此,你可能必须改变你的绘画风格以获得正确的效果。

我今晚刚刚遇到这个问题。对于其他人来说,问题在于Android不会从点1到点2,然后从点2到点3,从点3到点4,等等。它会从点1到点2,然后从点3到点4,等等。所以你也可以将前一点推两次到你使用的任何数据结构中(我使用向量)。因此:

private Vector mPoints=new Vector();
私有浮点mLastX=float.NaN;
私有浮点mLastY=float.NaN;
公共无效添加点(浮点x、浮点y){
if(mLastX==Float.NaN | | mLastY==Float.NaN){
mLastX=x;
mLastY=y;
}否则{
mPoints.add(mLastX);
mPoints.add(mLastY);
mPoints.add(x);
mPoints.add(y);
mLastX=x;
mLastY=y;
}
}

然后确保将mpoint转换为float[]并将其传递到
canvas.drawLines()

您知道,我在发布此文件之前阅读了文档。。。凌晨三点。。。不管什么原因它都没有点击。。。非常感谢,我将尝试获得更多睡眠,幸运的是,这实际上不起作用,因为路径将填充点之间的区域,我需要画一条线。我会继续搜寻…@Ed S:更新了我的答案。看看例子,这就成功了,先生,再次感谢你。我觉得自己又像个初学者了。。。乐趣和挫折同时存在=)。你最好不要走这条路。你很可能会改变这些东西,而且路径有点昂贵。您最好只调用两次drawlines例程,并节省内存。if(count>=4){if((count&2)!=0){canvas.drawLines(pointlist,0,count-2,paint);canvas.drawLines(pointlist,2,count-2,paint);}else{canvas.drawLines(pointlist,0,count,paint);canvas.drawLines(pointlist,2,count-4,paint)我在一个非常简单的问题上找到了这个答案。。希望能有帮助。您可以只使用同一数组两次。int size=包装长度;帆布。抽绳(包装,0,尺寸,线条漆);帆布。抽绳(包装,2件,尺寸2,线描);只要给偏移量2。第二张画的是缺失的。我画了,我的路径就消失了:(
Path _path = new Path();
_path.moveTo(_data[0], _data[1]);
for (int i=2; i<_data.length; i+=2) {
  _path.lineTo(_data[i], _data[i+1]);
}
_canvas.drawPath(_path, _paint)
private Vector<Float> mPoints = new Vector<Float>();
private float mLastX = Float.NaN;
private float mLastY = Float.NaN;

public void addPoint(float x, float y) {
    if (mLastX == Float.NaN || mLastY == Float.NaN) {
        mLastX = x;
        mLastY = y;
    } else {
        mPoints.add(mLastX);
        mPoints.add(mLastY);
        mPoints.add(x);
        mPoints.add(y);

        mLastX = x;
        mLastY = y;
    }
}