Flex/Actionscript - получение холста побитово отображает с динамично помещенными элементами

Я пытаюсь найти перекрытие между элементами на холсте гибкого провода, адаптации http://www.gskinner.com/blog/archives/2005/08/flash_8_shape_b.html

Попытка здесь состоит в том, чтобы поместить некоторое перекрытие текста и числа с ранее помещенным текстом. Простой пример ниже иллюстрирует проблему.

Оба ImageSnapshot.captureBitmapData (холст); или BitmapData.draw (холст);

кажется, не получаю элементы, помещенные в холст динамично.

Какие-либо подсказки о том, как я могу выполнить это?

Заранее спасибо за любую справку.-vivek



    
        
    
    
        
    
        
    

1
задан Vivek 6 July 2010 в 18:10
поделиться

1 ответ

Вызов addChild не делает компонент сразу видимым / доступным в его родительском элементе. Перед захватом растрового изображения необходимо завершить процесс создания, который включает в себя несколько этапов / событий. Поместите код захвата в отдельный метод и вызовите его ПОСЛЕ завершения процесса создания для вашего динамически создаваемого компонента. Сделайте это с помощью метода callLater, который поместит ваш вызов метода в конец очереди событий. Вот ваш код с добавленным callLater (не очень красиво, но, надеюсь, он уловил суть):

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               creationComplete="init()">
    <fx:Script>
        <![CDATA[
            import mx.controls.Image;
            import mx.controls.Text;
            import mx.graphics.ImageSnapshot;

            public function init():void {
                var l:Label = new Label();
                l.text = 'Dynamic Label!';
                l.x = text.x+50;
                l.y = text.y;
                canvas1.addElement(l);

                this.callLater(addRect);
            }

            private function addRect():void {

                var bounds:Rectangle = text.getBounds(this);
                trace(bounds.top + ',' + bounds.left + ',' + bounds.width + ',' + bounds.height);
                var bmd:BitmapData = new BitmapData(text.width, text.height);
                bmd.draw(text);
                var bm:Bitmap = new Bitmap(bmd);
                var img:Image  = new Image();
                img.source = bm;
                img.x = 0;
                img.y = 20;
                canvas2.addChild(img);

                var c2:BitmapData = ImageSnapshot.captureBitmapData(canvas1);
                var bmd2:BitmapData = new BitmapData(text.width,text.height);
                bmd2.copyPixels(c2,bounds,new Point(0,0));
                var bm2:Bitmap = new Bitmap(bmd2);
                var img2:Image  = new Image();
                img2.source = bm2;
                img2.x = 0;
                img2.y = 50;
                canvas2.addChild(img2);

                var c3:BitmapData = new BitmapData(canvas1.width, canvas1.height);
                c3.draw(canvas1);
                var bmd3:BitmapData = new BitmapData(text.width,text.height);
                bmd3.copyPixels(c3,bounds,new Point(0,0));
                var bm3:Bitmap = new Bitmap(bmd2);
                var img3:Image  = new Image();
                img3.source = bm3;
                img3.x = 0;
                img3.y = 50;
                canvas3.addChild(img3);

            }
        ]]>
    </fx:Script>
    <mx:Canvas id="canvas1" width="400" height="100" backgroundColor="#FF0000">
        <s:Label id="text" x="200" y="50" text="This is a test"/>
    </mx:Canvas>
    <mx:Canvas id="canvas2" y="100" width="400" height="100" backgroundColor="#00FF00"/>    
    <mx:Canvas id="canvas3" y="200" width="400" height="100" backgroundColor="#0000FF"/>
</s:Application>
2
ответ дан 2 September 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: