首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拖放AS3:拖动包含动态和输入文本的mc时出错

拖放AS3:拖动包含动态和输入文本的mc时出错
EN

Stack Overflow用户
提问于 2010-11-13 09:52:33
回答 3查看 2.1K关注 0票数 0

简单的拖放应用程序,其中mc从一个父mc中拖出,然后放到另一个父mc中。

一切正常,直到我向mc添加了两个文本框--一个是由代码设置的不可选动态文本框(一个标签),另一个是用户可以修改的可选择输入文本。

文本框引起了一些问题:

当用户悬停在mc中包含文本字段(甚至是不可选择的文本??)的部分时,

  1. Finger游标就会消失。当用户试图通过不经意地单击-拖动两个文本区域内的任何位置来拖动mc时,它会导致此错误: TypeError: Error #1034:类型强制失败:无法将flash.text::TextField@2374a381转换为flash.display.MovieClip (两个文本框都出现相同的错误)
  2. 输入文本框可能会混淆用户--他们有时如何单击拖动,有时单击以修改?我认为输入文本需要清楚地成为mc中的非点击拖动“区域”。(希望这是合理的)

不确定,但也许我需要在mc中创建一个覆盖区域,这是点击检测到的拖动吗?

还有其他建议吗?

下面是代码的相关部分:

代码语言:javascript
复制
var itemArray:Array = [
                    {iname:"police",ititle:"POLICE OFFICER"},
                    {iname:"insurance_assessor",ititle:"INSURANCE ASSESSOR"},
                    {iname:"estimator",ititle:"ESTIMATOR"}
                    ];
for (var i:int=0; i < itemArray.length; i++) 
{ 
 var itemname:String = itemArray[i].iname;
 var curritem:MovieClip = MovieClip(scrollitems.getChildByName(itemname)); 
 if (curritem != null) 
 { 
   curritem.ititle.text = itemArray[i].ititle;
   curritem.addEventListener(MouseEvent.MOUSE_DOWN, pickUp); 
   curritem.addEventListener(MouseEvent.MOUSE_UP, dropIt); 
   curritem.buttonMode = true; 
 }
}

function pickUp(event:MouseEvent):void
{
  var dragIt:MovieClip = MovieClip(event.target);   //type casting
  var dragPoint:Point = dragIt.parent.localToGlobal(new Point(dragIt.x,dragIt.y));
  dragIt.parent.removeChild(dragIt); // remove item from current parent mc
  stage.addChild(dragIt); //temp add to stage
  dragIt.x = dragPoint.x;
  dragIt.y = dragPoint.y;
  dragIt.startDrag();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-13 10:34:33

您遇到的问题是,Textfield是mouseEnabled。label字段mouseEnabled属性应该设置为false,对于其他TextField,我可以想到两种解决方案。

  • 更简单的方法(正如您已经提到的)可以是在mc中创建一个可拖动的hitArea,类似于桌面上的窗口顶部,您可以将事件侦听器添加到这个区域,这样mc只能从那里拖动。
  • 第二种方法可以是在MouseDown上将mc的mouseChildren属性设置为false,在MouseUp上将其返回为true。这不应干扰用户在输入文本字段中输入文本。
票数 3
EN

Stack Overflow用户

发布于 2012-07-31 13:59:58

只需将事件侦听器(focus_in & out)添加到文本字段,生成函数并删除focus_in上拖放的事件,并在focus_out上返回它们。如下所示:

代码语言:javascript
复制
drag.textFieldName.addEventListener(FocusEvent.FOCUS_IN, setFIn);
drag.textFieldName.addEventListener(FocusEvent.FOCUS_OUT, setFOut);
function setFIn(focus:FocusEvent):void {
    var item = focus.target.parent;
    item.removeEventListener(MouseEvent.MOUSE_DOWN, MCdrag_press);
    item.removeEventListener(MouseEvent.MOUSE_UP, MCdrag_release);
}
function setFOut(focus:FocusEvent):void {
    var item = focus.target.parent;
    item.addEventListener(MouseEvent.MOUSE_DOWN, MCdrag_press);
    item.addEventListener(MouseEvent.MOUSE_UP, MCdrag_release);
}

如果用户接触到文本区域,它不会错误地拖动它,甚至会显示闪存错误。干杯

票数 2
EN

Stack Overflow用户

发布于 2012-06-13 17:27:36

问题产生于这样一个事实: MOUSE_DOWN用于开始编辑TextFields并开始拖动您的MovieClip。因此,如果您能够区分单击对象是否为TextField,则可以摆脱这种模糊,如下所示:

代码语言:javascript
复制
var curritem:MovieClip = new MovieClip();
curritem.Width = 125;
curritem.Height = 25;

var fontFormat:TextFormat = new TextFormat( );
fontFormat.font = "Arial";

var tf:TextField = new TextField();
tf.type = TextFieldType.INPUT;
tf.setTextFormat(fontFormat);
tf.text = "Some Text";

curritem.addChild(tf);

curritem.addEventListener(MouseEvent.MOUSE_DOWN, startMove); 
curritem.addEventListener(MouseEvent.MOUSE_UP, stopMove); 

function startMove(act:MouseEvent):void
{
    if (getQualifiedClassName(act.target) == "flash.text::TextField")
    {
        trace("text is down");
        act.target.parent.startDrag();
    }
    else
    {
            trace("movieclip is down");
        act.target.startDrag();
    }


}

function stopMove(act:MouseEvent):void
{
    if (getQualifiedClassName(act.target) == "flash.text::TextField")
    {
        trace("text is up");
        act.target.parent.stopDrag();

    }
    else
    {
        trace("movieclip is up");
        act.target.stopDrag();
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4171912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档