Blackberry - как реализовать плавную прокрутку ListField?

Обзор
Я использую класс listfield для вертикального отображения набора информации. Каждая строка этого поля списка занимает 2/5 высоты экрана.

Таким образом, при прокрутке к следующему элементу (особенно при отображении элемента, частично скрытого ограничениями высоты экрана), все действие прокрутки / фокуса очень прерывистое.

Я хотел бы исправить эту резкость, реализовав плавную прокрутку между действиями прокрутки / фокуса. Возможно ли это с классом ListField?

Пример
Ниже приведен снимок экрана, на котором показана рассматриваемая проблема.

alt text
(источник: perkmobile.com )

Как только пользователь прокручивает строку до ListFieldTHREE, эта строка "прокручивается" в поле зрения очень скачкообразно, без плавной прокрутки. Я знаю, что уменьшение высоты строки смягчит эту проблему, но я не хочу идти по этому пути.

Главный вопрос
Как сделать плавную прокрутку в ListField?


person Community    schedule 15.07.2009    source источник


Ответы (3)


Предполагая, что вам нужно поведение, при котором пользователь прокручивает трекбол вниз на 1 щелчок, а затем выделяется следующий элемент, но вместо немедленного перехода прокрутки вы получаете плавную прокрутку, чтобы сделать новый элемент видимым (например, в приложении Google Gmail для BlackBerry) вам придется накатить собственный компонент.

Основная идея состоит в том, чтобы создать подкласс VerticalFieldManager, затем при прокрутке (выключить метод moveFocus) у вас есть отдельный поток, обновляющий переменную вертикального положения и несколько раз аннулирующий диспетчер.

Поток необходим, потому что, если вы думаете об этом, вы запускаете анимацию из пользовательского события - плавная прокрутка на самом деле является анимацией на BlackBerry, поскольку она длится дольше, чем событие, которое ее вызвало.

Я был немного расплывчатым в деталях, и это непросто сделать, так что, надеюсь, это немного поможет.

person Community    schedule 16.07.2009
comment
Это имеет смысл. Один вопрос, однако, означает ли это, что я отключаю прокрутку на самом ListField ИЛИ прокручиваю вертикальное поле, а затем позволяю ListField получать свое событие прокрутки, чтобы элемент управления мог внутренне управлять собой соответственно (зная, какая строка выбрана ...)? - person AtariPete; 17.07.2009

Насколько мне известно, не существует официального способа сделать это через API, но его, вероятно, можно обмануть с помощью умного использования NullField (Field.FOCUSABLE), а именно, сколько пользовательских интерфейсов BlackBerry реализуют поведение принудительного фокуса.

Один из подходов состоит в том, чтобы получить каждый «элемент списка» из класса, который чередует фокусируемые поля NullFields с видимым содержимым самого элемента списка - это, по сути, заставит систему прокрутки «прыгать» с меньшими интервалами, а не с большими интервалами, продиктованными естественное деление между элементами списка, и будет иметь побочное преимущество в том, что не изменяет видимое расположение содержимого элемента списка.

person Community    schedule 15.07.2009

если вы не хотите переопределить способ рисования поля списка или создать свою собственную оболочку, у вас всегда будет эта проблема, потому что каждая строка всегда видна при прокрутке. Попробуйте вместо этого использовать labelfield.

person Community    schedule 15.07.2009