|
|
|||||
Регистрация: May 2011
Сообщений: 221
|
Скроллящееся меню
Итак, идея – создать компонент содержащий в себе много ячеек-элементов (например кнопок) с различными их реализациями (разные иконки, текст и прочее содержание ячейки). Все это дело скроллится при помощи захвата мышью + флик.
С первого взгляда все просто, берем массив Object'ов и по ним собираем компонент самым обыкновеным способом, прикручиваем функционал перетаскивание+флик и вуаля. Все становится хуже если этих элементов становится стопицотмиллионовтыщ. В этом случае все вешается нафик. Идея – создавать элементы «на лету», когда они должны оказаться в области видимости и уничтожать их, когда они за пределы видимости выходят. Вопрос: как это правильно архитектурно организовать? Гипотеза: в контейнер для элементов поместить n (где n максимальное количество ячеек умещающихся в области видимости) ячеек-подложек и прокручивать их. Как только хотя бы одна из них покинет область видимости – переместить ее в противоположный конец «стэка» при этом динамически составлять наполнение из источника данных. Вопрос 1: как будет правильнее определять момент покидания ячейки области видимости? Предположение: завести переменную с индексом верхнего (на данный момент времени) элемента и вычислять его по формуле Цитата:
Цитата:
Цитата:
Цитата:
Вопрос 3: как правильнее определить момент, когда необходимо закончить переставление ячеек (дошли до конца массива)? Предположение: Проверить значение верхнего элемента, если оно меньше нуля или зачение верхнего элемента + число видимых ячеек больше длины массива-источника данных – прекратить. Я опробовал данное решение, но что-то в нем работает не так радужно как я ожидал. К примеру при отматывании до упора вниз и при поднимании обратно наверх ячейки начинают переноситься не с того места и т.д. и т.п. Собственно я бы хотел получить объективную оценку изложенной концепции, насколько она жизнеспособна, есть ли еще какие-либо решения данной задачи, а то и может быть вовсе где-нибудь есть исходники, которые можно почитать? Просто честно сказать – я угуглился, но не смог найти ничего по теме. Помогите кто чем может, сами мы не местные... |
|
|||||
Регистрация: Jul 2005
Сообщений: 135
|
2. используйте один контейнер и scrollRect
мысли и направление у вас правильные, продолжайте копать если у вас ячейки одинаковые по типу (например картинка и внизу текст), то используйте пул объектов (это просто массив), когда нужно ячейку удалить - кладите его в этот пул, когда нужно добавить, то берете из пула, заменяете в нем данные и добавляйте его в контейнер, если в пуле нет объектов - создаете новый так же воздержитесь от сотен addChild removeChild, при уходе объекта из видимости сделайте его сначала невидимым и остановите в нем все таймеры, ентрефреймы и анимации, вдруг в следующем кадре вам уже понадобиться новый объект, тогда вы его возьмете и пропишите новые данные в нем. Ну а если не понадобиться то постепенно, скажем, на каждый ентерфрейм делайте removeChild по одному объекту из этих невидимых, или когда прекращается анимация скроллирования
__________________
хоумпага |
|
|||||
Регистрация: May 2011
Сообщений: 221
|
Спасибо за комментарий, тем не менее появился еще один вопрос: получается, что ячейки (целиком и подложка и содержимое), вышедшие за пределы видимости необходимо складывать в пул и при удобном случае именно удалить из списка отображения? Просто из того, что мною было прочитано, рассказыалось о концепции повторного использования ячеек и мне все думалось, что одни и те же ячейки-подложки надо крутить каруселью, и всякий раз, когда это будет необходимо просто менять координаты ячейке-подложке попутно задавая ей новое содержимое. Правильно ли я понимаю, что на саомм деле концепция повторного использования ячеек заключается в том, чтобы уже сконструированные ячейки хранить в массиве для того, чтобы потом для них просто не выхывать метод-конструктор?
|
|
|||||
Регистрация: Jul 2005
Сообщений: 135
|
Цитата:
Цитата:
я расписал вам для общего случая, когда у вас содержимое ячеек меняется в размерах, из-за этого в области видимости в разные промежутки времени может быть разное кол-во объектов, поэтому чтобы не создавать заново объекты используется пул ещё бывает ситуация когда сам размер области видимости тоже меняется (ресайз окна) если у вас простой случай, когда в области видимости всегда помещается, например, 8 объектов и они неизменны по размерам, то вам всего понадобятся 9 экземпляров, и крутите их, как вы пишите, каруселью, меняя в них содержимое
__________________
хоумпага |
|
|||||
[+4 08.09.13]
Регистрация: May 2012
Сообщений: 131
|
контейнер, скролл рект для него.
внутри - ещё один контейнер для ячеек. каждая ячейка содержит метод - doLoad(например). Остаётсялишь сделать "lasy" загрузку по определённым условиям. И будет вам "щасье". |
Часовой пояс GMT +4, время: 23:40. |
|
« Предыдущая тема | Следующая тема » |
|
|