【问题标题】:Actionscript event listener on rectangle containing larger TextField包含较大 TextField 的矩形上的 Actionscript 事件侦听器
【发布时间】:2012-09-15 00:09:10
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: actionscript-3 flash actionscript


    【解决方案1】:

    我认为您正在寻找的是 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
    }
    

    【讨论】:

    • 我实际上已经在使用它了。我刚刚做了一个测试,发现如果我绘制一个 141x34 的框并添加一个在框中显示的 textField,则该框的新尺寸为 141x48.5。似乎 textField 上方/下方只有很多填充?
    • 是的,填充取决于字体。我更新了我的答案,我建议使用口罩。在您的问题中显示您的代码总是好的,这样我们就可以为您提供更相关的答案
    • 谢谢。我刚刚按照上面的方法实现了一个掩码,它工作得很好。 :)
    • 增加了一件你可以做的事情,如果你不想使用掩码(稍微贬低性能)
    • 我想我会贴上面具,因为我希望光标在鼠标悬停时改变,所以它会更简单。再次感谢
    【解决方案2】:

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

    这里的重要项目是 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 );
    

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

    【讨论】:

    • TextField 类没有 mouseChildren 属性,但这并不重要。
    • 这在这种情况下实际上是行不通的,因为侦听器不在文本字段上,而是在父级上。父级仍将调度事件,因为子对象(如 textField)使其边界增长。这样做只会使目标成为父对象,而不是事件上的 textField。
    • 啊抱歉,我的答案没有详细说明。我会更正它。
    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多