this post의 맥스 덕분에 가로 메뉴를 만들었습니다. 하지만 지금은 오버레이 메뉴를 만들려고하는데, 어떻게 해야할지 모르겠다. 내가 무엇을 얻었는지 보자.검은 딸기 사용자 정의 오버레이 가로 메뉴
그래서, 내지도 표시 클래스 MapScreen이 : 나는 동일한 파일에있는, 그리고
public class MapScreen extends MenuScreen
을 나는 MENU 키를 누르면 수평 메뉴를 표시 할 수 있도록이 같은 MenuScreen 클래스 :
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);
}}
는 다음과 같이이기 때문에, 그것을 작동 중입니다 : 메뉴 키를 누르면 메뉴가 나타나고 버튼 사이를 탐색 할 수 있으며 다시 동일한 키를 누르면 사라집니다. 유일한 문제는 내 메뉴가 내지도를 덮지 않는다는 것입니다. 콘텐츠가 푸시됩니다. 첫 번째 응답 에서처럼 메뉴 관리자를 사용하여 내용 관리자의 크기를 조정했지만 동일한 결과가 나타납니다.
최대 그렇게 나에게 링크 Blackberry - fields layout animation을했다,하지만 난 정말
는 당신의 도움을 주셔서 감사합니다 ... 내 프로젝트에서 작동하도록 그것을 사용하는 방법을 모르겠어요!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);
그리고 그것은 (나중에, 지금은 롤오버를) 너무 일하지 :
다음, 대신 내 비트 맵 그리기, 나는 이런 짓을. 그래서 대단합니다!
BorderFactory와 BackgroundFactory를 사용할 수 없기 때문에 배경색을 갖기 위해 CyclicHFManager의 Paint 메서드를 덮어 씁니다. 이제는 내 메뉴 표시 줄에 색상이있어서 괜찮습니다.
그런 다음이 2 개의 클래스가 없어서 BitmapButtonField에서 테두리를 변경하는 2 개의 setBorder 함수를 삭제해야했습니다. 그리고 이제는 테두리가있는 일반 단추처럼 단추가 꽤 큽니다 ...
4.5에서 setBorder 기능과 동일한 효과를 내려면 어떻게해야합니까? (BTW, setBorder는 4.5 이하에서도 작동하지 않습니다 ...).
감사합니다. 2
UPDATE이 코드를 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)));
}
스크린 샷 :
그리고 4에서 i45.tinypic.com/4sz85u.jpg
.i49.tinypic.com/rartz5.jpg 그리고 5.0에서 만 4.5로 첫 스크린 샷을 싶습니다
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);
}
스크린 샷 : 삭제 2 setBorder 기능 5 (사용할 수없는 때문에)!
UPDATE 3
나는
protected void applyTheme() {
}
더 이상 국경이 없습니다 그것은 멋지다 추가하여 문제를 해결!
내 롤오버에 집중해야하고 클릭 동작이 필요합니다 (시뮬레이터에서 클릭 할 때 대화 상자가 없습니다). BackgroundFactory.createLinearGradientBackground를 사용할 수 없기 때문에 메뉴 관리자의 배경을 변경하는 데 성공했습니다. 그림을 그립니다.
getVisualState() 함수가있을 때 어떻게 롤오버를 관리 할 수 있습니까?
UPDATE 4
I가 getVisualState를 이용하지 않고 그것 롤오버를 만들기 위해 BitmapButtonField 조금 변화().
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);
}
}
UPDATE 5
나는 해결책을 발견 : 그것은 그렇게 정말 좋은 있는지 모르겠어요,하지만이 작동 (I는 임시 비트 맵 mCurrent를 사용). 내 메뉴가 작동 중입니다! 이 주제에 대한 모든 도움을 주셔서 감사합니다. 순환적인 작업을 수행 할 것인지 확신 할 수 없으므로 메뉴 자체에 대한 새로운 주제를 열 수 있습니다 (화면 크기와 해상도가 다르기 때문에 복잡해져 중간에 아이콘이 표시됩니다.) 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;
}
덕분에 내 시간 –