Диспетчер BitmapField в стиле слайдшоу для Blackberry - PullRequest
0 голосов
/ 27 апреля 2010

Сейчас я пытаюсь выяснить, как реализовать следующее:

Предположим, у меня есть собственный менеджер, который имеет около 10 или около того BitmapFields, расположенных горизонтально (по аналогии со слайд-шоу, содержащимся в HFM). Чего я хочу добиться, так это иметь возможность перемещать изображение HFM через touchEvent по горизонтали, где BitmapField будет фокусироваться на левой стороне пользовательского диспетчера. Другими словами, придется ли мне присваивать значение setHorizontScroll, и если да, то нужно ли просто увеличивать это значение, когда пользователь делает событие касания влево или вправо. Кроме того, как я могу получить фокус поля в заданной позиции на экране (то есть самое левое поле на HFM), когда HFM прокручивается вбок с помощью touchEvent?

1 Ответ

0 голосов
/ 29 апреля 2010

1 - да, setHorizontScroll должен работать, не забудьте использовать HORIZONTAL_SCROLL в конструкторе менеджера

2 - попробуйте проверить каждое поле getContentRect () для EventTouch getX (int) и getY (int)

ОБНОВЛЕНИЕ

Чтобы упростить вычисление положения глобального поля, используйте

    public XYPoint getGlobalXY(Field field) {
        XYPoint result = new XYPoint(field.getLeft(), field.getTop());
        if (field.getManager() != null) {
            result.translate(getGlobalXY(field.getManager()));
        }
        return result;
    }

Диалоговое окно с сообщением о потоке:

    public void showMessage(final String message) {
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                Dialog.inform(message);
            }
        });

    }

Пример кода:

class Scr extends MainScreen {
    HorizontalFieldManager hfm;    
    public Scr() {
        add(new LabelField("asdfsad"));
        hfm = new HorizontalFieldManager(HORIZONTAL_SCROLL);
        for (int i = 0; i < 5; i++) {
            Bitmap bmp = new Bitmap(100, 100);
            Graphics g = Graphics.create(bmp);
            g.setFont(g.getFont().derive(100));
            String txt = String.valueOf(i);
            int x = g.getFont().getAdvance(txt);
            g.drawText(txt, x, 0);
            BitmapField bf = new BitmapField(bmp);
            hfm.add(bf);
        }
        add(hfm);
    }        

    protected boolean touchEvent(TouchEvent message) {
        if (message.getEvent() == TouchEvent.CLICK) {
            int x = message.getX(1);
            int y = message.getY(1);
            XYRect r = hfm.getExtent();
            r.setLocation(getGlobalXY(hfm));    
            if (r.contains(x, y)) {
                XYRect rf = hfm.getField(2).getExtent();
                rf.setLocation(getGlobalXY(hfm.getField(2)));    
                if (x < rf.x) {
                    showMessage("left side");
                } else if (x > rf.X2()) {
                    showMessage("right side");
                } else {
                    showMessage("field");
                }
            }
        }
        return super.touchEvent(message);
    }
}
...