开发者

as3 duplicating a text field without removing it from stage

开发者 https://www.devze.com 2023-01-30 15:37 出处:网络
I am trying to duplicate a text field. First I get the text with a mc.getChildAt(0) and then copy all the contents into a new textfield. The problem I am having is that getChildAt removes the textfiel

I am trying to duplicate a text field. First I get the text with a mc.getChildAt(0) and then copy all the contents into a new textfield. The problem I am having is that getChildAt removes the textfield from the movieclip it is in. How to I get the properties of the textfield without moving it? Or maybe it is something else and what I am doing is fine. Any insight would be a huge help...

var dupeTField:MovieClip = duplicateTextField($value.sourceImg.getChildAt(0));

private function duplicateTextField($textField):MovieClip
        {
            var currTextField:TextField = $textField;
            var dupeTextHolder:MovieClip = new MovieClip();
            var dupeTextField:TextField = new TextField();
            dupeTextField.text = currTextField.text;
            dupeTextField.textColor = currTextField.textColor;
            dupeTextField.width = $textFie开发者_运维百科ld.width;
            dupeTextField.height = $textField.height;
            dupeTextHolder.addChild(dupeTextField);


            return dupeTextHolder;

        }


Use something like this:

package com.ad.common {
    import flash.text.TextField;
    import flash.utils.describeType;

    public function cloneTextField(textField:TextField, replace:Boolean = false):TextField {
        var clone:TextField = new TextField();
        var description:XML = describeType(textField);
        for each (var item:XML in description.accessor) {
            if (item.@access != 'readonly') {
                try {
                    clone[item.@name] = textField[item.@name];
                } catch(error:Error) {
                    // N/A yet.
                }
            }
        }
        clone.defaultTextFormat = textField.getTextFormat();
        if (textField.parent && replace) {
            textField.parent.addChild(clone);
            textField.parent.removeChild(textField);
        }
        return clone;
    }
}


I think you'll find your problem is somewhere else. getChildAt does not remove its target from its parent, and the function you posted works as advertised for me, creating a duplicate clip without affecting the original.


    private var dupeTField:MovieClip;

    private function init():void
    {         
        //getChildAt will return a DisplayObject so you
        //should cast the return DisplayObject as a TextField
        var tf:TextField = $value.sourceImg.getChildAt(0) as TextField;

        dupeTField = duplicateTextField(tf);

        //don't forget to add your duplicate to the Display List
        //& make sure to change the x, y properties so that 
        //it doesn't sit on top of the original
        addChild(dupeTField ); 

    }

    private function duplicateTextField(textField:TextField):MovieClip
    {
        var dupeTextHolder:MovieClip = new MovieClip();
        var dupeTextField:TextField = new TextField();

        //if you pass a TextField as a parameter, you don't need to
        //replicate the instance inside the function, simply access the
        //parameter directly.
        //You may consider copying the TextFormat as well
        dupeTextField.defaultTextFormat = textfield.defaultTextFormat;

        dupeTextField.text = textField.text;
        dupeTextField.textColor = textField.textColor;
        dupeTextField.width = textField.width;
        dupeTextField.height = textField.height;

        dupeTextHolder.addChild(dupeTextField);


        return dupeTextHolder;

    }
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号