2014-05-04 47 views
3

我有一些問題與drawArc。當我有4個楔子時,它似乎沒問題,但是當我沒有4個楔子(比如10個)時,楔子就不能正確對齊。你可以在圖片中看到,有一個輕微的錯位。有什麼想法嗎?與drawArc問題

int wedgeNum = 10; 

    for (int i = 0; i < wedgeNum; i++) { 

     canvas.drawArc(bounds, 0, 360.0f/wedgeNum, 
       true, paints[i % 2]); 
     canvas.rotate(360.0f/wedgeNum, bounds.centerX(), bounds.centerY()); 

    } 

enter image description here enter image description here

+0

如果您在不旋轉畫布的情況下繪製它們,則會發生同樣的事情(例如,通過改變'startAngle')? – Geobits

+0

是的,完全一樣的事情發生 –

+0

在Android中,canvas上有一個已知的drawArc錯誤。 @erakitin提出的答案可能是最好的解決方案 –

回答

3

在這種情況下的兩種顏色,來解決這個問題,我們可以得出一個第一色的整圈,然後繪製其上的第二顏色的楔子。像這樣:

int wedgeNum = 10; 

float wedgeSweepAngle = 360f/wedgeNum; 
// draw a round gray background 
canvas.drawCircle(bounds.centerX(), bounds.centerY(), bounds.width()/2f, paints[1]); 
// draw only green wedges 
for (int i = 0; i < wedgeNum; i += 2) { 
    canvas.drawArc(bounds, i * wedgeSweepAngle, wedgeSweepAngle, true, paints[0]); 
} 

通常,我們可以以相反的順序繪製楔子。此外,所有楔子的起始角度將爲0,並且結束角度將具有舊值。首先,我們繪製從0到360度的最後一個扇區,即整個圓。然後從0到(最後一個楔子的360-掃掠角度)度數(n - 1)。等等。

int wedgeNum = 10; 

float wedgeSweepAngle = 360f/wedgeNum; 
// end angle, we will decrease this value on each iteration 
float endAngle = 360f; 
// start angle, always 0 
final float startAngle = 0f; 
// reverse order 
for (int i = wedgeNum - 1; i >= 0; i--) { 
    // draw wedge from 0 to endAngle 
    canvas.drawArc(bounds, startAngle, endAngle, true, paints[i % 2]); 
    // calculate the next wedge's end angle 
    endAngle -= wedgeSweepAngle; 
} 

希望它能幫上忙。

+0

感謝@ erakitin爲您的答案,我意識到這是我用drawArc方法得到的唯一選項(我喜歡它沒有透支,但似乎不可能)。所以我獎勵給你賞金 –