2013-07-17 155 views
4

我想绘制一个箭头指向图像中的对象。我已经能够编写代码来绘制线条,但似乎无法找到绘制箭头的方法。我写的绘制可拖动线条的代码如下所示。我需要在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); 

,我从计算器

+0

Hi @ user2586488您可以在触发ACTION_UP事件而不是绘制箭头时附加图像。 –

+0

是的,但图像的方向应该与Line相匹配。我无法使用相同的图像作为向上的指向线和向下的指向等。 – user2586488

+0

是啊....您可以拥有一组图像,以便您可以设置根据象限的方向。 –

回答

5

我该怎么做才能找到在两点(起点和终点)之间绘制的线的斜率。斜率应该是(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()中的第三个值,您应该完成。对不起,如果我最后冲了一下,我有点厌倦了打字,如果你需要帮助,请发表评论。

+0

非常感谢朋友。这看起来很棒,应该可以工作。我没有足够的观点来回答答案。 – user2586488

+0

很好。下午我,如果你需要任何帮助。 – JPeroutek

1

接受的答案和iOS装置帮助如果你成功地借鉴输入事件的线,你可能还绘制指示方向在其末端的三角形。

在另一个项目上,我每次在网格上画了一个方形磁点(正如你可以看到here)。对不起,我现在不能提供任何示例代码。但如果这对你来说是一个合适的方法,我可能会在稍后发布。

+0

嗨,感谢您的回复,这种方法可能适用于我。你能让我知道你是如何给这个广场指明方向的,或者我可以如何指导这个三角形。 – user2586488

+0

在这种情况下,我没有给出方块的任何方向(正如你可以在视频中看到的那样)。通用方法是: - 记住开始触摸的点 - 计算起点和当前(拖动)位置之间的角度 - 将三角形旋转该角度 –

+0

如何给三角形赋予角度 – user2586488

1

这是一个很好的代码,它不是我的,它是一个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; 
    } 
} 

只需拨打此为您的线的两侧,它会在每边画一个箭头!

+1

谢谢你的代码对我真的很有帮助。 – omujeebr