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
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
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;
}
berühren
Hoffe oben Code, um hilfreich zu sein ..
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.
Das ist, was ich annahm, aber ich war hopin g Die benutzerdefinierte Komponente ist bereits vorhanden. Danke für die Information. –
Kannst du mir zeigen, wie man den Radial beim Swipe bewegt? – AndroidDev
Sehr beeindruckende Arbeit! Ich kann es kaum erwarten, das auszuprobieren! –