2011-04-07 28 views
16

我想繪製一個帶圓角的矩形。我有一個JavaScript路徑,這樣做,但JavaScript的arcTo方法需要一個矩形(來定義它的橢圓形),然後一個參數設置掃描。有人可以解釋arcTo的最後兩個參數嗎?

但是,在Android版本中有三個參數。矩形橢圓形(我認爲我已經正確定義了),然後是startAngle和sweepAngle(我不瞭解它的用法),但是我的弧形看起來不像我期待的那樣,猜猜他們應該工作。

有沒有人知道這個好教程?

具體而言,我試圖理解如果我試圖從12 - 3繪製一個弧(在時鐘面上),然後假設我有一條從3然後需要從3到6等轉角。

這裏是我的代碼(忽略弧數字在那裏,現在......這只是我的猜測,在這可能如何,由於無法對前面的,更明智的嘗試最新的迭代):

Path ctx = new Path(); 
     ctx.moveTo(X+5,Y); //A 
     ctx.lineTo(X+W-5,Y);//B 
     ctx.arcTo(new RectF(X+W, Y, X+W, Y+5), -180, 90); //B arc 

     ctx.lineTo(X+W,Y+H-5); //C 
     ctx.arcTo(new RectF(X+W,Y+H,X+W-5,Y+H),90,180); //C arc 

     ctx.lineTo(X+W/2 +6,Y+H); 
     ctx.lineTo(X+W/2,Y+H+8); 
     ctx.lineTo(X+W/2-6,Y+H); 
     ctx.lineTo(X+5,Y+H); 
     ctx.arcTo(new RectF(X,Y+H,X,Y+H-5),180,270); 

     ctx.lineTo(X,Y+5); 
     ctx.arcTo(new RectF(X,Y,X+5,Y),270,0); 
     Paint p = new Paint(); 
     p.setColor(0xffff00ff); 

     canvas.drawPath(ctx, p); 

多謝。

回答

25

奇怪的是,沒有一個管道中有一個答案,一旦我找到了它(這不容易找到),它是非常簡單的。

所以,它的工作方式是這樣的: 假設你想在12畫一個圓角 - 3(使用時鐘參考): 你開始你的路徑,當你需要行電弧你定義一個矩形,其左上角是你的線當前被終止的地方,右下角是你想要弧去的地方,所以如果你想象一個X,Y是12(在時鐘上)並且其X + W,Y + H是3這就是你需要的平方。

現在,想象你在那個正方形中有一個橢圓形(在這個例子中它是一個圓形的橢圓形,如果你希望曲線更加橢圓形,那麼將你的正方形定義爲一個矩形)使用該方法的最後兩個參數。第一個參數定義了你想要開始切割的角度。如果我們使用羅盤,0度是東(不知道爲什麼,我不是一個幾何專家......這是正常的嗎?我總是認爲0是北,但我看到的所有編程幾何示例都有0東,也許有人會評論這是爲什麼)。

第二個參數定義了多少你想要的圓。如果你想把整個圓圈放到360,如果你想放一半的圓圈放180等等。

所以,在我們的例子中,因爲我們想要從12拐彎到3,所以我們把270作爲起點和抓取圓圈90度。

