Есть решение - см. Внизу поста
Просто хочу знать, есть ли проблема, если я дам отрицательные координаты -y дочерним элементам? В моем проекте, когда я это делаю, он ведет себя очень неловко.
В моем проекте flex 3.5 я расширил класс Canvas. В этом классе у меня будет один потомок (Image), который я загружаю динамически и устанавливаю положение x, y, чтобы настроить смещения, которые обычно составляют значения -x и -y. До этого проблем нет. Теперь, когда я пытаюсь динамически добавить другого дочернего элемента со значением -y, он сжимает холст и показывает очень маленький прямоугольник (без уменьшения размеров изображения)
Также я заметил, что свойство Canvas height равно 0 даже после добавления 1-го изображения.
Кто-нибудь знает, в чем проблема?
* Отредактировано: исходный код добавлен ниже *
public class WorldElementView extends Canvas {
private var mainAsset:UIComponent;
private var shopItem:ShopItem;
private var map:WorldMapView;
private var loader:Loader;
private var timer:Timer;
private var readyToCollect:Boolean = false;
private var loadingUserData:Boolean = false;
private var collectionImage:Image;
Удалено много переменных, которые не имеют смысла в контексте
public function WorldElementView(m:WorldMapView):void{
map = m;
mainAsset = new UIComponent();
loadAsset();
}
loadAsset () вызывается для загрузки основного ресурса, который нормально загружается
private function loadAsset():void{
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onLoadError);
loader.load(new URLRequest(GameConfig.ASSET_IMAGE_PATH + shopItem.ImagePath));
}
все значения во внутренних переменных верны,
// обработчики событий
приватная функция onLoadComplete (e: Event): void {
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onLoadComplete);
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,onLoadError);
addEventListener(MouseEvent.CLICK,onClick);
var bmp:Bitmap = LoaderInfo(e.target).content as Bitmap;
//*****NEW CODE****//
this.height = bmp.height + 20;
this.width = bmp.width;
bmp.x+=shopItem.OffSetX;
bmp.y+=shopItem.OffSetY;
mainAsset.addChild(bmp);
addChildAt(mainAsset,0);
setDimensions();
initTimer();
dispatchEvent(new GreenRevEvent(GreenRevEvent.WORLD_ELEMENT_INITIALIZED));
}
initTimer () вызывается для запуска таймера
public function onLoadError(e:IOErrorEvent):void{
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onLoadComplete);
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,onLoadError);
Alert.show("Error loading world!" + e.toString());
}
private function initTimer():void{
var interval:int;
// *** LOGIC to determine "interval"
interval = 10000; // hardcoded to 10 seconds
timer = new Timer(interval,1);
timer.addEventListener(TimerEvent.TIMER,onTimer);
timer.start();
}
Не много здесь, просто установка таймера
private function onTimer(e:TimerEvent):void{
readyToCollect = true;
showCollectIcon();
}
Проблема ниже функции, посмотрите на встроенный комментарий
private function showCollectIcon():void{
if(!collectionImage){
collectionImage = new Image();
collectionImage.autoLoad = true;
collectionImage.source = GameResource.imgCollect;
collectionImage.y = -20; // **** THIS BEHAVES AWCKWARDLY ****
addChild(collectionImage);
collectionImage.filters = [new GlowFilter(0x0000ff,1,10,1,1)]
collectionImage.mouseEnabled = false;
collectionImage.visible = false;
}
collectionImage.visible = true;
}
}
Если я закомментирую нижеприведенную строку, все работает нормально, но проблема в том, что мне нужно разместить значок чуть выше верхней части основного изображения
collectionImage.y = -20;
Решение
Проблема заключалась в настройке размеров родительского холста.
Я добавил эту строку в onLoadComplete () function
//*****NEW CODE****//
this.height = bmp.height + 20;
this.width = bmp.width;
Привет