2010-04-13 19 views
8

मैं लिख रहा हूं कि एक गेम में एक रेडियल मेनू बनाने के लिए देख रहा हूँ। क्या इस श्रेणी या एपीआई को ओपन सोर्स सॉल्यूशन में सहायता करने के लिए शामिल किया गया है?एंड्रॉइड रेडियल/पाई मेनू

कुछ this की तरह कुछ।

धन्यवाद, जेक

उत्तर

7

नीचे देखें वर्ग OnDraw रेडियल मेनू ड्रा करने के लिए() विधि ..

@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); 

} 

और भी एक्स प्रबंधित है, टच घटना पर वाई Cordinates आइटम मेनू को छूने के लिए

@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

कोड के ऊपर सहायक होने के लिए आशा है ..

+0

बहुत प्रभावशाली काम! मैं इसे आजमाने के लिए इंतजार नहीं कर सकता! –

2

नहीं है ऐसी कोई मेनू के लिए एपीआई में बनाया गया है, तथापि, वहाँ ऐसा करने के लिए कम से कम दो तरीके इस

1) एक लेआउट का निर्माण अपने "मेनू" का प्रतिनिधित्व करने और के लिए देते आपके एंड्रॉइड व्यू की जड़ पर "फ्रेमलेआउट"। इससे पहले कि आप इसे दृश्यमान करने से पहले तत्व की स्थिति को समायोजित करके, आप इसे स्क्री के चारों ओर ले जा सकते हैं। यह विधि थोड़ा "हैकी" है, लेकिन इसे काम करना चाहिए।

2) अपनी खुद की ड्राइंग विधियों और टच घटनाओं सहित एक पूरी तरह से कस्टम घटक बनाएं, और इसे अपने दृश्य में संलग्न करें। यह विधि काफी जटिल है (आपको सभी ड्राइंग विधियों को लागू करने की आवश्यकता होगी), लेकिन यह कुछ और सामान्य भी है।

किसी भी मामले में, याद रखें कि आपको यह विचार करने की आवश्यकता होगी कि जब उपयोगकर्ता ट्रैकबॉल/डी-पैड का उपयोग कर रहा है तो रेडियल मेनू कैसे काम करता है।

+0

यही मुझे लगता है, लेकिन मैं आशा करता था जी कस्टम घटक पहले से मौजूद है। जानकारी के लिए धन्यवाद। –

+0

क्या आप मुझे दिखा सकते हैं कि कैसे स्वाइप पर रेडियल को स्थानांतरित किया जाए? – AndroidDev

संबंधित मुद्दे