Android绘制线条带箭头

时间:2014-10-17 16:12:32

标签: android html5-canvas drawing

我正在学习java + android,以及这个主题 Draw in Canvas by finger, Android 帮助我很多用户绘制线条。但是,在我的应用程序中,我想为每一行添加一个箭头。它尝试使用Path.lineTo添加一个三角形,但问题是我不能将它旋转到正确的方向。

考虑帮助

1 个答案:

答案 0 :(得分:1)

你必须做一些数学运算。让我们说你的线的最后一个点是A,最后一个是B.然后我们必须计算方向向量D为A-B。该矢量应该被归一化,即除以它自己的长度,然后拉伸到你想要的箭头线的长度。对A,B和D使用Androids PointF类,它看起来应该是这样的:

PointF a = <initialize with last point of your line>
PointF b = <initialize with last but one point of your line>
// difference vector
PointF d = new PointF(a.x-b.x, a.y-b.y);
// normalize
d.set(d.x / d.length(), d.y / d.length());
// stretch to, say, 10 units
d.set(10.0f * d.x, 10.0f * d.y);

现在是旋转部分。我们希望旋转3/4 * pi,顺时针旋转一次,逆时针旋转一次。我们可以使用rotation matrix来完成此操作。对于二维情况,它很简单:

float angle = 0.75f * Math.PI;
PointF dLeft = new PointF(+d.x*Math.cos(-angle)-d.y*Math.sin(-angle),+d.x*Math.sin(-angle)+d.y*Math.cos(-angle));
PointF dRight = new PointF(+d.x*Math.cos(+angle)-d.y*Math.sin(+angle),+d.x*Math.sin(+angle)+d.y*Math.cos(+angle));

请注意,dLeft和dRight是方向向量。要计算箭头线的两个结束点,你必须将它们添加到A.所以在伪(非java)代码中你可以这样做:

moveTo(A);
lineTo(A+dLeft);
moveTo(A);
lineTo(A+dRight);

希望这会奏效;祝你好运!