最後,當你完成這個過程時,這條線現在認爲自己是在下午3點,所以你可以從那裏繼續lineTo(ing)。 所以...這裏是我的形狀的固定代碼(它有一個小三角形,但它既不在這裏也不在那裏,實際的圓形部分是B-C,D-E,I-J和K-A,其餘都是直線。

int arc = 25; 
    public Cursor(int X, int Y, int W, int H){ 
     /* 
     * A   B 
     * K    C 
     * J    D 
     * I H F E 
        G 
     */ 
     int Ax = X+ arc; 
     int Ay = Y; 
     int Bx = X + W - arc; 
     int By = Y; 
     int Cx = X + W; 
     int Cy = Y + arc; 
     int Dx = Cx; 
     int Dy = (Y + arc) + (H - arc*2); 
     int Ex = Bx; 
     int Ey = Y + H; 
     int Fx = X+W/2 +6; 
     int Fy = Ey; 
     int Gx = X+W/2; 
     int Gy = Y+H+8; 
     int Hx = X+W/2-6; 
     int Hy = Ey; 
     int Ix = Ax; 
     int Iy = Hy; 
     int Jx = X; 
     int Jy = Dy; 
     int Kx = X; 
     int Ky = Cy; 


     Path ctx = new Path(); 
     ctx.moveTo(Ax,Ay); //A 
     ctx.lineTo(Bx,By);//B 
     ctx.arcTo(new RectF(Bx, By, Cx, Cy), 270, 90); //B-C arc 

     ctx.lineTo(Dx,Dy); //D 
     ctx.arcTo(new RectF(Dx - arc, Dy, Ex + arc, Ey),0,90); //D-E arc 

     ctx.lineTo(Fx, Fy); //E-F 
     ctx.lineTo(Gx, Gy); //F-G 
     ctx.lineTo(Hx, Hy); //G-H 
     ctx.lineTo(Ix, Iy); //H - I 
     ctx.arcTo(new RectF(Jx, Jy, Ix, Iy),90,90);// I = J arc 

     ctx.lineTo(Kx, Ky); //K 
     ctx.arcTo(new RectF(Ax - arc, Ay, Kx + arc, Ky),180,90); //K - A arc 
     ctx.lineTo(Ax, Ay); //K 



     Paint p = new Paint(); 
     p.setAntiAlias(true); 
     p.setColor(0xffffffff); 
     p.setStyle(Style.FILL); 
     canvas.drawPath(ctx, p);  
     p.setColor(0xff000000); 
     p.setStyle(Style.STROKE); 
     p.setStrokeWidth(3);    
     canvas.drawPath(ctx, p); 



    } 
+0

嘿,我在繪製弧線的時候遇到了問題,我試着按照你的建議,但我無法得到它..你能看到我問的問題嗎?在那裏,我有我的問題詳細,所以你最好理解。 http://stackoverflow.com/questions/17449339/how-to-define-te-startangle-and-sweepangle-for-arcto-method-android謝謝! :) – 2013-07-03 13:46:17

+1

想象你的弧被一個矩形包圍(並且一直延伸到該矩形的內部,即使只顯示你想要顯示的部分)。第一個參數是橢圓內點的起點位置,第二個參數是要抓取完整橢圓的度數,以弧線爲弧段。 – 2013-07-03 17:18:29

+0

謝謝!我知道我做錯了什麼。我將最終度數值傳遞給sweepAngle參數。考慮到startAngle參數,我不得不通過多少度數來抓取,正如我所說的那樣,而不是finalAngle – 2013-07-03 18:01:10

0

下面是一些示例代碼(從我班的一個拼湊起來的),以繪製填充,圓角矩形,然後添加描邊矩形給它一個邊界:

//Initializing some stuff 
_paint = new Paint(); 
_rect = new RectF(); 
_radius = 10; 
_bgColor = 0xFFFFFFFF; 
_borderColor = 0xFFCCCCCC; 

//Doing dimension calculations 
_rect.left = 0; 
_rect.top = 0; 
_rect.right = this.getWidth() - 1; 
_rect.bottom = this.getHeight() - 1; 

//painting 
//draw the background 
_paint.setColor(_bgColor); 
_paint.setStyle(Style.FILL_AND_STROKE); 
canvas.drawRoundRect(_rect, _radius, _radius, _paint); 

//draw the border 
_paint.setStrokeWidth(1); 
_paint.setColor(_borderColor); 
_paint.setStyle(Style.STROKE); 
canvas.drawRoundRect(_rect, _radius, _radius, _paint); 
+0

我很欣賞這一點,但這不是我所追求的...我想了解arcTo方法d。我的形狀並非嚴格地說是一個矩形,它的底部有一個小箭頭。 – 2011-04-07 22:32:22

2

感謝這個例子,它使參數非常清楚的理解。 從我在Android的開發文檔中讀到的內容中,您可能會省去一些「lineTo()」調用(除了那些指向F,G,H的調用),因爲arcTo在弧的第一個點時自動添加一個lineTo是不是最後一點繪製...

至於爲什麼0開始東,這是因爲數學和三角學的經驗教訓通常假設0度標記是三角圓(中心爲0,0和半徑1)與X軸相交,這是東(這些相同的經驗教訓通常計算逆時針角度,所以90度變爲北,270爲南,而在Android上,角度似乎是順時針計數)

+0

感謝您的額外信息! – 2011-06-29 18:38:44

相關問題