2014-10-17 93 views
0

即时通讯学习java + android,并且这个主题 Draw in Canvas by finger, Android 帮了我很多忙,让用户画线。但是,在我的应用程序中,我想为每一行添加一个箭头。它尝试使用Path.lineTo添加一个三角形,但问题是我不能将它旋转到正确的方向。带箭头的Android绘图线

认为的帮助

回答

1

你将不得不做一些数学。假设你的线的最后一个点是A,最后一个点是B.然后我们必须计算一个方向向量D作为A-B。该矢量应该进行归一化处理,即按照自己的长度进行分割,然后拉伸至您想要的箭头线的长度。使用机器人会PointF类A,B和d,它应该是这个样子:

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

希望这将工作;祝你好运!