Android径向/饼图菜单

我正在创build一个我正在写的游戏中的放射状菜单。 是否有一个类或API来协助这个或一个开源的解决scheme?

像这样的东西。

谢谢杰克

Solutions Collecting From Web of "Android径向/饼图菜单"

下面有View类的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); } 

还可以pipe理触摸事件中的X,Y坐标以触摸“项目菜单”

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

在这里输入图像说明

希望以上代码有帮助..

这种菜单没有内置API,但是,至less有两种方法可以做到这一点

1)构build一个代表你的“菜单”的布局,并将其附加到你的android视图根目录下的“FrameLayout”。 通过在显示元素之前调整元素的位置,可以将其移动到屏幕上。 这个方法有点“哈克”,但它应该工作。

2)构build一个完全自定义的组件,包括您自己的绘图方法和onTouch事件,并将其附加到您的视图。 这个方法比较复杂(你需要实现所有的绘图方法),但也有些更一般。

无论哪种情况,请记住,您需要考虑用户使用轨迹球/ d-pad时径向菜单的function。