2010-04-16 31 views

Odpowiedz

10

Co trzeba zrobić, to:

  • tworzyć SizebleVFManager (CONTENTMANAGER) jako przedłużenie VerticalFieldManager
  • zestaw wysokość i szerokość obrazu = (wysokość wyświetlacza - wysokość menu) size CONTENTMANAGER
  • dodać CONTENTMANAGER do ekranu
  • tworzenia HorizontalFieldManager (menuManager)
  • tworzyć BitmapButtonField (MenuButton) jako eXten sion z ButtonField
  • zestaw FieldChangeListeners do menuButtons
  • dodać menuButtons do menuManager
  • dodać menuManager do ekranu

próbka SizebleVFManager:

class SizebleVFManager extends VerticalFieldManager 
{ 
    int mWidth = 0; 
    int mHeight = 0; 
    public SizebleVFM(int width, int height, long style) { 
     super(style); 
     mWidth = width; 
     mHeight = height; 
    } 

    public SizebleVFM(int width, int height) { 
     mWidth = width; 
     mHeight = height; 
    } 

    public int getPreferredWidth() { 
     return mWidth; 
    } 

    public int getPreferredHeight() { 
     return mHeight; 
    } 

    protected void sublayout(int width, int height) { 
     width = getPreferredWidth(); 
     height = getPreferredHeight(); 
     super.sublayout(width, height); 
     setExtent(width, height); 
    } 
} 

...

SizebleVFManager contentManager = 
    new SizebleVFManager(Display.getWidth(), Display.getHeight(), 
     VERTICAL_SCROLL|VERTICAL_SCROLLBAR); 

Zobacz także
sample of BitmapButtonField and Toolbar

PS chociaż jej lepiej użyć standardowe menu ...

UPDATE

Jeśli chcesz wyłączyć funkcję domyślnego menu, anuluj MENU keyDown:

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

UPDATE

mam zainstalowane, że wspaniały weather application i rozumieć to próbka może być bardziej podobni kilka ulepszeń:

  • użycie CyclicHFManager jako przedłużenie HorizontalFieldManager
  • pokaż/ukryj menuManager przycisk menu kliknij

CyclicHFManager jest menedżerem, który będzie w dalszym ciągu koncentrował się na tym samym miejscu i będzie prowadził wszystkie pola w cyklu.Podobnie jak w BlackBerry - Custom centered cyclic HorizontalFieldManager

class CyclicHFManager extends HorizontalFieldManager { 
    int mFocusedFieldIndex = 0; 
    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); 
    } 
} 

alt text http://img109.imageshack.us/img109/6176/toolbarj.jpg

i całe próbki kodu:

abstract class AScreen extends MainScreen { 
    boolean mMenuEnabled = false; 
    SizebleVFManager mContentManager = null; 
    CyclicHFManager mMenuManager = null; 

    public AScreen() { 
     mContentManager = new SizebleVFManager(Display.getWidth(), Display 
       .getHeight(), VERTICAL_SCROLL | VERTICAL_SCROLLBAR); 
     add(mContentManager); 

     // mMenuManager = new CyclicHFManager(Display.getWidth(), 60); 
     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, 
        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; 
       mContentManager.updateSize(Display.getWidth(), Display 
         .getHeight()); 
      } else { 
       add(mMenuManager); 
       mMenuManager.getField(2).setFocus(); 
       mMenuManager.mCyclicTurnedOn = true; 
       mContentManager.updateSize(Display.getWidth(), Display 
         .getHeight() 
         - mMenuManager.getHeight()); 
      } 
      return true; 
     } else 
      return super.keyDown(keycode, time); 
    } 
} 

class FirstScreen extends AScreen { 

    public FirstScreen() { 
     mContentManager.add(new LabelField("This is a first screen")); 
    } 
} 

public class ToolbarMenuApp extends UiApplication { 

    public ToolbarMenuApp() { 
     pushScreen(new FirstScreen()); 
    } 

    public static void main(String[] args) { 
     (new ToolbarMenuApp()).enterEventDispatcher(); 
    } 

} 
+0

Niesamowite odpowiedź, max. Po raz kolejny robisz wszystko, by opublikować szczegółową odpowiedź z kodem. Szkoda, że ​​nie mogłem tego zrobić +5. :) –

+0

Dzięki Mark! :) –

+0

W przyszłym tygodniu ponownie rozpocznę pracę nad tym projektem, ale to, co przeczytałem i szybko wypróbowałem, wygląda świetnie! Jest bardzo pomocny, dziękuję! Nadal potrzebuję jakiejś regulacji, aby zrobić to, co chcę (dokładnie to samo, co aplikacja WeatherEye), tak jak menu widoczne (włącz) przez cały czas, a alarm działa (mam zamiast tego biały ekran). Wrócę tu w przyszłym tygodniu, jestem pewien, ahah. Ale jeszcze raz DZIĘKUJĘ! – Dachmt

Powiązane problemy