flash as3 sortOn - сортировка массива по позиции другого массива - PullRequest
1 голос
/ 22 февраля 2011

Я не совсем уверен, как это сделать - я создаю интерфейс администратора, чтобы отсортировать последовательность слайдов в динамическую презентацию.Интерфейс администратора извлекает слайды из 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 } );
    }

}

Так что я хочу сделать, это взять изменение в массиве (скажем, 0 перемещается перед 1 в project_thumbs_array) - и убедиться, что мой другой массив (project_clips_array) перемещаетсяпункт 0 перед 1 также.Я думал, что-то вроде этого может работать, но это не так:

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

1 Ответ

1 голос
/ 22 февраля 2011

Конечно, вы можете оставить два массива и обновить или манипулировать вторым, чтобы он соответствовал сортировке первого, но это утомительно и будет все более запутанным, если вы когда-нибудь захотите добавить больше информации в свои слайды (например, заголовки)., подписи и т. д.) - вам нужно будет сохранить массив заголовков, массив заголовков и т. д. и выполнить одинаковую сортировку для всех этих.

Чище (и достигается лучшая производительность) хранить ассоциативные массивы (в AS, это Objects) всех свойств, связанных с каждым слайдом, внутри одного сортировочного массива, вместо того, чтобы иметь отдельные массивы для каждого свойства.

В моем примере ниже каждый объект в массиве имеет свойства 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;
        }
    }
}
...