flash as3 sortOn - 按另一个数组的位置对数组进行排序

时间:2011-02-21 23:11:32

标签: arrays flash actionscript-3 sorting

我不太清楚如何做到这一点 - 我正在构建一个管理界面,将一系列Flash幻灯片的顺序排序为动态演示文稿。管理界面从xml中提取幻灯片,并将每个幻灯片显示为缩略图。拖动时,缩略图会在数组中对其进行适当的重新排序。问题是,我希望实际的幻灯片数组相应地重新组织。我的代码是这样的:

function onThumbPress( e:MouseEvent ):void
{
    e.target.startDrag();
}

function onThumbRelease( e:MouseEvent ):void
{
    e.currentTarget.stopDrag();
    sortSlides();
}

function sortSlides():void
{
    project_thumbs_array.sortOn( 'x', Array.NUMERIC );


    for (var i:int = 0; i < project_thumbs_array.length; i++) 
    {
        TweenMax.to( project_thumbs_array[i], 0.5, { x:(project_thumbs_array[i].width + thumb_spacing) * (i % thumb_cols), y:(project_thumbs_array[i].width + thumb_spacing) * int(i / thumb_cols), ease:Expo.easeInOut } );
    }

}

所以我想做的是接受数组中的更改(比如在project_thumbs_array中的1前面移动0) - 并确保我的另一个数组(project_clips_array)也将项目0移到1的前面。我认为这样的事情可能有效,但事实并非如此:

project_clips_array.sortOn ('project_thumbs_array.x',Array.NUMERIC);

1 个答案:

答案 0 :(得分:1)

你当然可以保留两个阵列并更新或操作第二个阵列以匹配第一个阵列的排序,但如果您想要向幻灯片添加更多信息(例如标题),这将变得乏味并且会变得越来越混乱,字幕等) - 你必须保留一系列标题,一系列字幕,等等,并为所有这些做同样的排序。

在单个排序数组中保留与每个幻灯片相关的所有属性的关联数组(在AS,即对象中)更清晰(并获得更好的性能),而不是为每个属性分别使用单独的数组。

在下面的示例中,数组中的每个对象都具有x,y,thumb和slide属性。补间操纵数值x和y,并在值更改时更新拇指定位。排序基于数值x而不是实际的拇指位置。

var project_array:Array = [];

//--- 
// Some code initializing the array here.
// Array elements should each look something like this:
var object:Object = { 
                      x: project_thumb.x, 
                      y: project_thumb.y, 
                      thumb: project_thumb,  
                      slide: project_slide 
                    }; 
//---

function sortSlides():void
{
    project_array.sortOn( 'x', Array.NUMERIC );

    for (var i:int = 0; i < project_array.length; i++) 
    {
        var obj:Object = project_array[i];
        TweenMax.to( obj, 0.5, 
            { 
              // tween numeric values instead of thumb position
              x:(obj.thumb.width + thumb_spacing) * (i % thumb_cols),
              y:(obj.thumb.width + thumb_spacing) * int(i / thumb_cols), 

              // update thumb position according to values
              onUpdate: function ( item:Object ) 
                        { 
                            item.thumb.x = item.x; 
                            item.thumb.y = item.y; 
                        }, 
              onUpdateParams:[obj], 
              ease:Expo.easeInOut 
            } );
    }
}

function onThumbRelease( e:MouseEvent ):void
{
    e.currentTarget.stopDrag();

    // update sorting values after drag
    for ( var i:int = 0; i < project_array.length; i++) 
    {
        var obj:Object = project_array[i];
        obj.x = obj.thumb.x;
        obj.y = obj.thumb.y;
    }

    sortSlides();

    // call slide here:
    for ( i = 0; i < project_array.length; i++) 
    {
        obj = project_array[i];
        if (e.currentTarget == obj.thumb) 
        {
            doSomethingWithSlide (obj.slide);
            break;
        }
    }
}