2015-02-11 156 views
1

目標是繪製一個具有代表時間切片的圓弧。我已經做到了這一點:畫布中圓弧之間的空間

enter image description here

的問題是,有每個拱之間的空白,我想刪除它。此外,弧不對齊。這是我的代碼:

int x = getWidth()/2; 
    int y = getHeight()/2; 
    int stroke = 20; 
    int radiusExternal = 250; 

    final RectF rect2 = new RectF(); 
    rect2.set(x - radiusExternal, y - radiusExternal, x + radiusExternal, y + radiusExternal); 
    for (int i = 0; i < modProgram.getListEvents().size(); i++) { 
     ModEvent event = modProgram.getListEvents().get(i); 
     Paint paint2 = new Paint(); 

     paint2.setColor(getColorEvent(event)); 
     paint2.setStrokeWidth(stroke); 
     paint2.setAntiAlias(true); 
     paint2.setStrokeCap(Paint.Cap.BUTT); 
     paint2.setStyle(Paint.Style.STROKE); 
     int initialAngle = getInitialAngle(modProgram, event.getStartEvent()); 
     int sweepAngle = getSweepAngle(modProgram, event, initialAngle); 
     canvas.drawArc(rect2, initialAngle, sweepAngle, false, paint2); 
    } 
+0

查看你的initialAngle和SweepAngle函數。我敢打賭你有一個錯誤。 – 2015-02-11 10:52:26

+0

我檢查了這一點,每個角度與下一個弧的initialAngle相同。這很奇怪:( – Yeray 2015-02-11 12:44:52

回答

1

這可能只是處理弧段之間的差距的部分答案。

這裏是用JavaScript小提琴:http://jsfiddle.net/oakvLadb/

我只是隨機產生一些開始和停角度。

的重要組成部分,位於弧圖中:

ctx.arc(c.width/2,c.height/2,radius,startAngle,stopAngle+anglePadding); 

的anglePadding在那裏,以確保一點點額外的繪製。當下一個片段從前一個片段的stopAngle開始繪製時,會出現一個切口疊片,確保沒有間隙可見。

下一頁窮人擬合弧段

當談到這看上去好像是段的事實是不正確開會了,我能想到的唯一的事情就是段你畫的不是那些完美的圓形,而是橢圓形的,這就是爲什麼他們沒有正確地開會。如果您的rect2變量不包含完美廣場的數據,則您的細分不會匹配。

它看起來像你有一個完美的廣場,所以他們應該對齊。某處,有某種舍入錯誤...

1

而不是繪製每個弧相鄰,您可以繪製更大的弧,如圖層繪製。

對不起,我的英語。

+0

感謝您的回答,我該怎麼做呢? – Yeray 2015-02-11 11:43:31

+0

我的意思是,你可以在最後一次繪製的圓弧上畫出新的圓弧,sweepAngle總是相同的(360),initialAngle可以是偏移量 – Tofasio 2015-02-11 12:03:07

+2

他意味着嘗試將最後一行更改爲:'canvas.drawArc(rect2,initialAngle,sweepAngle + 5,false,paint2);',請參閱sweepAngle上的+5(嘗試查看哪個編號最適合您。 -5,那應該就足夠了)?唯一出現的問題是繪製的最後一個弧,它不應該用sweepAngle上的那些額外的度數來繪製 – Niddro 2015-02-11 12:23:31

0

我通過將LayerType設置爲LAYER_TYPE_SOFTWARE來解決此問題。如下所示。 setLayerType(View.LAYER_TYPE_SOFTWARE,null);