Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   CustomList + Tween на 4 айтема с переиспользованием айтемов (http://www.flasher.ru/forum/showthread.php?t=157380)

djyamato 04.06.2011 22:04

CustomList + Tween на 4 айтема с переиспользованием айтемов
 
Здравствуйте
Не могу подступиться правильно к решению следующей проблемы
Делаю кастомный лист (без использольания компонентов), в нем 4 видимых айтема
У него вместо сроллера 2 стрелочки, вниз-вверх перемещения списка. Перемещение айтемов происходить должно по 4 штуки сразу, причем, твином ! Когда пользователь доскроллировал список до конца, его нижний айтем должен упираться в низ маски даже если нечетное количество айтемов, или же оно не делится на 4 нацело.
Надо бы это сделать с переиспользованием созданных айтемов, вместо того чтобы создавать множество айтомов в списке.

Как я сделал:
Создал 8 айтемов - 4 видимых и 4 за границей нижней списка
При скроле списка вверх, те 4 айтема которые ушли вверх по окончании твина перемещаются под предидущие 4. Для них высчитываются ID-шки и обновляются данные, соответствующие их обновленным ID-шкам.
Все бы ничего, НО количество айтемов может быть и нечетным !!!
Как бы мне подсчитать все это ?
Возможно, кто-то уже делал подобное, натолкните на мысль пожалуйста

Вот часть кода
Код AS3:

private var totalVisible:int=4;
 
public function set bounds(rect:Rectangle):void
                {
                        _bounds=rect;
                        maskSprite.graphics.beginFill(0xFF0000,0.4);
                        maskSprite.graphics.drawRect(_bounds.x,_bounds.y,_bounds.width,_bounds.height);
                        maskSprite.graphics.endFill();
                        //itemsSprite.mask=maskSprite;
                }
 
public function set dataProvider(collection:ArrayCollection):void
                {
                        data=collection;
                        for(i=0;i<totalVisible*2;i++)
                        {
                                listItem=new CustomListItem(i,"hotel",data.getItemAt(i)); // i = ID айтема
                                itemsSprite.addChild(listItem);
                                listItem.y=i*(listItem.height);
                                totalVisibleItems.push(listItem);
                        }
                }
 
public function itemsUp():void
                {
                        for(i=0;i<totalVisibleItems.length;i++)
                        {
                                if(totalVisibleItems[i].y>_bounds.height)
                                {
                                        totalVisibleItems[i].y-=totalVisible*(listItem.height)*2;
                                        totalVisibleItems[i].ID=totalVisibleItems[i].ID-totalVisible*2;
                                        totalVisibleItems[i].data=data.getItemAt(totalVisibleItems[i].ID);
                                }
                                itemNextY=totalVisibleItems[i].y+(listItem.height)*totalVisible;
                                itemTween=new Tween(totalVisibleItems[i],"y",Strong.easeInOut,totalVisibleItems[i].y,itemNextY,tweenTime,true);
                                itemTween.addEventListener(TweenEvent.MOTION_FINISH,itemTweenFinishHandler);
                        }
                }
 
                public function itemsDown():void
                {
                        for(i=0;i<totalVisibleItems.length;i++)
                        {
                                itemNextY=totalVisibleItems[i].y-(listItem.height)*totalVisible;
                                itemTween=new Tween(totalVisibleItems[i],"y",Strong.easeInOut,totalVisibleItems[i].y,itemNextY,tweenTime,true);
                                itemTween.addEventListener(TweenEvent.MOTION_FINISH,itemTweenFinishHandler);
                        }
                }
 
                /////////////    handlers  ///////
                private function itemTweenFinishHandler(event:TweenEvent):void
                {
                        if(event.target.obj.y<0)
                        {
                                event.target.obj.y+=(event.target.obj.height)*totalVisible*2;
                                event.target.obj.ID=event.target.obj.ID+totalVisible*2;
                                event.target.obj.data=data.getItemAt(event.target.obj.ID);
                        }
                }

Я вот думаю, а не ошибся ли я, создавая 4 дополнительных невидимых айтема, а не 1

Dukobpa3 04.06.2011 22:23

ну дополняй пустыми ячейками до своих четырех если нечетное. Самый топорный вариант, но мне кажется как раз для этой ситуации ок.

djyamato 04.06.2011 22:29

Цитата:

Сообщение от Dukobpa3 (Сообщение 1001241)
ну дополняй пустыми ячейками до своих четырех если нечетное. Самый топорный вариант, но мне кажется как раз для этой ситуации ок.

Нет, к сожалению, неподходит

Bgg 04.06.2011 22:36

Цитата:

Надо бы это сделать с переиспользованием созданных айтемов, вместо того чтобы создавать множество айтомов в списке.
А зачем переиспользовать? Типо экономия памяти?

Dukobpa3 04.06.2011 22:44

Ну раз не подходит тогда давай точнее постановку задачи.

djyamato 05.06.2011 00:56

Цитата:

Сообщение от Bgg (Сообщение 1001244)
А зачем переиспользовать? Типо экономия памяти?

айтемов может быть и 500 и 1000, думаю, даже если, visible=false это будет неэкономично для ресурсов, или я ошибаюсь?

Цитата:

Сообщение от Dukobpa3 (Сообщение 1001245)
Ну раз не подходит тогда давай точнее постановку задачи.

Ну, как бы, все верно, вы хорошую мысль предлагаете, спасибо, разовью ее:
Есть у меня 9 айтемов, человек их скроллирует стрелками, дошел до 9й, если добавленные пустые айтемы увидит он это будет плохо.
9 айтемов, 3 раза нажатие вверх = 10,11,12 индексы (id-шки) у несуществующих но видимых айтемов, получается, что нужно расчитать величину смещения этих 4х айтемов чтобы не видно было 3х несуществующих ?

Bgg 05.06.2011 01:03

Смотря что за айтемы. Проверте сами, добавьте 1000 и посомтрите. Зачем придумывать сложную систему "экономии" ресурсов не зная нужна ли она?

Dukobpa3 05.06.2011 01:13

Ну я бы не проверял, это действительно может быть напряжно. Так а почему дополнение пустыми не подходит?

djyamato 05.06.2011 01:33

Цитата:

Сообщение от Dukobpa3 (Сообщение 1001265)
Ну я бы не проверял, это действительно может быть напряжно. Так а почему дополнение пустыми не подходит?

скролл возможен до последнего актуального айтема а не только по 4 штуки

Dukobpa3 05.06.2011 01:36

ну блин тогда не пустые вконец добавить а заполненные в начало последней пачки продублировать :)))

Тот же кран только в левой руке:)


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

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