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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.07.2013, 19:47
il phoenix вне форума Посмотреть профиль Отправить личное сообщение для il phoenix Найти все сообщения от il phoenix
  № 1  
Ответить с цитированием
il phoenix

Регистрация: Apr 2009
Сообщений: 77
По умолчанию Баг в spark List

Добрый день, столкнулся с таким неприятным багом в flex spark компаненте List: реализовал постраничное листание элементов с помощью этого контрола, и когда свойству dataProvider присваиваешь новую коллекцию элементов в нем все элементы инвертируются, но дополнительного события dataChange в каждом ItemRenderer не происходит. Это заметно, т.к. нужно было реализовать анимацию переворачивания карты когда в ItemReтвукук происходит dataChange. Кто-нибудь сталкивался? Или может посоверуете другой контрол для постраничного вывода? Как быть?

В приложении флешка с примером бага постраничного листания, если непонятно написал.
Вложения
Тип файла: swf CrazyPokerFlex.swf (751.1 Кб, 49 просмотров)

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
"Я тут что-то сделал и оно как-то не так работает".
Ну почему все надо клещами вытаскивать? Вам помощь нужна или сочувствие?

Добавлено через 5 минут
P.S. Для этого не обязательно менять dataProvider.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 22.07.2013, 09:34
il phoenix вне форума Посмотреть профиль Отправить личное сообщение для il phoenix Найти все сообщения от il phoenix
  № 3  
Ответить с цитированием
il phoenix

Регистрация: Apr 2009
Сообщений: 77
Цитата:
Вам помощь нужна или сочувствие?
Мне бы помощь)) желательно чтобы менять нужно было по минимуму, я просто думал может быть это известный баг, и есть какой-то простой способ его пофиксить.

Цитата:
Ну почему все надо клещами вытаскивать?
Д я вробе бы ничего особенного не использую.
1. Есть List
2. для него есть ItemRenderer, в нем на событии dataChange стартует ScaleEffect от 0 до 1, потом обновляются иконки и тексты для новых данных, и запускается ScaleEffect от 0 до 1, получается эффект переворачивания карты
3. в контроллере при нажатии на кнопки влево/вправо в свойство dataProvider кладу новый ArrayList. вот вроде бы все, все стандартно

этот баг особенно хорошо заметен при перелистывании первой страницы на вторую, там есть элемент с синей лентой, он стоит на 4 месте в первом ряду, а после нажатия на кнопку ">" он становится вторым во втором ряду, а если поменять у List layout c TileLayout на HorisontalLayout, то элементы будут выстраиваться в ряд, и этот синий элемент будет стоять так же на 4 месте, а при нажатии на кнопку ">" на 7, т.е. на 4 ом месте с конца, и если приглядеться то можно заметить что остальные элементы так же, инвертируются относительно центра. Хочу еще раз отметить что никакого дополнитильного события dataChange в ItemRenderer не происходит, т.е. это мой код который только и должен менять внешний вид у ItemRenderer отрабатывает только один раз, тогда когда надо, в момент когда ScaleEffect который сворачивает карту выполнен, и ScaleEffect который разворачивает карту еще не начался, т.е. когда scale у элемента = 0

вот выложу исходники на всякий случай

