假设以下代码:
package
{
import somenamespace.Button;
import flash.display.*;
import flash.events.Event;
import flash.text.TextField;
public final class Main extends Sprite
{
public function Main()
{
stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);
function init(pEvent:Event = null):void {
// support autoOrients
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
removeEventListener(Event.ADDED_TO_STAGE, init);
/*var btn:Button = new Button(0, 0, 400, 400)
addChild(btn);*/
var sprite:Sprite = new Sprite();
sprite.width = 400;
sprite.height = 400;
addChild(sprite);
var label2:TextField = createCustomTextField(sprite, 0, 50, 200, 20);
label2.text = "Drag to select some of this text.";
}
}
private function createCustomTextField(sprite:Sprite, x:Number, y:Number, width:Number, height:Number):TextField {
var result:TextField = new TextField();
result.x = x; result.y = y;
result.width = width; result.height = height;
sprite.addChild(result);
return result;
}
}
}
我无法让嵌套的孩子在屏幕上显示自己的孩子。 addChild()
可能会增加孩子,但屏幕上没有任何反应。我不明白为什么。我曾经习惯使用Flex和Starling这样的东西,但是这个成语在转向直接香草时甚至在这个基本点上都有所改变。
你可以看到我在设计自定义按钮类的地方注释了一些代码,我遇到了很多同样的麻烦;然而,当我开始尝试将一个精灵添加到按钮上时,我能够让它最终在屏幕上绘制一个蓝色矩形,并且一旦我开始使用按钮自己的graphics
改为绘制矩形的属性(Button
extends Sprite
),以及使用一些笨拙的时间等操作其宽度和高度。
之前我曾尝试将TextField
直接添加到Button
,最初是在自己的构造函数中,但是甚至将其添加到Sprite
类中的常规Main
不工作。将sprite.addChild(result);
替换为addChild(result);
会使其显示正常。
一般来说,这类设计有什么问题?我不只是询问这个特定的例子,但总的来说,你如何让孩子们添加孩子来增加孩子等等?谢谢!
更新
嗯,事实证明,在width
上设置height
和Sprite
是造成问题的原因。拿出来,你很好。您甚至可以让嵌套的Sprite
graphic
属性绘制一个具有特定宽度和高度的矩形,然后将子项添加到Sprite
,只要您不是实际设置那些特定的属性。遵守这一条规则,一切都很好。不服从,它是世界末日!!!
......或者是吗?我的意思是,那些属性可能是有正当理由的;很难说它们为什么会导致阻止儿童出现在屏幕上的问题,除了触摸它们的简单事实之外别无其他原因。在我进行实验时,我通常会确保提供的值足够大,可以容纳Sprite
个孩子,以及他们的x
和y
属性也设置得恰当,所以他们不应该被移出屏幕,甚至不能移出Sprite
本身。有人有个主意吗?
修改
另外需要注意的是,一旦我得到Button
类来绘制蓝色矩形,我就可以通过设置width
和{{以某种方式调整矩形本身的大小。 1}} height
的属性; Button
' Button
属性的大小已缩放以与graphics
对齐,这是内置算法的一部分。然而,这实际上是否有效取决于某种方式设置的东西,并且设置本身似乎是随机的。在这一点上,我向前迈进,没有弄乱Button
s' Sprite
和width
属性,但有些东西有点模糊。
答案 0 :(得分:2)
让我们首先找出文档中有关width属性的内容: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#width
根据显示对象内容的界限计算宽度。
新创建的Sprite对象中没有内容。它只是一个空容器。 在没有内容的情况下阅读这个值是有意义的,答案是0.但是写一个与0不同的值并不是很有意义。 你想怎么改变什么的宽度?
基本上,空的DisplayObject不应具有可写属性宽度。 也许它会在你尝试这样做时引发错误,但它并不是真的必须这样做,因为操作不是很合理。
答案 1 :(得分:1)
我在这里建议了几件事 - 看看这个:
package com.test
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.text.TextField;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//Change the stage parameters
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
//Adding a test Sprite
var sprite:Sprite = new Sprite();
this.addChild(sprite);
//Adding some color to the sprite so you can see ti
sprite.graphics.beginFill(0xff0000,1);
sprite.graphics.drawRect(0, 0, 100, 200);
sprite.graphics.endFill();
//Adding a text field
var textField:TextField = new TextField();
textField.text = "HELLO!";
this.addChild(textField);
}
}
}
这是一个类似的例子,希望能够展示正在发生的事情。首先,你的init函数是在构造函数中调用的,因此我不确定它是否应该像它应该的那样工作,尝试将它拉出到它自己的函数中。此外 - 实例化时显示对象实际上没有任何内容,因此实际上不需要指定高度和宽度。除非您需要明确定义它们,否则让内容确定高度和宽度。
您可以修改示例,以便使用以下命令将TextField添加到sprite而不是主Sprite:
sprite.addChild(textField);
希望这有帮助!