2010-06-07 4 views
3

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; 
} 
+0

덕분에 내 시간 –

답변

0

alt text http://img534.imageshack.us/img534/9679/overlay1o.jpgalt text http://img243.imageshack.us/img243/4176/overlay2.jpg

안녕! 화면 자체 콘텐츠 관리자가 있으며 불행히도 화면 레벨에서 맞춤형 하위 레이아웃을 만들 수 없습니다. 메뉴를 별도의 관리자로 이동해야합니다.

는 전체 코드를 참조하십시오 update4에 대한

class Scr extends MenuScreen { 
    public Scr() { 
     mMenuHostManager.add(new LabelField(
       "Lorem ipsum dolor sit amet, consectetur " 
         + "adipiscing elit. Vestibulum egestas eleifend " 
         + "urna, in dictum erat auctor ac. Integer " 
         + "volutpat ultricies mauris eu accumsan. " 
         + "Quisque at euismod dui. Phasellus " 
         + "faucibus orci id libero interdum a " 
         + "feugiat lacus sodales. Nullam " 
         + "pulvinar vestibulum dolor " 
         + "rhoncus tristique.")); 
    } 
} 

class MenuScreen extends MainScreen { 
    MenuHostManager mMenuHostManager; 

    public MenuScreen() { 
     mMenuHostManager = new MenuHostManager(); 
     add(mMenuHostManager); 
    } 

    protected boolean keyDown(int keycode, int time) { 
     if (Keypad.KEY_MENU == Keypad.key(keycode)) { 
      mMenuHostManager.toggleMenu(); 
      return true; 
     } else { 
      return super.keyDown(keycode, time); 
     } 
    } 
} 

class MenuHostManager extends HorizontalFieldManager { 
    CyclicHFManager mMenuManager = null; 

    public MenuHostManager() { 
     super(USE_ALL_WIDTH | USE_ALL_HEIGHT); 
     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 
       .createSolidTransparentBackground(Color.DARKBLUE, 100)); 

     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 void sublayout(int width, int height) { 
     super.sublayout(width, height); 
     if (mMenuManager.getManager() != null) { 
      layoutChild(mMenuManager, mMenuManager.getPreferredWidth(), 
        mMenuManager.getPreferredHeight()); 
      setPositionChild(mMenuManager, 0, 0); 
     } 

    } 

    public void toggleMenu() { 
     if (mMenuManager.getManager() != null) { 
      delete(mMenuManager); 
      mMenuManager.mCyclicTurnedOn = false; 
     } else { 
      add(mMenuManager); 
      updateLayout(); 
      mMenuManager.getField(2).setFocus(); 
      mMenuManager.mCyclicTurnedOn = true; 
     } 
    } 
} 

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); 
    } 
} 

class BitmapButtonField extends ButtonField { 
    Bitmap mNormal; 
    Bitmap mFocused; 
    Bitmap mActive; 

    int mWidth; 
    int mHeight; 

    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))); 
    } 

    protected void paint(Graphics graphics) { 
     Bitmap bitmap = null; 
     switch (getVisualState()) { 
     case VISUAL_STATE_NORMAL: 
      bitmap = mNormal; 
      break; 
     case VISUAL_STATE_FOCUS: 
      bitmap = mFocused; 
      break; 
     case VISUAL_STATE_ACTIVE: 
      bitmap = mFocused; 
      break; 
     default: 
      bitmap = mNormal; 
     } 
     graphics.drawBitmap(0, 0, bitmap.getWidth(), bitmap.getHeight(), 
       bitmap, 0, 0); 
    } 

    public int getPreferredWidth() { 
     return mWidth; 
    } 

    public int getPreferredHeight() { 
     return mHeight; 
    } 

    protected void layout(int width, int height) { 
     setExtent(mWidth, mHeight); 
    } 
} 
+0

최대 저장 BitmapButtonField, 다시, 감사합니다! 이것은 훌륭하게 작동하며, 내가 원했던 것입니다. 그러나 나는 4.5 이하이기 때문에 여전히 문제가있다. 먼저 MenuHostManager 생성자에서 USE_ALL_HEIGHT를 삭제하고 setPositionChild (mMenuManager, 0, Display.getHeight() - mMenuManager.getPreferredHeight())를 변경합니다. 이렇게하면 화면 하단에 메뉴가 나타납니다. 그것은 효과가 있었다. 비트 맵 nBitmap = EncodedImage.getEncodedImageResource ("menu"+ i + ".png"). getBitmap(); BitmapButtonField 버튼 = 새 BitmapButtonField (nBitmap, nBitmap); – Dachmt

+0

그리고 그것도 효과가있었습니다 (지금은 롤오버가 없습니다, 나중에). 그래서 대단합니다! 또한 BorderFactory와 BackgroundFactory를 사용할 수 없기 때문에 배경색을 갖기 위해 CyclicHFManager의 Paint 메서드를 덮어 씁니다 ... 이제는 내 메뉴 표시 줄에 색상이있어서 ok입니다. 그런 다음이 두 클래스가 없어서 BitmapButtonField에서 테두리를 변경하는 2 setBorder 함수를 삭제해야했습니다.그리고 이제는 테두리가있는 일반 버튼처럼 버튼이 꽤 큽니다 ... 4.5에서 setBorder 기능과 동일한 효과를 내려면 어떻게해야합니까? (BTW, setBorder는 4.5 이하에서도 작동하지 않습니다 ...). 고맙습니다! – Dachmt

+0

여러분을 환영합니다! :) 큰 텍스트의 경우 질문을 업데이트하거나 새 질문을 작성하는 것이 좋습니다. 그러나이 경우에는 중복 될 것입니다. 4.5의 경계선은 http://stackoverflow.com/questions/1135349/blackberry-how-to-add-border-to-basiceditfield –

관련 문제