ItemRenderer:
Код:
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/halo"
			   dataChange="onDataChange(event)">
	
	<fx:Script>
		<![CDATA[
		
		import flash.events.Event;
		import flash.utils.setTimeout;
		
		private function onDataChange(e:Event):void
		{
			setTimeout(hideEffect.play, 50 * itemIndex);
		}
		
		private function onHideEnd(e:Event):void
		{			
			bindData();
			showEffect.play();
		}
		
		private function bindData():void
		{			
			var ach:Achievement = Achievement(data);
			icon.source = AchievementIcons.defineByType(ach.type);
			achievementName.text = AchievementsNameLocale.defineByType(ach.type);
			if (achievementName.text.length > 12)
				achievementName.text = achievementName.text.substr(0, 12);
			if(ach.isAchieved)
			{
				isAchieved.source = CommonIcons.complete;
				isAchieved.visible = true;
			}
			else
			{
				isAchieved.visible = false;
			}
		}
		
		]]>
	</fx:Script>
	
	<fx:Declarations>
		<s:Scale id="showEffect" target="{effectTarget}" scaleXFrom="0" scaleXTo="1" duration="200" />
		<s:Scale id="hideEffect" scaleXFrom="1" target="{effectTarget}" scaleXTo="0" duration="200" effectEnd="onHideEnd(event)" />
	</fx:Declarations>
			 
	<s:Group id="effectTarget" x="50">
	<s:Group id="container" x="-50">
		<s:Rect width="100" height="110" radiusX="10" radiusY="10">
			<s:fill>
				<s:SolidColor color="0xffffff" />
			</s:fill>
			<s:stroke>
				<s:SolidColorStroke color="0x000000" weight="1" />
			</s:stroke>
		</s:Rect>
		
		<s:VGroup horizontalAlign="center" width="100%" top="5">
			<s:BitmapImage id="icon" />
			<s:RichText id="achievementName" />
		</s:VGroup>
		
		<s:BitmapImage id="isAchieved" right="5" bottom="5" />
	</s:Group>
	</s:Group>
	
</s:ItemRenderer>
Вот так создаю List
PHP код:
<s:HGroup verticalAlign="middle" horizontalCenter="0" top="135">
            <
s:Button id="ahievementsPrev" skinClass="view.buttons.PrevButtonSkin" />
            <
s:List id="ahievements" width="531" height="230" 
                
itemRenderer="view.controls.AhievementRenderer"
                
borderVisible="false" contentBackgroundAlpha="0">
                <
s:layout>
                    <
s:TileLayout horizontalAlign="center" />
                </
s:layout>
            </
s:List>
            <
s:Button id="ahievementsNext" skinClass="view.buttons.NextButtonSkin" />
        </
s:HGroup
вот код контроллера, который клики кнопок обрабатывает

achievementsPaginator.current() возвращает Array

Код AS3:
 
 
		private function onAchievementsPrevClick(e:Event):void
		{
			achievementsPaginator.prev();
		}
 
		private function onAchievementsNextClick(e:Event):void
		{
			achievementsPaginator.next();
		}
 
		private function onAchievementsPageChange(e:Event):void
		{
			window.ahievements.dataProvider = new ArrayList(achievementsPaginator.current());
		}


Последний раз редактировалось il phoenix; 22.07.2013 в 09:48.
Старый 23.07.2013, 01:16
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 4  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
этот баг особенно хорошо заметен при перелистывании первой страницы на вторую, там есть элемент с синей лентой, он стоит на 4 месте в первом ряду, а после нажатия на кнопку ">" он становится вторым во втором ряду...
Это не баг, а нормальное поведение by design. При смене dataProvider все ItemRenderer помечаются как свободные. После чего повторно используются для новых данных. То что, при этом, они окажутся на тех же местах никто не гарантирует.

Вот то, что EffectManager не поддерживает DataGroup для addedEffect и removedEffect эффектов это баг, хоть Adobe и пытаются отмазываться.

Добавлено через 8 минут
Цитата:
Хочу еще раз отметить что никакого дополнительного события dataChange в ItemRenderer не происходит
Именно событие не происходит или просто анимация не выполняется?
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 23.07.2013, 18:17
il phoenix вне форума Посмотреть профиль Отправить личное сообщение для il phoenix Найти все сообщения от il phoenix
  № 5  
Ответить с цитированием
il phoenix

Регистрация: Apr 2009
Сообщений: 77
Цитата:
Именно событие не происходит или просто анимация не выполняется?
событие происходит нормально, тогда когда надо, и анимация выполняется норм

Цитата:
Это не баг, а нормальное поведение by design. При смене dataProvider все ItemRenderer помечаются как свободные. После чего повторно используются для новых данных. То что, при этом, они окажутся на тех же местах никто не гарантирует.
странно блин =( ну ладно
спасибо за объяснение, а можете посоветовать другой контрол на флексе на котором пейджинг с анимацией можно сделать?

Старый 23.07.2013, 21:30
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 6  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Обычный Group, вы все равно функционал List не используете.
__________________
משיח לא בא
משיח גם לא מטלפן

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

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

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


 


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


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