Szukam stworzyć radialne menu w grze, którą piszę. Czy istnieje klasa lub interfejs API, aby pomóc w tym lub rozwiązaniu o otwartym kodzie źródłowym?Android Radial/Pie Menu
Coś takiego jak this.
Dziękuję Jake
Szukam stworzyć radialne menu w grze, którą piszę. Czy istnieje klasa lub interfejs API, aby pomóc w tym lub rozwiązaniu o otwartym kodzie źródłowym?Android Radial/Pie Menu
Coś takiego jak this.
Dziękuję Jake
Poniżej ma widok klasę OnDraw metoda(), aby narysować menu obrotowego ..
@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);
}
a także zarządzać X, Y Cordinates na zdarzenie dotykowym, aby dotknąć pozycja menu
@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;
}
Nadzieja powyżej kodu, który będzie pomocny ..
Nie ma wbudowany interfejs API dla takich menu, jednak nie ma co najmniej dwa sposoby wykonywania tego
1) Budowanie układu oznaczająca „Menu” i dołączyć go do "FrameLayout" w katalogu głównym twojego widoku Androida. Dostosowując położenie elementu tuż przed jego widocznością, można go przesuwać wokół piargi. Ta metoda jest trochę "hacky", ale powinna działać.
2) Utwórz całkowicie niestandardowy komponent, w tym własne metody rysowania i zdarzenia OnTouch, i dołącz do swojego widoku. Ta metoda jest nieco bardziej skomplikowana (musisz wdrożyć wszystkie metody rysowania), ale jest również nieco bardziej ogólna.
W obu przypadkach należy wziąć pod uwagę, w jaki sposób menu radialne funkcjonuje, gdy użytkownik korzysta z trackballa/d-pada.
to właśnie zakłada się, ale byłem hopin g komponent niestandardowy już istniał. Dzięki za informację. –
Czy możesz pokazać mi, jak przesunąć promień po przesunięciu? – AndroidDev
Bardzo imponująca praca! Nie mogę się doczekać, aby spróbować tego! –