Переместить эффекты в TileList в Flex 3 - PullRequest
2 голосов
/ 14 декабря 2011

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

Вот мой пример кода, который я сделал до сих пор

<?xml version="1.0"?>

<mx:Sequence id="dataChangeEffectSequence">
    <mx:Move duration="1500" easingFunction="{Elastic.easeOut}" perElementOffset="20"/>
</mx:Sequence>

<mx:Script>
    <![CDATA[
        import mx.effects.easing.Elastic;
        import mx.controls.Alert;
        import mx.events.ScrollEvent;

        private var arrImage:Array = [
            {source:"Images/1.png",tooltip:"1"},
            {source:"Images/2.png",tooltip:"2"},
            {source:"Images/3.png",tooltip:"3"},
            {source:"Images/4.png",tooltip:"4"},
            {source:"Images/5.png",tooltip:"5"},
            {source:"Images/6.png",tooltip:"6"},
            {source:"Images/7.png",tooltip:"7"},
            {source:"Images/8.png",tooltip:"8"},
            {source:"Images/9.png",tooltip:"9"},
            {source:"Images/10.png",tooltip:"10"}];

        public function onInit():void
        {
            tileList.dataProvider = arrImage;
        }

        public function btnUP_click():void
        {
            var scrollPosition:int = tileList.verticalScrollPosition - 1;

            if(scrollPosition >= 0)
            {
                tileList.verticalScrollPosition = scrollPosition;
            }
            else
            {
                tileList.verticalScrollPosition = 0;
            }
        }

        public function btnDown_click():void
        {
            var scrollPosition:int = tileList.verticalScrollPosition + 1;

            if(scrollPosition <= tileList.maxVerticalScrollPosition)
            {
                tileList.verticalScrollPosition = scrollPosition;
            }               
        }

    ]]>
</mx:Script>

<mx:Button width="100" label="UP" id="btnUP" click="{btnUP_click();}" />

<mx:TileList id="tileList" dataProvider="{arrImage}" columnCount="1" columnWidth="100"
    useRollOver="false" selectable="false" backgroundAlpha="0" borderStyle="none" 
    rowHeight="65" verticalScrollPolicy="off" horizontalScrollPolicy="off"
    itemsChangeEffect="{dataChangeEffectSequence}" >
    <mx:itemRenderer>
        <mx:Component>
            <mx:VBox width="100%" height="100%" horizontalAlign="center" verticalGap="0"
                verticalAlign="middle" horizontalScrollPolicy="off" verticalScrollPolicy="off">
                <mx:Script>
                    <![CDATA[
                        import mx.controls.Alert;
                        override public function set data(value:Object):void
                        {
                            if(value !=null)
                            {
                                super.data = value;
                                if(img !=null)
                                {
                                    img.source = data.source;
                                    img.toolTip = data.tooltip;
                                }
                            }
                        }
                    ]]>
                </mx:Script>
                <mx:Image id="img" showEffect="{outerDocument.dataChangeEffectSequence}" />
            </mx:VBox>
        </mx:Component>
    </mx:itemRenderer>
</mx:TileList>

<mx:Button width="100" label="DOWN" id="btnDown" click="{btnDown_click();}" />

</mx:Application>

Заранее спасибо ..

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Поместите TileList в Контейнер (например, Canvas или VBox) и установите для него полную высоту всех элементов (если у вас есть variableRowHeight, это может быть немного сложно). Затем обработайте прокрутку на VBox, а не в TileList.

Также обратите внимание, что VBox имеет много накладных расходов как itemRenderer. Вы можете рассмотреть возможность размещения изображения там. Он имеет свойства horizontalAlign и verticalAlign.

2 голосов
/ 14 декабря 2011

Вы можете использовать такие искровые компоненты, как Список и установить для useVirtualLayout значение true.

Проблема с вашим кодом заключается в том, что каждый элемент itemrenderer создается и отображается при обновлении поставщика данных.Если для useVirtualLayout установлено значение true, создаются только отображаемые элементы, и они перерабатываются при прокрутке.Затем вы можете прослушать событие dataChange вашего itemrenderer, чтобы запустить переход.

...