Canvas.drawLines显示脱节的段

Ed *_* S. 8 java android drawing gesture

可能重复:
Android如何用手指画出平滑的线条

我是Android和Java编程的新手,并且一直在玩移动应用程序开发.我最近创建了一个视图,它简单地保持与用户的手指动作一致地绘制线条.但是,我在使用Canvas.drawLines方法时遇到了一些麻烦.

我没有在所有点之间获得连续的线条,而是获得了更多的虚线模式,并且各段之间有间隔:

Canvas.DrawLines中的细线段

以下是一组示例数据和简单的代码来重现问题(点数据来自真正的手指滑动):

public class SomeView extends android.view.View 
{
    private float[] _data = { 292.36545f, 104.37576f, 285.3567f, 112.39249f, 274.34293f, 113.39456f, 254.3179f, 115.39874f, 248.3104f, 116.40082f, 228.28535f, 118.405f, 214.26784f, 119.407104f, 211.26408f, 119.407104f, 204.25533f, 120.40918f, 202.25282f, 120.40918f, 201.25157f, 121.411255f, 199.24907f, 124.41754f, 197.24657f, 125.41962f, 196.24532f, 130.43005f, 195.24406f, 139.44885f, 197.24657f, 144.45929f };
    private Paint _paint;

    public SomeView( Context c, AttributeSet attrs)
    {
        super( c, attrs );
        _paint = new Paint();
        _paint.setColor(Color.BLUE);
        _paint.setStrokeWidth(6);   
    }   

    @Override
    public void onDraw(Canvas canvas)
    {       
        canvas.drawLines( _data, _paint);
    }           
}
Run Code Online (Sandbox Code Playgroud)

在绘制出每个点并将其覆盖在线上之后,我意识到问题实际上是每个点都没有连接,只有每两个点.而不是将点1连接到点2到点3,依此类推,方法是连接1到2然后3到4,如下所示:

在此输入图像描述

几乎可以通过drawLines再次绘制调用得到我想要的东西并且这次提供偏移以便其他对也被绘制在一起,但是这看起来效率低下并且对我来说通常很笨拙,并且线条仍然不是完全平滑的(稍微有点)角落不稳定).

所以,我的问题是; 我做错了什么?如何给出一些简单,流畅的线条?哎呀,忘了点,如果有更好的方法用一条线跟踪用户的手指,我全都耳朵.提前致谢.

Mat*_*Mat 13

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

做你想做的事的一种方法是Path从那个数据构建一个,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]);
}
Run Code Online (Sandbox Code Playgroud)

然后绘制:

_canvas.drawPath(_path, _paint)
Run Code Online (Sandbox Code Playgroud)

来自Path文档:

Path类封装了由直线段,二次曲线和三次曲线组成的复合(多个轮廓)几何路径.它可以用canvas.drawPath(path,paint)绘制,填充或描边(基于paint的样式)

所以你可能不得不改变你的油漆风格来获得正确的效果.