Android放射状/饼状菜单
我希望在我正在编写的游戏中创建一个径向菜单。是否包含一个类或API来帮助此解决方案或开源解决方案 差不多 谢谢,,Android放射状/饼状菜单,android,user-interface,Android,User Interface,我希望在我正在编写的游戏中创建一个径向菜单。是否包含一个类或API来帮助此解决方案或开源解决方案 差不多 谢谢,, Jake这种菜单没有内置的API,但是,至少有两种方法可以做到这一点 1) 构建一个代表“菜单”的布局,并将其附加到android视图根目录下的“框架布局”。通过在使图元可见之前调整其位置,可以在屏幕上移动图元。这种方法有点“老套”,但它应该可以工作 2) 构建一个完全自定义的组件,包括您自己的绘图方法和onTouch事件,并将其附着到视图中。此方法相当复杂(您将需要实现所有的绘图
Jake这种菜单没有内置的API,但是,至少有两种方法可以做到这一点 1) 构建一个代表“菜单”的布局,并将其附加到android视图根目录下的“框架布局”。通过在使图元可见之前调整其位置,可以在屏幕上移动图元。这种方法有点“老套”,但它应该可以工作 2) 构建一个完全自定义的组件,包括您自己的绘图方法和onTouch事件,并将其附着到视图中。此方法相当复杂(您将需要实现所有的绘图方法),但也有点通用
在这两种情况下,请记住,当用户使用轨迹球/d焊盘时,需要考虑径向菜单的功能。
下面有视图类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);
}
还可以管理触摸事件到触摸项目菜单的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;
}
希望上面的代码有帮助。这是我假设的,但我希望自定义组件已经存在。谢谢你的信息。