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;
}
}