|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
сортировка массива привязанная к положению объекта
Есть список итемов(кнопок), что-то вроде компонента List. Итемы я могу менять местами, перетаскиванием. Каждому итему соответствует некая информация в массиве.
Проблема в том, что когда я перетаскиваю итем(вверх или вниз) нужно правильным образ сортировать массив, иначе информация в массиве перестает соответствовать итему. Вроде бы все просто. Я делаю Жму на итем, который перетаскиваю, сохраняю в темп-1 его id, сохраняю в темп-2 по id итема информацию из массива. Во время перетаскивания итема получаю текущий id положения итема, записываю его в темп-3. Перетаскиваю итем вверх на две позиции. Отпускаю мышь, в темп-4 записываю по текущему id информацию с массива. При отпускании мыши, список итемов либо опускается на -1, либо поднимается на +1, в зависимости от того куда был перемещен итем, вверх или вниз. Проблема в том, что если я перетаскиваю итем более чем на одно положение вверх или вниз элементы в массиве путаются. Подскажите логику решения, не могу разобраться. |
|
|||||
Это вы в продолжение темы http://www.flasher.ru/forum/showthread.php?t=171555 ?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
DaFive, Да вы абсолютно правильно все поняли.
Цитата:
GBee, верно. Изменение положения итемов я реализовал, сейчас вот такая запарка с массивами, пока не понимаю, как её решить. Последний раз редактировалось BornTOFree; 23.11.2011 в 14:36. |
|
|||||
Цитата:
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
GBee, Ваш вариант приемлемый, можно отказаться от перетаскивания самих итемов и сортировать только массив, но этот вопрос остается все равно открытым. Так как массив должен сортироваться со смещением на одну позицию вниз или вверх. Я пока что не могу догнать, как это сделать.
|
|
|||||
itemInfo = ["инфа1","инфа2","инфа3"]; items = [item1, item2, item3]; function moveItem(rootIndex , destIndex):void { var destItem:* = items[destIndex]; var destInfo:* = itemInfo[destIndex]; items[destIndex] = items[rootIndex]; items[rootIndex] = destItem; itemInfo[destIndex] = itemInfo[rootIndex]; itemInfo[rootIndex] = destInfo; } Вообще скорее всего рефакторить нужно, и сделать нормально
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
Ситуация, примерно, такая
package { import components.Item; import flash.display.DisplayObject; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.text.TextField; import gs.TweenLite; import gs.easing.Expo; public class Test_as extends Sprite { private var item:Item; private const ITEM_SPACING:int = 5; private var arrItem:Array = new Array(); private var arrDescription:Array = new Array("А","Б","В","Г","Д") private var _currentItem:Object; private var _grabY:Number; private var targetLink:DisplayObject; private var targetItem:int; private var tempDescription:String; private var currentID:int; private var tempDescriptionUp:Object; private var debugTxt:TextField; public function Test_as(){ this.stage.scaleMode = StageScaleMode.NO_SCALE; this.stage.align = StageAlign.TOP_LEFT; debugTxt = new TextField(); addChild(debugTxt); debugTxt.x = 300; debugTxt.y = 10; debugTxt.width = 100; debugTxt.height = 30 debugTxt.border = true; for(var i:int = 0; i < 5; i++){ item = new Item(i); addChild(item); item.y = (item.height+ITEM_SPACING)*i; item.addEventListener(MouseEvent.MOUSE_DOWN, onDown); stage.addEventListener(MouseEvent.MOUSE_UP, onUp); arrItem.push(item); item.setText(arrDescription[i]); } } private function sortOn():void { for (var i:int = 0; i < arrItem.length; i++) { arrItem[i].setID(i) TweenLite.to( arrItem[i], 0.5, { x:0, y:(arrItem[i].height + ITEM_SPACING) * i, ease:Expo.easeInOut } ); } } protected function onUp(event:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove); sortOn(); tempDescriptionUp = arrDescription[currentID]; arrDescription.splice(currentID,1, tempDescription)//замена элемента в массиве по ID итема, который меняется в зависимости от его положения, когда итем тянется мышью arrDescription.splice(targetItem,1, tempDescriptionUp)//замена элемента в массиве по текущему ID итема, когда произошло нажатие на итем //_currentItem.setText(arrDescription[targetItem]); trace(arrDescription) debug() /*for (var i:int = currentID; i < arrItem.length; i++) { trace(currentID) arrItem[i].setText(arrDescription[i]); }*/ } protected function onDown(e:MouseEvent):void { targetLink = e.currentTarget as DisplayObject; targetItem = this.arrItem.indexOf(targetLink); setChildIndex(arrItem[targetItem],numChildren - 1) _grabY = targetLink.mouseY; _currentItem = arrItem[targetItem]; currentID = _currentItem.getID(); tempDescription = arrDescription[targetItem] stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove); } protected function onMove(event:MouseEvent):void { targetLink.y = this.mouseY - _grabY arrItem.sortOn( 'y', Array.NUMERIC ); for (var i:int = 0; i < arrItem.length; i++) { arrItem[i].setID(i) } currentID = _currentItem.getID(); //trace(currentID) } private function debug():void { debugTxt.text = arrDescription+"" } } } |
|
|||||
Регистрация: Jun 2011
Сообщений: 212
|
А зачем вам вообще массив arrDescription ПОСЛЕ создания итемов?
Судя по item.setText(arrDescription[i]), каждый итем содержит все необходимые данные. Соответственно последовательный перебор arrItem вернет вам буквы в нужном порядке. Добавлено через 56 секунд (что то вроде item.getText) |
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
Это для простоты примера в тело итема было запихано текстовое поле с отображением букв. В действительности же данные из массива будут диспатчиться в другой класс для отображения в отдельном окне. Нахождение этой информации в классе реализующий сам итем нежелательно.
|
Часовой пояс GMT +4, время: 02:23. |
|
« Предыдущая тема | Следующая тема » |
|
|