Flxex 3.5 - 使用-ve Y将子项添加到自定义Canvas组件时显示问题

时间:2011-11-22 05:16:09

标签: actionscript-3 flex flex3

获得解决方案 - 请参阅帖子底部

如果我给子元素提供负-y坐标,只是想知道是否有任何问题?在我的项目中,当我这样做时,它表现得非常笨拙。

在我的flex 3.5项目中,我扩展了Canvas类。在这个课程中,我将有一个子项(Image),我动态加载并设置x,y位置以调整通常为-x和-y值的偏移量。这没问题。现在,当我尝试动态添加另一个具有-y值的子项时,它会缩小画布并显示一个非常小的矩形(不缩小图像大小)

我还注意到,即使添加了第一张图像,Canvas身高属性也为0。

有谁知道它是什么问题?

*已编辑:已添加以下源代码*

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()函数

中添加了这一行
        //*****NEW CODE****//
        this.height = bmp.height + 20;
        this.width  = bmp.width;

此致

1 个答案:

答案 0 :(得分:0)

问题在于设置父画布的尺寸。 我在 onLoadComplete()函数

中添加了这一行
        this.height = bmp.height + 20;
        this.width  = bmp.width;