Flxex 3.5 - проблема с отображением при добавлении дочернего элемента в пользовательский компонент Canvas с параметром -ve Y - PullRequest
0 голосов
/ 22 ноября 2011

Есть решение - см. Внизу поста

Просто хочу знать, есть ли проблема, если я дам отрицательные координаты -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;

Привет

1 Ответ

0 голосов
/ 03 мая 2012

Проблема была с настройкой размеров родительского холста. Я добавил эту строку в onLoadComplete () function

        this.height = bmp.height + 20;
        this.width  = bmp.width;
...