2012-10-28 27 views
12

Catch Notes App
Android的圓形菜單像抓注

我嘗試做圓形菜單想在這個應用程序。通過使用與android.graphics.Pathandroid.graphics.Paint一些數學

<RelativeLayout android:id="@+id/bigCircle"> 
<!--color full borders--> 
    <my.custom.component android:id="@+id/middleCircle"> 
    <!--circle for buttons--> 
     <RelativeLayout android:id="@+id/smallCircle"> 
      <!--minus button--> 
     </RelativeLayout> 
    </my.custom.component> 
</RelativeLayout> 

在的onDraw的my.custom.component方法我把上8份圓:

在「展開」模式i繪製該組件等如下。
在視覺上,我完全如屏幕截圖所示。但是當我按下圓的一部分時,我需要用另一種顏色重新繪製這部分,以向用戶展示正在發生的事情。

例如,我如何通過android.graphics.Path來重繪部件畫布的另一部分的畫布。
換句話說,我知道我應該在onDraw方法中做什麼重繪畫布,我知道我可以從Photoshop中繪製的drawable繪製一些位圖,並有一些「多屏幕麻煩」,我知道如何確定用戶按下的部分。但我不知道如何選擇畫布的一部分並重畫它。

回答

20

開發者在這裏抓住。如果我瞭解您的問題,則無法理解如何在圓形菜單的某個部分專門繪製突出顯示/選擇指示符。

雖然有很多不同的方法可以實現,但您傾向於(使用android.graphics.Path)是我們如何做到的。在捕捉按鈕的視圖層次結構中,有一個元素用作畫布,在該畫布上繪製選擇高亮顏色(如果有是活動選區)。

如果您的佈局中有類似的自定義View,則可以像這樣複製此行爲。首先,您需要Path來定義特定圓形段的選擇。使用Path.addArc(RectF, float, float)我們可以得到比薩餅片形路徑,我們需要:

private Path getPathForSegment(float startAngle, float sweep) { 
    Point center = new Point(getWidth()/2, getHeight()/2); 
    RectF rect = new RectF(0f, 0f, getWidth(), getHeight()); 
    Path selection = new Path(); 
    selection.addArc(rect, startAngle, sweep); 
    selection.lineTo(center.x, center.y); 
    selection.close(); 
    return selection; 
} 

getWidth()以上getHeight()是封閉的自定義視圖對象,所以他們定義包含在其上選擇了一圈邊框畫。

然後,在自定義視圖的onDraw(Canvas),如果你的代碼已經確定的選擇應繪製段:

@Override 
protected void onDraw(Canvas canvas) { 
    // Assume one has the rest of these simple helper functions defined 
    if (shouldDrawSelection()) { 
     float startAngle = getStartAngleOfSelectedSegment(); 
     float sweep = getSweepAngle(); 
     Paint paint = getPaintStyleForSelectedSegment(); 
     Path path = getPathForSegment(startAngle, sweep); 
     canvas.drawPath(path, paint); 
    } 

    // ... 

    super.onDraw(canvas); 
} 

在你的代碼,追蹤接觸的其他區域,只需撥打invalidate()上自定義視圖,以便根據輸入或狀態的變化重繪(或不重繪)選擇路徑。

請記住,這是很好的做法,以避免onDraw()new ING對象,所以大部分這些積木(Path S,Paint S等)可以構建提前(或一次,在第一次發生)和重用。

希望這與您所要求的接近!

+3

現在我回到調查這個問題。我甚至沒有預料到會得到答案,非常感謝你的搖滾樂開發者Catch。你製作了非常漂亮的應用 – Mrusful

+1

+1支持Android社區。順便說一句,愛你的應用程序。 – cgTag