这个问题已经在这里有了答案:




已关闭8年。






我是Android和Java编程的新手,并且一直在从事移动应用程序开发。我最近创建了一个 View ,该 View 仅使绘制线条与用户的手指移动保持一致。但是,我在使用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);
    }
}

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

我可以通过再次绘制调用drawLines并提供一次偏移量来几乎得到我想要的东西,以便将其他对也绘制在一起,但是这对我来说似乎效率不高且笨拙,而且线条仍然不完全平滑(得到拐角处有些断断续续)。

所以,我的问题是;我在做什么错,在给定一些点的情况下,如何绘制一条简单,平滑的线?哎呀,如果有更好的方法可以用一条线“我全是耳朵”来追踪用户的手指,那就别忘了要点。提前致谢。

最佳答案

您得到的正是 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]);
}

然后用:
_canvas.drawPath(_path, _paint)

Path文档:



因此,您可能必须更改自己的绘画风格才能获得正确的效果。

关于java - Canvas.drawLines显示不连续的线段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6167236/

10-11 04:50