Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.10.2012, 14:05
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 1  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
По умолчанию Скроллящееся меню

Итак, идея – создать компонент содержащий в себе много ячеек-элементов (например кнопок) с различными их реализациями (разные иконки, текст и прочее содержание ячейки). Все это дело скроллится при помощи захвата мышью + флик.

С первого взгляда все просто, берем массив Object'ов и по ним собираем компонент самым обыкновеным способом, прикручиваем функционал перетаскивание+флик и вуаля.

Все становится хуже если этих элементов становится стопицотмиллионовтыщ. В этом случае все вешается нафик.

Идея – создавать элементы «на лету», когда они должны оказаться в области видимости и уничтожать их, когда они за пределы видимости выходят.

Вопрос: как это правильно архитектурно организовать?

Гипотеза: в контейнер для элементов поместить n (где n максимальное количество ячеек умещающихся в области видимости) ячеек-подложек и прокручивать их. Как только хотя бы одна из них покинет область видимости – переместить ее в противоположный конец «стэка» при этом динамически составлять наполнение из источника данных.

Вопрос 1: как будет правильнее определять момент покидания ячейки области видимости?
Предположение: завести переменную с индексом верхнего (на данный момент времени) элемента и вычислять его по формуле
Цитата:
округлить в большую сторону(перемещение контейнера / (высоту ячейки + дистанция между ячейками))
Если индекс верхнего элемента изменился т.е. значение
Цитата:
старый верхний индекс - новый верхний индекс
больше нуля – выполнить перерассчет. При этом значение изменения дает нам значение количества ячеек, которое надо переставить. Знак этого значения говорит о том, с какой стороны нужно переставить ячейки (сверху или снизу), положение ячейки при добавлении сверху будет равно
Цитата:
(старый верхний индекс - 1 - значение итерации(в случае если мы передвинулись больше чем на одну ячейку)) * (высоту ячейки + дистанция между ячейками)
для нижней
Цитата:
(старый верхний индекс + количество видимых ячеек + значение итерации(в случае если мы передвинулись больше чем на одну ячейку)) * (высоту ячейки + дистанция между ячейками)
Вопрос 2: как лучше перемещать ячейки? Перемещать весь контейнер целиком или все же каждую ячейку отдельно?

Вопрос 3: как правильнее определить момент, когда необходимо закончить переставление ячеек (дошли до конца массива)?
Предположение: Проверить значение верхнего элемента, если оно меньше нуля или зачение верхнего элемента + число видимых ячеек больше длины массива-источника данных – прекратить.

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

Собственно я бы хотел получить объективную оценку изложенной концепции, насколько она жизнеспособна, есть ли еще какие-либо решения данной задачи, а то и может быть вовсе где-нибудь есть исходники, которые можно почитать? Просто честно сказать – я угуглился, но не смог найти ничего по теме. Помогите кто чем может, сами мы не местные...

Старый 08.10.2012, 17:17
kutuzov вне форума Посмотреть профиль Отправить личное сообщение для kutuzov Найти все сообщения от kutuzov
  № 2  
Ответить с цитированием
kutuzov
 
Аватар для kutuzov

Регистрация: Jul 2005
Сообщений: 135
2. используйте один контейнер и scrollRect

мысли и направление у вас правильные, продолжайте копать

если у вас ячейки одинаковые по типу (например картинка и внизу текст), то используйте пул объектов (это просто массив), когда нужно ячейку удалить - кладите его в этот пул, когда нужно добавить, то берете из пула, заменяете в нем данные и добавляйте его в контейнер, если в пуле нет объектов - создаете новый

так же воздержитесь от сотен addChild removeChild, при уходе объекта из видимости сделайте его сначала невидимым и остановите в нем все таймеры, ентрефреймы и анимации, вдруг в следующем кадре вам уже понадобиться новый объект, тогда вы его возьмете и пропишите новые данные в нем. Ну а если не понадобиться то постепенно, скажем, на каждый ентерфрейм делайте removeChild по одному объекту из этих невидимых, или когда прекращается анимация скроллирования
__________________
хоумпага

Старый 08.10.2012, 19:24
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 3  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
Спасибо за комментарий, тем не менее появился еще один вопрос: получается, что ячейки (целиком и подложка и содержимое), вышедшие за пределы видимости необходимо складывать в пул и при удобном случае именно удалить из списка отображения? Просто из того, что мною было прочитано, рассказыалось о концепции повторного использования ячеек и мне все думалось, что одни и те же ячейки-подложки надо крутить каруселью, и всякий раз, когда это будет необходимо просто менять координаты ячейке-подложке попутно задавая ей новое содержимое. Правильно ли я понимаю, что на саомм деле концепция повторного использования ячеек заключается в том, чтобы уже сконструированные ячейки хранить в массиве для того, чтобы потом для них просто не выхывать метод-конструктор?

Старый 08.10.2012, 19:53
kutuzov вне форума Посмотреть профиль Отправить личное сообщение для kutuzov Найти все сообщения от kutuzov
  № 4  
Ответить с цитированием
kutuzov
 
Аватар для kutuzov

Регистрация: Jul 2005
Сообщений: 135
Цитата:
вышедшие за пределы видимости необходимо складывать в пул и при удобном случае именно удалить из списка отображения?
если у вас этих объектов сотни, и эти объекты разные (то есть не взаимозаменяемы), то да, при удобном случае все же удалять, иначе нет. Опять же, тут может быть такая логика что оставлять только близкие например 10 слева и 10 справа, потому что они вероятнее всего скоро снова понадобятся

Цитата:
Правильно ли я понимаю, что на саомм деле концепция повторного использования ячеек заключается в том, чтобы уже сконструированные ячейки хранить в массиве для того, чтобы потом для них просто не выхывать метод-конструктор?
да

я расписал вам для общего случая, когда у вас содержимое ячеек меняется в размерах, из-за этого в области видимости в разные промежутки времени может быть разное кол-во объектов, поэтому чтобы не создавать заново объекты используется пул

ещё бывает ситуация когда сам размер области видимости тоже меняется (ресайз окна)

если у вас простой случай, когда в области видимости всегда помещается, например, 8 объектов и они неизменны по размерам, то вам всего понадобятся 9 экземпляров, и крутите их, как вы пишите, каруселью, меняя в них содержимое
__________________
хоумпага

Старый 09.10.2012, 11:36
Frost47rus вне форума Посмотреть профиль Отправить личное сообщение для Frost47rus Найти все сообщения от Frost47rus
  № 5  
Ответить с цитированием
Frost47rus
[+4 08.09.13]

Регистрация: May 2012
Сообщений: 131
контейнер, скролл рект для него.
внутри - ещё один контейнер для ячеек.
каждая ячейка содержит метод - doLoad(например). Остаётсялишь сделать "lasy" загрузку по определённым условиям. И будет вам "щасье".

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:40.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.