Благодаря Максу в этом посте я сделал горизонтальное меню. Но сейчас я пытаюсь сделать оверлейное меню, я не могу найти, как это сделать ... Давайте посмотрим, что я получил первым.
Итак, у меня есть класс MapScreen, который отображает мою карту:
public class MapScreen extends MenuScreen
Затем у меня в том же файле есть класс MenuScreen, подобный этому, который позволяет отображать горизонтальное меню, когда я нажимаю клавишу MENU:
abstract class MenuScreen extends MainScreen {
boolean mMenuEnabled = false;
CyclicHFManager mMenuManager = null;
public MenuScreen() {
mMenuManager = new CyclicHFManager();
mMenuManager.setBorder(BorderFactory.createBevelBorder(new XYEdges(4,
0, 0, 0), new XYEdges(Color.DARKBLUE, 0, 0, 0), new XYEdges(
Color.WHITE, 0, 0, 0)));
mMenuManager.setBackground(BackgroundFactory
.createLinearGradientBackground(Color.DARKBLUE, Color.DARKBLUE,
Color.LIGHTBLUE, Color.LIGHTBLUE));
for (int i = 0; i < 10; i++) {
Bitmap nBitmap = new Bitmap(60, 60);
Graphics g = new Graphics(nBitmap);
g.setColor(Color.DARKBLUE);
g.fillRect(0, 0, 60, 60);
g.setColor(Color.WHITE);
g.drawRect(0, 0, 60, 60);
Font f = g.getFont().derive(Font.BOLD, 40);
g.setFont(f);
String text = String.valueOf(i);
g.drawText(text, (60 - f.getAdvance(text)) >> 1, (60 - f
.getHeight()) >> 1);
Bitmap fBitmap = new Bitmap(60, 60);
g = new Graphics(fBitmap);
g.setColor(Color.DARKBLUE);
g.fillRect(0, 0, 60, 60);
g.setColor(Color.GOLD);
g.drawRect(0, 0, 60, 60);
g.setFont(f);
g.drawText(text, (60 - f.getAdvance(text)) >> 1, (60 - f
.getHeight()) >> 1);
BitmapButtonField button = new BitmapButtonField(nBitmap, fBitmap);
button.setCookie(String.valueOf(i));
button.setPadding(new XYEdges(0, 18, 0, 18));
button.setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
Dialog.inform("Button # " + (String) field.getCookie());
}
});
mMenuManager.add(button);
}
}
protected boolean keyDown(int keycode, int time) {
if (Keypad.KEY_MENU == Keypad.key(keycode)) {
if (mMenuManager.getManager() != null) {
delete(mMenuManager);
mMenuManager.mCyclicTurnedOn = false;
} else {
add(mMenuManager);
mMenuManager.getField(2).setFocus();
mMenuManager.mCyclicTurnedOn = true;
}
return true;
} else {
return super.keyDown(keycode, time);
}
}}
И, наконец, мой менеджер меню:
public class CyclicHFManager extends HorizontalFieldManager {
int mFocusedFieldIndex = 0;
public boolean mCyclicTurnedOn = false;
public void focusChangeNotify(int arg0) {
super.focusChangeNotify(arg0);
if (mCyclicTurnedOn) {
int focusedFieldIndexNew = getFieldWithFocusIndex();
if (focusedFieldIndexNew != mFocusedFieldIndex) {
if (focusedFieldIndexNew - mFocusedFieldIndex > 0)
switchField(0, getFieldCount() - 1);
else
switchField(getFieldCount() - 1, 0);
}
} else {
mFocusedFieldIndex = getFieldWithFocusIndex();
}
}
private void switchField(int prevIndex, int newIndex) {
Field field = getField(prevIndex);
delete(field);
insert(field, newIndex);
}}
Итак, как это работает, работает: когда я нажимаю клавишу MENU, появляется меню, я могу перемещаться между кнопками, и оно исчезает, когда я снова нажимаю ту же клавишу. Единственная проблема в том, что мое меню не накладывается на мою карту, оно подталкивает содержимое вверх. Я пытался с менеджером меню, как в вашем первом ответе, изменить размер менеджера контента, но это тот же результат.
Макс дал мне ссылку Blackberry - анимация расположения полей , чтобы сделать это, но я действительно не знаю, как использовать это, чтобы заставить это работать в моем проекте ...
Спасибо за помощь!
UPDATE
Это прекрасно работает, это то, что я хотел. Тем не менее, у меня все еще есть проблема, потому что я под 4,5. Итак, сначала в конструкторе MenuHostManager я удалил
USE_ALL_HEIGHT
и изменить
setPositionChild(mMenuManager, 0,
Display.getHeight() - mMenuManager.getPreferredHeight());
вот так меню внизу экрана. Это сработало.
Затем, вместо того, чтобы рисовать мои растровые изображения, я сделал это:
Bitmap nBitmap = EncodedImage.getEncodedImageResource("menu" +
i + ".png").getBitmap();
BitmapButtonField button = new BitmapButtonField(nBitmap, nBitmap);
И это тоже сработало (пока не будет ролловера, позже). Так это здорово!
Я также перезаписываю метод Paint моего CyclicHFManager, чтобы он имел цвет фона, потому что я не могу использовать BorderFactory и BackgroundFactory ... Моя строка меню имеет цвет, поэтому все в порядке.
Затем, из-за отсутствия этих 2 классов, в моем BitmapButtonField мне пришлось удалить 2 функции setBorder, которые изменяют границы. А теперь у меня довольно большие кнопки, как у обычных кнопок с рамками ...
Как я могу сделать тот же эффект, что и функции setBorder под 4.5? (Кстати, setBorder не работает под 4.5 тоже ...).
Спасибо!
ОБНОВЛЕНИЕ 2
См. Экран с 5.0 с этим кодом:
public BitmapButtonField(Bitmap normal, Bitmap focused) {
super(CONSUME_CLICK);
mNormal = normal;
mFocused = focused;
mWidth = mNormal.getWidth();
mHeight = mNormal.getHeight();
setMargin(0, 0, 0, 0);
setPadding(0, 0, 0, 0);
setBorder(BorderFactory
.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
setBorder(VISUAL_STATE_ACTIVE, BorderFactory
.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
}
Снимок экрана: i45.tinypic.com/4sz85u.jpg
И до 4.5 с удаленными 2 функциями setBorder (потому что они недоступны):
public BitmapButtonField(Bitmap normal, Bitmap focused) {
super(CONSUME_CLICK);
mNormal = normal;
mFocused = focused;
mWidth = mNormal.getWidth();
mHeight = mNormal.getHeight();
setMargin(0, 0, 0, 0);
setPadding(0, 0, 0, 0);
}
Снимок экрана: i49.tinypic.com/rartz5.jpg
А мне хотелось бы первый скриншот под 5.0, но с 4.5!
ОБНОВЛЕНИЕ 3
Я решил проблему, добавив
protected void applyTheme() {
}
Границ больше нет, и выглядит отлично!
Мне нужно сфокусироваться на моем ролловере, а затем на действии щелчка (у меня нет диалогового окна, когда я нажимаю на него на симуляторе). Мне также удается изменить фон моего менеджера меню, я рисую картинку, потому что я не могу использовать BackgroundFactory.createLinearGradientBackground.
Как я могу управлять моим опрокидыванием, если у вас есть функция getVisualState ()?
ОБНОВЛЕНИЕ 4
Я немного изменяю BitmapButtonField, чтобы сделать его ролловером без использования getVisualState (). Я не знаю, действительно ли это хорошо, но это работает (я использовал временное растровое изображение mCurrent):
public class BitmapButtonField extends ButtonField {
Bitmap mNormal;
Bitmap mFocused;
Bitmap mCurrent;
int mWidth;
int mHeight;
public BitmapButtonField(Bitmap normal, Bitmap focused) {
super(CONSUME_CLICK);
mNormal = normal;
mFocused = focused;
mCurrent = normal;
mWidth = mNormal.getWidth();
mHeight = mNormal.getHeight();
setMargin(0, 0, 0, 0);
setPadding(0, 0, 0, 0);
}
protected void onFocus(int direction) {
mCurrent = mFocused;
invalidate();
}
protected void onUnfocus() {
mCurrent = mNormal;
invalidate();
}
protected void paint(Graphics graphics) {
Bitmap bitmap = mCurrent;
graphics.drawBitmap(0, 0, bitmap.getWidth(), bitmap.getHeight(),
bitmap, 0, 0);
}
protected void applyTheme() {
}
public int getPreferredWidth() {
return mWidth;
}
public int getPreferredHeight() {
return mHeight;
}
protected void layout(int width, int height) {
setExtent(mWidth, mHeight);
}
}
ОБНОВЛЕНИЕ 5
Я нашел решение. Мое меню сейчас работает! Спасибо за вашу помощь обо всем на эту тему! Я мог бы открыть новую тему для самого меню, потому что не уверен, что делать циклический (сложный из-за разного размера экрана и разрешения, чтобы быть в центре и иметь значок все время в середине.) См. Ниже код в моем MapScreen .java
protected boolean navigationMovement(int dx, int dy, int status, int time) {
if (mMenuHostManager.isActive()) {
return super.navigationMovement(dx, dy, status, time);
}
return mapField.navigationMovement(dx, dy, status, time);
}
protected boolean navigationClick(int status, int time) {
if (mMenuHostManager.isActive()) {
return super.navigationClick(status, time);
}
return true;
}
protected boolean navigationUnclick(int status, int time) {
if (mMenuHostManager.isActive()) {
return super.navigationUnclick(status, time);
}
return true;
}