Цитата:
|
Вам помощь нужна или сочувствие?
|
Мне бы помощь)) желательно чтобы менять нужно было по минимуму, я просто думал может быть это известный баг, и есть какой-то простой способ его пофиксить.
Цитата:
|
Ну почему все надо клещами вытаскивать?
|
Д я вробе бы ничего особенного не использую.
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());
}