Показать сообщение отдельно
Старый 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.