Я боролся с тем, как я могу создать mxml из списка отображения, созданного в приложении. Например, создайте несколько компонентов на холсте, затем нажмите кнопку, чтобы получить отформатированный XML-документ в mxml холста и его свойств.

Есть ли для этого простой способ?

Большое спасибо за любую помощь ...

1
Paul 15 Июн 2009 в 18:01

2 ответа

Лучший ответ

Для этого точно не существует простого метода.

Изменить : Причина в том, что mxml фактически транслируется в ActionScript, а затем компилируется. Итак, flash player абсолютно ничего не знает о mxml и его существовании.

1
Hrundik 15 Июн 2009 в 18:53

Было бы полезно узнать немного больше об этом, например, зачем вам это нужно. Насколько я знаю, нет простого или встроенного способа сделать это.

Вот направление, которое может помочь:

  • Встраивайте файлы шаблонов PlainText mxml для каждого типа DisplayObject, который ваше приложение будет поддерживать. (файлы шаблонов, в которых каждое свойство имеет переменную для замены со строковой интерполяцией, например: mx: HRule height = "{$ hRuleHeight}" width = "$ {hRuleWidth}" /

  • Каждый раз, когда объект редактируется / создается, сохраняйте информацию --- когда приходит время сгенерировать mxml, отсортируйте каждый сохраненный элемент, возьмите свойства и проанализируйте шаблоны с ними. AS3 не поддерживает строковую интерполяцию, ниже представлена ​​реализация, если у вас ее нет.

использование:

        var example:StringInterpolation=new StringInterpolation();

        example.setKeyAndValue('${id}','foo');
        example.setKeyAndValue('${baseurl}','http://testing123');

        trace(example.eval('<table width="480" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="3"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="480" height="270"><param name="movie" value="http://testing123/player/Take180Player.swf?xmlLocation=/s/bx/http://testing123}&links=true" />'));


 /*outputs:<table width="480" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="3"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="480" height="270"><param name="movie" value="http://testing123/player/Take180Player.swf?xmlLocation=/s/bx/http://testing123&links=true" /> */

src:

//

package com.philipbroadway.utils
{
    public class StringInterpolation extends Object
    {
        internal var _keys:Array;
        internal var _values:Array;
        internal var _result:String;
        internal var i:uint;

        /**
         * 
         * 
         */        
        public function StringInterpolation()
        {
            _keys=[];
            _values=[];    
        }





        /**
         * 
         * @param key:String a variable name
         * @param value:String a value to replace when the key is found during eval
         * 
         */        
        public function setKeyAndValue(key:String,value:String):void
        {
            var metacharacters:Array=[];
            metacharacters.push(new RegExp(/\$/));
            metacharacters.push(new RegExp(/\{/));
            metacharacters.push(new RegExp(/\}/));
            metacharacters.push(new RegExp(/\^/));
            metacharacters.push(new RegExp(/\./));
            metacharacters.push(new RegExp(/\*/));
            metacharacters.push(new RegExp(/\+/));

            var replacements:Array=[];
            replacements.push(new String('\\$'));
            replacements.push(new String('\\{'));
            replacements.push(new String('\\}'));
            replacements.push(new String('\\^'));
            replacements.push(new String('\\.'));
            replacements.push(new String('\\*'));
            replacements.push(new String('\\+'));

            for(i=0;i<metacharacters.length;i++)
            {
                key=key.replace(metacharacters[i],replacements[i]);
            }
            _keys.push(key);
            _values.push(value);
        }





        /**
         * 
         * @param value:String to be interpolated
         * @return String interpolated
         * 
         */        
        public function eval(value:String):String
        {
            _result=value;
            for(i=0;i<_keys.length;i++)
            {
                var regEx:RegExp=new RegExp(_keys[i],'g');
                _result=_result.replace(regEx,_values[i]);
            }

            return _result;
        }




        /**
         * 
         * 
         */        
        public  function reset():void
        {
            _keys=[];
            _values=[];                
        }
    }
}
0
xivusr 15 Июн 2009 в 20:28
Я не совсем понимаю, как это работает, но позвольте мне добавить примечание, если можно: ваш setKeyAndValue снова и снова создает одни и те же два массива, хотя это и не обязательно. кроме того, вам не нужно регулярное выражение ... это поможет: для каждого (var char: String в '$ {} ^. * +'. split ('')) key.replace (char, '\ \ '+ char) ... кеширование' $ {} ^. * + '. split (' ') тоже немного поможет ...
 – 
back2dos
17 Июн 2009 в 17:19