【问题标题】:How to change SWC component's width shown on the Flash IDE?如何更改 Flash IDE 上显示的 SWC 组件的宽度?
【发布时间】:2014-03-06 11:53:13
【问题描述】:

我将库中的一个项目与一个 .as 文件链接。在这个 .as 文件中,我这样编写类:

public class TextArea extends MovieClip 
{
    .......
    public function setWidth(w:Number):void
    {
         this.width = w;
    }
}

然后我将项目更改为库中已编译的剪辑(与 ***SWC* 编译相同)**。我将其添加到舞台并更改其属性以触发 setWidth 函数.但是宽度没有改变。我应该怎么做才能改变影片剪辑的宽度?

附:可以更改此项中的子项 TextField 的宽度。

在图片中,我在舞台上放置了一个 SWC 组件,而 SWC 只有一个 TextField 作为子项。

Text 字段有黑色边框,SWC 被选中,蓝色边框是它的边界。

我在文本中打印this.width,宽度会自动更改以调整文本字段。

但蓝色边框是我想要更改的。它显示在 Flash 面板上并代表如下变换边界:

所以,我没有任何麻烦来更改孩子的数据。现在我发现这个类是这样的:

有一个 LivePreviewParent 为 this.parent。它提供了我在舞台上的 swc 的实时预览。而且我改变的大小是绝对改变的,但我认为蓝色边框代表 LivePreviewParent 的边框。

然而,改变 LivePreviewParent 的大小等于改变组件的大小而不是蓝色的。这个类是多么奇怪! 所以我想知道蓝色的实际上是 LivePreviewParent 的边框吗?如果是,如何更改?

【问题讨论】:

  • setWitdh你总是设置500。不应该是this.width = w;吗?
  • @taskino 或者默认是100,现在我设置了500,还是100。我发现this.width被改变了,但是我放在舞台上的实例没有改变宽度。

标签: actionscript-3 flash movieclip swc


【解决方案1】:

我不知道,您的组件究竟是如何构建的,您应该有内部逻辑来调整子组件/子组件的大小。

通用解决方案,盲目调整每个孩子的大小:

public function setWidth(w:Number):void
{
    var i: uint, len: uint = this.numChildren, child: DisplayObject;

    for(i; i < len; ++i){
        this.getChildAt(i).width = w;
    }

}

如果只有 textArea 是一个孩子:

public function setWidth(w:Number):void
{
    textArea.width = w;

}

简单的 TextField 容器,带有背景和自定义填充:

import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;

public class TextContainer extends Sprite {
    private var _textField:TextField;
    private var _padding:int;

    public function TextContainer(text:String, format:TextFormat, padding:int = 4) {
        _padding = padding;
        _textField = new TextField();
        _textField.defaultTextFormat = format;
        _textField.autoSize = TextFieldAutoSize.LEFT;
        _textField.multiline = true;
        _textField.wordWrap = true;
        _textField.text = text;

        addChild(_textField);

        _textField.x = _textField.y = padding;

        //Default width
        setWidth(100);
    }

    public function setWidth(value:Number):void {
        _textField.width = value;

        graphics.clear();
        graphics.beginFill(0xF0F0F0);
        graphics.drawRect(0, 0, _textField.width + 2*_padding, _textField.height + 2*_padding);
    }
}

用法:

var textContainer: TextContainer = new TextContainer("Some text here for test, more text, for multi-line test and resize", new TextFormat("Arial"));
desiredContainer.addChild(textContainer);
textContainer.setWidth(200);

【讨论】:

  • 是的,我不知道他的 MovieClip 有多复杂 ;)
  • 我的 MovieClip 非常简单,它只有一个 TextField 作为子项。我将MC与AS链接并编译为SWC。我可以通过this.textIns.width更改TextField的宽度,this.width也自动更改。但是,我放在舞台上的SWC组件并没有改变我在面板上看到的宽度在 Flash 中。
  • 我添加了相同文本容器的示例,但带有背景和填充。为什么要在 Flash IDE 中使用您的组件?实例化它,随意放置它。 Flash IDE 没有提供聪明的工具来调整组件的大小以尊重他们的孩子。
  • @NicolasSiver 图形总是我想要的,但问题是我的 SWC 组件的 Flash IDE 中的选择范围不正确。而且 Flash IDE 面板上显示的大小也不正确。我要更改的数字与 MC 的宽度无关。所以我已经编辑了问题。
  • SWC组件是什么意思?我认为,您误解了 Flash IDE 如何工作的主要思想。如果您使用 ActionScript 导出设置调用 SWC 组件简单库对象,则该库对象不会对场景、您的操作做出反应。如果你真的想要带有 Live Preview 的组件,你可以create one
【解决方案2】:

你必须改变'this'相对于某物的宽度。最有可能的是它的容器。所以让我们假设你的TextArea 类在你的Main 类中被实例化为'textarea' 在Main 你会这样写:textarea.width = 500

【讨论】:

  • 已更改,但我发现这不是我想要的。我已编辑问题。
【解决方案3】:

最后我发现Flash IDE和SWC中的AS代码之间有一堵不可逾越的墙。无法从 SWC 访问 IDE 的数据。

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 2014-03-30
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多