1

我有一个矩形,我想在上面显示一个标签。我试图通过创建一个矩形精灵来做到这一点,然后将一个 textField 添加到精灵的显示树中。

问题是文本字段周围似乎有很多额外的空白填充。尽管文本适合该框,但 textField 的边界超出了其包含矩形的可见区域。这也会导致矩形的宽度和高度发生变化。

问题是我希望用户能够在屏幕上拖动矩形。我添加了一个事件监听MOUSE_DOWN器来启动拖动。但是,用户可以通过单击可见矩形周围的区域来开始拖动,而不仅仅是在矩形本身上。我认为这是因为用户实际上会点击来自 TextField 的额外空白空间并从边缘渗出

有任何想法吗?

4

2 回答 2

0

我认为您正在寻找的是textField.autoSize参数。它使文本字段范围缩小到文本的大小(否则它具有默认的高度/宽度,无论它包含的文本如何)

import flash.text.TextField;
import flash.text.TextFieldAutoSize;

var textField:TextField = new TextField();

textField.autoSize = TextFieldAutoSize.LEFT;
textField.text = "your text"; //set this AFTER autoSize

您还可以将 textField 的宽度设置为矩形的宽度。或者放弃 autosize 属性并手动将文本框的高度/宽度设置为矩形的高度/宽度,尽管这会截断任何不适合的文本。

文本字段上总是有一些填充。获取实际文本的确切边界可能很棘手(尽管有可能)。一种更简单的方法是仅屏蔽您的文本框。

如果你的矩形是用图形类绘制的,你可以这样做:

var rectangle:Sprite = new Sprite();
rectangle.graphics.beginFill(0xFF0000);
rectangle.graphics.drawRect(0,0,100,100);
addChild(rectangle);

var myMask:Shape = new Shape();
myMask.graphics.copyFrom(rectangle.graphics);
rectangle.addChild(myMask);

var textField:TextField = new TextField();
textField.width = rectangle.width;
textField.height = rectangle.height;
textField.mask = myMask;

rectangle.addChild(textField);

您可以做的另一种选择是在您的事件侦听器中,检查目标是否是文本框并退出该函数。(如果您使用此方法,请确保您的文本字段的 mouseEnabled 属性为 true(默认))

function rectangleClickHandler(e:Event):void {
    if(e.target == myTextField) return;
    //rest of your code
}
于 2012-09-15T00:10:47.293 回答
0

您可以做的另一件事,可能比掩码等更简单,就是让文本字段不接收鼠标事件。这将阻止任何鼠标事件因与文本字段的交互而被触发,但您仍然可以在矩形上处理它们。

这里重要的项目是 mouseEnabled 标志。您在容器上启用 mouseChildren,但禁用容器和文本字段的 mouseEnabled。

var tf:TextField = new TextField();
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = "Testing the text mouse enabled";

var rectangle:Sprite = new Sprite();
rectangle.graphics.beginFill(0xFF0000);
rectangle.graphics.drawRect(0,0,100,100);

var container:Sprite = new Sprite();
container.addChild( rectangle );
container.addChild( tf );
addChild( container );

// IMPORTANT FLAGS HERE
tf.mouseEnabled = false;
container.mouseEnabled = false;
container.mouseChildren = true;

container.addEventListener( MouseEvent.ROLL_OVER, rollOverHandler, false, 0, true );

事件处理程序只会在容器的其他子项滚动时触发,而不是文本字段。使用此方法,您可以选择性地激活容器对象中启用鼠标的组件。

于 2012-09-15T22:51:43.767 回答