2010-04-13 15 views
8

Ich suche ein radiales Menü in einem Spiel zu erstellen, das ich schreibe. Gibt es eine Klasse oder eine API, um diese oder eine Open-Source-Lösung zu unterstützen?Android Radial/Pie Menü

Etwas wie this.

Danke, Jake

Antwort

7

unterhalb der View-Klasse hat OnDraw() -Methode das Radialmenü Draw ..

@Override 
    protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    mRadialMenuPaint.setShadowLayer(mShadowRadius, 0.0f, 0.0f, mShadowColor); 
    //Draw the menu if the menu is to be displayed. 
    if(isMenuVisible) { 
     canvas.drawArc(mMenuRect, mStartAngle, 180, true, mRadialMenuPaint); 
     //See if there is any item in the collection 
     if(mMenuItems.size() > 0) { 
      float mStart = mStartAngle; 
      //Get the sweep angles based on the number of menu items 
      float mSweep = 180/mMenuItems.size(); 
      for(SemiCircularRadialMenuItem item : mMenuItems.values()) { 
       mRadialMenuPaint.setColor(item.getBackgroundColor()); 
       item.setMenuPath(mMenuCenterButtonRect, mMenuRect, mStart, mSweep, mRadius, mViewAnchorPoints); 
       canvas.drawPath(item.getMenuPath(), mRadialMenuPaint); 
       if(isShowMenuText) { 
        mRadialMenuPaint.setShadowLayer(mShadowRadius, 0.0f, 0.0f, Color.TRANSPARENT); 
        mRadialMenuPaint.setColor(item.getTextColor()); 
        canvas.drawTextOnPath(item.getText(), item.getMenuPath(), 5, textSize, mRadialMenuPaint); 
        mRadialMenuPaint.setShadowLayer(mShadowRadius, 0.0f, 0.0f, mShadowColor); 
       } 
       item.getIcon().draw(canvas); 
       mStart += mSweep; 
      } 
      mRadialMenuPaint.setStyle(Style.FILL); 
     } 
    } 
    //Draw the center menu toggle piece 
    mRadialMenuPaint.setColor(centerRadialColor); 
    canvas.drawArc(mMenuCenterButtonRect, mStartAngle, 180, true, mRadialMenuPaint); 
    mRadialMenuPaint.setShadowLayer(mShadowRadius, 0.0f, 0.0f, Color.TRANSPARENT); 
    //Draw the center text 
    drawCenterText(canvas, mRadialMenuPaint); 

} 

und verwalten auch die X, Y cordinates auf Touch-Ereignis Artikel-Menü

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
    int x = (int) event.getX(); 
    int y = (int) event.getY(); 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     if(mMenuCenterButtonRect.contains(x, y-15)) { 
      centerRadialColor = RadialMenuColors.HOLO_LIGHT_BLUE; 
      isMenuTogglePressed = true; 
      invalidate(); 
     } 
     else if(isMenuVisible) { 
      if(mMenuItems.size() > 0) { 
       for(SemiCircularRadialMenuItem item : mMenuItems.values()) { 
        if(mMenuRect.contains((int) x+20, (int) y)) 
         if(item.getBounds().contains((int) x+20, (int) y)) { 
          System.out.println("get x...> " + x); 
          System.out.println("get y...> " + y); 
          isMenuItemPressed = true; 
          mPressedMenuItemID = item.getMenuID(); 
          break; 
         } 
       } 
       mMenuItems.get(mPressedMenuItemID).setBackgroundColor(mMenuItems.get(mPressedMenuItemID).getMenuSelectedColor()); 
       invalidate(); 
      } 
     } 
     break; 
    case MotionEvent.ACTION_UP: 
     if(isMenuTogglePressed) { 
      centerRadialColor = Color.WHITE; 
      if(isMenuVisible) { 
       isMenuVisible = false; 
       centerMenuText = openMenuText; 
      } else { 
       isMenuVisible = true; 
       centerMenuText = closeMenuText; 
      } 
      isMenuTogglePressed = false; 
      invalidate(); 
     } 

     if(isMenuItemPressed) { 
      if(mMenuItems.get(mPressedMenuItemID).getCallback() != null) { 
       mMenuItems.get(mPressedMenuItemID).getCallback().onMenuItemPressed(); 
      } 
      mMenuItems.get(mPressedMenuItemID) 
       .setBackgroundColor(mMenuItems.get(mPressedMenuItemID).getMenuNormalColor()); 
      isMenuItemPressed = false; 
      invalidate(); 
     } 
     break; 
    } 

    return true; 
} 

enter image description here berühren

Hoffe oben Code, um hilfreich zu sein ..

+0

Sehr beeindruckende Arbeit! Ich kann es kaum erwarten, das auszuprobieren! –

2

Es gibt keine in-API für solche Menüs gebaut ist, aber es gibt mindestens zwei Möglichkeiten, um ein Layout, das Ihr „Menü“ Build diesen

1) zu tun, und befestigen Sie es an das "FrameLayout" an der Wurzel Ihrer Android-Ansicht. Indem Sie die Position des Elements anpassen, bevor Sie es sichtbar machen, können Sie es um das Geröll bewegen. Diese Methode ist ein wenig "hacky", aber es sollte funktionieren.

2) Erstellen Sie eine vollständig benutzerdefinierte Komponente, einschließlich Ihrer eigenen Zeichnungsmethoden und onTouch-Ereignisse, und hängen Sie sie an Ihre Ansicht an. Diese Methode ist ein wenig komplexer (Sie müssen alle Zeichenmethoden implementieren), ist aber auch etwas allgemeiner.

In beiden Fällen müssen Sie sich überlegen, wie das radiale Menü funktioniert, wenn der Benutzer den Trackball/das Pad verwendet.

+0

Das ist, was ich annahm, aber ich war hopin g Die benutzerdefinierte Komponente ist bereits vorhanden. Danke für die Information. –

+0

Kannst du mir zeigen, wie man den Radial beim Swipe bewegt? – AndroidDev