четверг, 15 октября 2009 г.

BlackBerry Layer UI Manager

     Выбор layout manager (на русский это лучше не переводить) в библиотеке BlackBerry явно не блещет разнообразием. Абстрактный Manager и его наследники FlowFieldManager, HorizontalFieldManager, VerticalFieldManager - все, на что решились ребята из RIM (есть конечно еще DialogFieldManager, но это комбинация предыдущих...).
     Может этого и хватит для страшненького простенького интерфейса, но для чего-то более приятного глазу явно мало. В официальной документации советуют создавать собственные имплементации, чем и приходится заниматься.
     Наиболее востребованными оказались 2 метода расположения элементов:
  • слоистый (каждый следующий добавленный элемент располагается сверху предыдущего, левый верхний угол - точка (0,0))
  • абсолютный (элементы помещаются на родителя с указанием абсолютных координат (x,y) )
     Если второй метод я мог заменить компонованием разных лейаутов (это в 90% случаев получалось), то первый заменить стандартными менеджерами не представлялось возможным в рамках поставленной задачи.
вот что из этого получилось. Метод №1:
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Manager;
public class AXHSimpleLayeredFieldManager extends Manager {

 public AXHSimpleLayeredFieldManager(long l) {
  super(l);
 }

 protected void sublayout(int width, int height) {
                //Display.getWidth() || Graphics.getScreenWidth()
  int maxWidth = Config.SCREEN_WIDTH;
                //Display.getHeight() || Graphics.getScreenHeight()
  int maxHeight = Config.SCREEN_HEIGHT;//
  for (int i = 0, n = getFieldCount(); i < n; i++) {
   Field field = getField(i);
   layoutChild(field, Display.getWidth(), Display.getHeight());
   long fieldStyle = field.getStyle();
   long fieldHalign = fieldStyle & Field.FIELD_HALIGN_MASK;
   int fieldXOffset = 0;
   if (fieldHalign == Field.FIELD_RIGHT) {
    fieldXOffset = maxWidth - field.getWidth();
   } else if (fieldHalign == Field.FIELD_HCENTER) {
    fieldXOffset = (maxWidth - field.getWidth()) / 2;
   }
   int fieldYOffset = 0;
   long fieldValign = fieldStyle & Field.FIELD_VALIGN_MASK;
   if (fieldValign == Field.FIELD_BOTTOM) {
    fieldYOffset = maxHeight - field.getHeight();
   } else if (fieldValign == Field.FIELD_VCENTER) {
    fieldYOffset = (maxHeight - field.getHeight()) / 2;
   }
   setPositionChild(field, fieldXOffset, fieldYOffset);
  }
  setExtent(maxWidth, maxHeight);
 }
}

Комментариев нет:

Отправить комментарий