|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
"умное" позиционирование объектов, созданных массивом
Привет, всем!
Помогите разобраться, как можно организовать "умное" позиционирование объектов внутри контейнера. С помощью массива и xml загрузили 10 объектов private function xmlLoaded(e:Event):void { galeryLoader.removeEventListener(Event.COMPLETE, xmlLoaded); galeryXML = new XML(e.target.data); galery = galeryXML.imgs.attributes(); numImgs = galery.length(); getGalery(); conversGalery(); } private function getGalery():void { var galeryArrey = new Array(); for(var i:int = 0; i < numImgs; i ++) { imageLoader = new Loader; imageLoader.load(new URLRequest(galery[i])); galeryArrey.push(imageLoader); cont.addChild(imageLoader); imageLoader.name = "img"+[i];//что бы потопм обратиться //trace(imageLoader.name); } } Что бы этот метод (conversGalery) расставлял объекты в контейнере по принципу: размещаем ровное число загруженных объектов по stage.StageWidth в строку, если объекты не помещаются в одну строку – продолжаем размещать строкой ниже. создаем 2 переменные: private var row:int = 0;//колличество строк private var column:int = 0;//колличество объектов в строке Последний раз редактировалось Dr_Bra; 26.11.2010 в 19:28. |
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
при добавлении кадого следующего изображения добавлять к какой-то переменной 1, и если число больше количества колонок, то переходить на следующий ряд, а значение этой переменной обнулять. То есть что-то типа:
addChild(image); curentImage += 1; if (curentImage == columns) { curentImage = 0; curentColumn = 0; curentRow += 1; } Кстати, цикл для таких целей не подходит, так как он работат намного быстрее, чем любой загрузчик может загружать картинки. Поэтому следующую картинку надо будет грузить только тогда, когда загрузится предыдущая Последний раз редактировалось goodguy; 26.11.2010 в 20:15. |
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
Я понимаю расставлять уже загруженные. Но загрузить таким образом получится только последнюю картинку |
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Но если посмотреть на код, то там именно загрузка
|
|
|||||
Например, мы загрузили циклом все картинки, они у нас на сцене, перекрывают друг друга в левом верхнем углу. После чего мы вызываем метод, который бы упорядочил все загруженные объекты.
Для этого нам нужно обратиться по имени к каждой картинке, я предположил что так может сработать: но из метода сonversGalery не получается к загруженным картинкам по имени, например: таким бы образом мы запускали второй массив с переменной j и сделали попытку все объекты выстроить, так как нам нужно |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Писал давно, реализация кривовата. Тем не менее со своей задачей справляется.
package artshlagin.utils { import flash.display.DisplayObject; /** * ... * @author Artem Shlagin */ public class Placer { public function Placer() { throw new Error("Class is static"); } /** * Распологает объекты прямоугольником, слева-направо, сверху-вниз. * @param displayObjects Массив DisplayObject`ов, которые нужно расставить * @param columns Число объектов в строке * @param widthBetween Расстояние между объектами по горизонтали * @param heightBetween Расстояние между объектами по вертикали * @param startX стартовое x * @param startY стартовое y * @param centerLast Центрировать ли последние объекты при неполном заполнении строки */ public static function horizontalRectangle(displayObjects:Array, columns:int, widthBetween:Number, heightBetween:Number, startX:Number = 0, startY:Number = 0, centerLast:Boolean = true):void { var i:int = displayObjects.length; var obj:DisplayObject; if (centerLast) { var oddNum:int = i % columns; //todo if (oddNum === 1) { obj = displayObjects[--i] as DisplayObject; obj.x = ((widthBetween * columns - widthBetween) >> 1) +startX; obj.y = Math.floor((i) / columns) * heightBetween + startY; //return; if (!i) return; } if (oddNum > 0) { //надо центрировать нижние var width:Number = widthBetween * (columns); var spacesNum:int = columns - oddNum; var halfFreeSpace:int = spacesNum * widthBetween >> 1; var paddingEffect:int = halfFreeSpace / oddNum; var padding:Number = (widthBetween * spacesNum) >> 1; while (oddNum--) { obj = displayObjects[--i] as DisplayObject; if (!obj) throw new ArgumentError("displayObjects contain non-DisplayObjects, i="+i); obj.x = oddNum * widthBetween + padding - halfFreeSpace + paddingEffect * (oddNum + 2) + startX; obj.y = Math.floor(i / columns) * heightBetween + startY; } } } while (i--) { obj = displayObjects[i] as DisplayObject; if (!obj) throw new ArgumentError("displayObjects contain non-DisplayObjects, i="+i); obj.x = (i % columns) * widthBetween + startX; obj.y = Math.floor(i / columns) * heightBetween + startY; } } } }
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
Циклом невозможно загрузить картинки. Поэтому он и не находит первую. Ее просто нет. Она начинает грузиться, тут же цикл убивает ее загрузчик, создает новый и т.д. и еще: Тамки образом не получится строка. Это нужно будет отдельно конверитить в строку: |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Не запоминайте это:
Цитата:
Цитата:
@Dr_bra: Далее, по getChildByName. Однако ещё лучше воспользоваться Вашим же galeryArrey. (galleryArray)
__________________
Тут мужик танцует и поёт про флэш |
Часовой пояс GMT +4, время: 00:02. |
|
« Предыдущая тема | Следующая тема » |
Теги |
галерея , массив , масштабирование , Позиционирование |
|
|