Проблема с прокруткой наследника BlackBerry Manager

#blackberry

#ежевика

Вопрос:

Я видел только несколько вопросов, связанных с BlackBerry, но я думаю, что осведомленные участники просто скромны 🙂

Вопрос в том, что я внедряю пользовательский менеджер. Все замечательно, за исключением прокрутки (в моем случае она горизонтальная). Вот часть моего кода:

 public class TemplateSelect extends Manager {
    public static int THUMBNAIL_WIDTH  = 150;
    public static int THUMBNAIL_HEIGHT = 150;

    private int width, height, lastX, sx;

    public TemplateSelect(int w, int h) {
        super(Manager.HORIZONTAL_SCROLL);
        width = w;
        height = h;     
    }

    public int getPreferredWidth() {
        return width;
    }

    public int getPreferredHeight() {
        return height;
    }

    protected void sublayout(int width, int height) {
        // Adding templates
        int top = 0, left = 0, deltaLeft = 0;

        for(int i = 0; i < getFieldCount(); i  ) {
            Template t = (Template) getField(i); 
            layoutChild(t, 0, 0);
            setPositionChild(getField(i), deltaLeft   left, top);

            if (left   THUMBNAIL_WIDTH > Display.getWidth()) {
                left = 0;
                if (top   THUMBNAIL_HEIGHT * 2 > getPreferredHeight()) {
                    deltaLeft  = getPreferredHeight();
                    top = 0;
                } else {
                    top  = THUMBNAIL_HEIGHT;
                }
            } else {
                left  = THUMBNAIL_WIDTH;
            }
        }

        setExtent(getPreferredWidth(), getPreferredHeight());
    }

    protected boolean touchEvent(TouchEvent message) {
        if (message.getEvent() == TouchEvent.DOWN) {
            // Save down click location
            lastX = message.getGlobalX(1);
            sx = lastX;
        } else
        if (message.getEvent() == TouchEvent.UP) {
            Template t = (Template) getFieldWithFocus();

            int delta;
            if (lastX - message.getGlobalX(1) > 0) {
                delta = t.getX()   getPreferredWidth();
            } else {
                delta = t.getX() - getPreferredWidth();
            }

            Template next = (Template) getField(getFieldAtLocation(delta, t.getY()));
            if (next != null) {
                next.setFocus();
            } else {
                Dialog.inform("NULL");
            }
        } else 
            if (message.getEvent() == TouchEvent.MOVE) {
                lastX = sx;
                setHorizontalScroll(getHorizontalScroll()   sx - message.getGlobalX(1), true);
                System.out.println(getHorizontalScroll());
                sx = message.getX(1);
            }
        return false;
    }
}
  

Я вызываю setHorizontalScroll, после этого немедленно проверяю его значение, но оно остается равным нулю ( и прокрутка не происходит.

Чего я не учел? В чем может быть проблема?

Заранее спасибо за любую помощь.

Ответ №1:

Я решил проблему, разбив свой компонент на страницы и поместив их в HorizontalFieldManager

Ответ №2:

setHorizontalScroll(getHorizontalScroll() sx - message.getGlobalX(1), true);

Второй аргумент для true активирует анимацию. Таким образом, он не может сразу получить ожидаемый объем прокрутки.

Если вы пишете для OS 6 и 7, я бы посоветовал использовать стандартное поведение прокрутки и активировать ваш код TouchEvent с помощью препроцессоров

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

1. Как я могу разрешить стандартное поведение прокрутки? Дело в том, что если я унаследовал от VerticalFieldManager — прокрутка в моем коде работает, но в то же время неправильно работает макет.