在android中绘制箭头头
我想绘制一个箭头指向图像中的对象。我已经能够编写代码来绘制线条,但似乎无法找到绘制箭头的方法。我写的绘制可拖动线条的代码如下所示。我需要在ACTION_UP事件上绘制一个箭头到方向,其中线指向在android中绘制箭头头
if(event.getAction() ==MotionEvent.ACTION_DOWN) {
if (count==1){
x1 = event.getX();
y1 = event.getY();
System.out.println(count+"count of value a;skd");
Toast.makeText(getApplicationContext(), ""+(radius+count), Toast.LENGTH_LONG).show();
Log.i(TAG, "coordinate x1 : "+String.valueOf(x1)+" y1 : "+String.valueOf(y1));
}
}
else if(event.getAction() ==MotionEvent.ACTION_MOVE){
imageView.setImageBitmap(bmp2);
x2 = event.getX();
y2 = event.getY();
posX=(float)(x1+x2)/2;
posY=(float)(y1+y2)/2;
radius=(float) Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))/2;
onDraw();
Toast.makeText(getApplicationContext(), ""+radius, Toast.LENGTH_LONG).show();
}
嗨,任何人仍然需要帮助的。这是我怎样到底做到了 浮子H =(浮点)30.0;
float phi = (float) Math.atan2(y2 - y1, x2 - x1);
float angle1 = (float) (phi - Math.PI/6);
float angle2 = (float) (phi + Math.PI/6);
float x3 = (float) (x2 - h * Math.cos(angle1));
float x4 = (float) (x2 - h * Math.cos(angle2));
float y3 = (float) (y2 - h * Math.sin(angle1));
float y4 = (float) (y2 - h * Math.sin(angle2));
c.drawLine(x1, y1,x2,y2 ,pnt);
c.drawLine(x2, y2,x3,y3 ,pnt);
c.drawLine(x2, y2,x4,y4 ,pnt);
,我从计算器
我该怎么做才能找到在两点(起点和终点)之间绘制的线的斜率。斜率应该是(dy/dx),这对你的箭头来说是一个很好的起点。假设你想让箭头的底部垂直于箭头线,找到底部的斜率,你会发现线的斜率的相反倒数。例如,可以说你的线的斜率为2.你的三角形底部的斜率为(-1/2),因为你的(1 /(oldslope))并乘以-1。我不太了解android,但如果我没有记错的话,在Java中,您将使用drawPolygon方法,并且您必须指定4个点(3个唯一,1个与第一个关闭相同)。鉴于小费基数的斜率,我们可以得到我们的前两点和最后一点。在开始绘制箭头的尺寸之前,您应该知道,因此在这种情况下,b
将是基线的长度。如果您采用ϴ=arctan(dy/dx)
,则会给出x轴与基线之间的角度。使用该Θ值,您可以执行ydif = b*sin(ϴ)
以获得箭头两个底角之间y值的差异。做同样的事情,但xdif = b*cos(ϴ)
给你在两个基点之间的x值的差异。如果用户绘制的线的最后一个点的位置是(x1, y1)
,那么三角形的基点的位置将是(x1-(xdif/2), y1-(ydif/2))
和(x1+(xdif/2), y1+(ydif/2))
。这两点,p1和p2是绘制多边形方法中的第一,第二和第四个点。要找到第三点,我们需要通过执行ϴ=arctan(dy/dx)
找到原始线的角度,这次使用您的原始dy/dx。与那个角度。在我们完成点的实际计算之前,您首先必须知道距离线的末端实际应该有多远,在我的情况下,我将使用var h和h = 10
。为了得到坐标,(x,y),假设坐标为(x1,y1),你应该做(x1+hcosϴ, y1+hsinϴ)
。将其用于drawPolygon()
中的第三个值,您应该完成。对不起,如果我最后冲了一下,我有点厌倦了打字,如果你需要帮助,请发表评论。
非常感谢朋友。这看起来很棒,应该可以工作。我没有足够的观点来回答答案。 – user2586488
很好。下午我,如果你需要任何帮助。 – JPeroutek
接受的答案和iOS装置帮助如果你成功地借鉴输入事件的线,你可能还绘制指示方向在其末端的三角形。
在另一个项目上,我每次在网格上画了一个方形磁点(正如你可以看到here)。对不起,我现在不能提供任何示例代码。但如果这对你来说是一个合适的方法,我可能会在稍后发布。
嗨,感谢您的回复,这种方法可能适用于我。你能让我知道你是如何给这个广场指明方向的,或者我可以如何指导这个三角形。 – user2586488
在这种情况下,我没有给出方块的任何方向(正如你可以在视频中看到的那样)。通用方法是: - 记住开始触摸的点 - 计算起点和当前(拖动)位置之间的角度 - 将三角形旋转该角度 –
如何给三角形赋予角度 – user2586488
这是一个很好的代码,它不是我的,它是一个Java Graphics2D代码,我转换为Canvas。所有信用去原家伙/女士是谁写的
private void drawArrowHead(Canvas canvas, Point tip, Point tail)
{
double dy = tip.y - tail.y;
double dx = tip.x - tail.x;
double theta = Math.atan2(dy, dx);
int tempX = tip.x ,tempY = tip.y;
//make arrow touch the circle
if(tip.x>tail.x && tip.y==tail.y)
{
tempX = (tip.x-10);
}
else if(tip.x<tail.x && tip.y==tail.y)
{
tempX = (tip.x+10);
}
else if(tip.y>tail.y && tip.x==tail.x)
{
tempY = (tip.y-10);
}
else if(tip.y<tail.y && tip.x==tail.x)
{
tempY = (tip.y+10);
}
else if(tip.x>tail.x || tip.x<tail.x)
{
int rCosTheta = (int) ((10)*Math.cos(theta)) ;
int xx = tip.x - rCosTheta;
int yy = (int) ((xx-tip.x)*(dy/dx) + tip.y);
tempX = xx;
tempY = yy;
}
double x, y, rho = theta + phi;
for(int j = 0; j < 2; j++)
{
x = tempX - arrowLength * Math.cos(rho);
y = tempY - arrowLength * Math.sin(rho);
canvas.drawLine(tempX,tempY,(int)x,(int)y,this.paint);
rho = theta - phi;
}
}
只需拨打此为您的线的两侧,它会在每边画一个箭头!
谢谢你的代码对我真的很有帮助。 – omujeebr
Hi @ user2586488您可以在触发ACTION_UP事件而不是绘制箭头时附加图像。 –
是的,但图像的方向应该与Line相匹配。我无法使用相同的图像作为向上的指向线和向下的指向等。 – user2586488
是啊....您可以拥有一组图像,以便您可以设置根据象限的方向。 –