Эскизы для компонентов mxml в Flex

Можно ли создать какие-то «динамические» эскизы для mxml-компонентов, которые я использую в своем приложении? Под «динамическим» я подразумеваю, что если я изменяю макет в компоненте mxml, мой эскиз обновляется в соответствии с новым макетом без каких-либо снимков экрана, фотошопов или чего-то подобного =)

Изменить:
Я использую FlexBook компонент, который составляет «книгу» компонентов mxml (поскольку каждая страница имеет множество независимых взаимодействий). Я думаю, что проблема может заключаться в том, что растровые данные не существуют, пока я не начну переворачивать страницы. Но я бы хотел получить растровые данные по завершении создания.

Спасибо!


Хорошо, позвольте мне объяснить немного больше, потому что я вижу, что это сложнее, чем я думал ...

Я использую компонент FlexBook, который составляет «книгу» компонентов mxml ( потому что каждая страница имеет много независимых взаимодействий). Я думаю, что проблема может заключаться в том, что растровые данные не существуют, пока я не начну переворачивать страницы. Но я бы хотел получить растровые данные по завершении создания ...

Спасибо за помощь!
м.


person errata    schedule 19.10.2009    source источник
comment
Вы имеете в виду, что это эскиз приложения? И вы хотите, чтобы эскиз был BitmapData или как?   -  person Andy Li    schedule 19.10.2009
comment
Хммм ... Ну что, приложение? Это файлы mxml, и я использую их как компоненты в своем основном приложении. Мне нужен эскиз каждого компонента, который я использую ... Полагаю, BitmapData было бы круто, да =)   -  person errata    schedule 19.10.2009


Ответы (1)


Вот функция, которую я написал очень давно. Требуется DisplayObject (компоненты mxml тоже DisplayObject), он вернет Bitmap его.

Вы можете написать обработчик для прослушивания Event.RENDER компонента mxml для обновления Bitmap при изменении компонента.

Еще одна вещь, которую вы можете попробовать с компонентом FlexBook, - это установить _6 _...

/**
 * This function returns a Bitmap that have the same look of a given DisplayObject.
 * Ref.: http://qops.blogspot.com/2008/05/bitmap.html
 * @author Andy Li [email protected]
 * @version 20080529
 */
package net.onthewings{
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.geom.Matrix;
    import flash.display.DisplayObject;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.PixelSnapping;
    import flash.display.Stage;

    public function bitmapEquivalentOf(obj:DisplayObject, extendsRectSidesBy:Number = 0, clipOutside = null,alpha:Boolean = true):Bitmap {
        if (obj.width && obj.height) {
            var bitmapData:BitmapData = new BitmapData(obj.width, obj.height, alpha, 0xFFFFFF);
            var rect:Rectangle = obj.getBounds(obj);
            var matrix:Matrix = new Matrix;
            matrix.translate(-rect.x, -rect.y);
            bitmapData.draw(obj, matrix);
            var bitmap:Bitmap = new Bitmap(bitmapData, PixelSnapping.AUTO, true);
            bitmap.x = rect.x;
            bitmap.y = rect.y;
            var ebd:BitmapData;

            if (clipOutside) {
                var h:Number;
                var w:Number;
                if (clipOutside is Stage) {
                    h = clipOutside.stageHeight;
                    w = clipOutside.stageWidth;
                } else {
                    h = clipOutside.height;
                    w = clipOutside.width;
                }
                if(!(h && w)){
                    return null;
                }
                var pt:Point = obj.localToGlobal(new Point(rect.x,rect.y));
                ebd = new BitmapData(w, h, true, 0xFFFFFF);
                ebd.copyPixels(bitmap.bitmapData,new Rectangle(-pt.x,-pt.y,w,h),new Point(0,0));
                bitmap =  new Bitmap(ebd, PixelSnapping.AUTO, true);
            } else if (extendsRectSidesBy) {
                ebd = new BitmapData(bitmapData.width+extendsRectSidesBy*2, bitmapData.height+extendsRectSidesBy*2, true, 0xFFFFFF);
                ebd.copyPixels(bitmap.bitmapData,bitmap.bitmapData.rect,new Point(extendsRectSidesBy,extendsRectSidesBy));
                bitmap =  new Bitmap(ebd, PixelSnapping.AUTO, true);
                bitmap.x = rect.x - extendsRectSidesBy;
                bitmap.y = rect.y - extendsRectSidesBy;
            }
            return bitmap;
        } else {
            return null;
        }
    }
}
person Andy Li    schedule 19.10.2009
comment
Я только что узнал, что в Flex есть ImageSnapshot класс, который должен быть лучше моей старой функции. Используйте его captureBitmapData функцию :) - person Andy Li; 19.10.2009
comment
Привет, спасибо за эту огромную помощь! Я играл с классами BitmapData и ImageSnapshot, но я все еще не могу получить миниатюры для страниц в моей книге ... Я могу успешно сделать миниатюру для первой страницы (которая немедленно отображается), но у меня не было большого успеха с другими `` необработанными '' страницы ... В любом случае, еще раз спасибо! - person errata; 20.10.2009