2013-07-17 111 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