【问题标题】:Drag-drop AS3: trouble dragging an mc that contains dynamic and input text拖放 AS3:拖动包含动态和输入文本的 mc 时遇到问题
【发布时间】:2010-11-13 09:52:33
【问题描述】:

简单的拖放应用程序,其中 mc 从一个父 mc 拖出并放入另一个父 mc。
一切正常,直到我向 mc 添加了 2 个文本框——一个是由代码设置的不可选择的动态文本框(标签),另一个是用户可以修改的可选输入文本。

文本框会导致一些问题:

  1. 当用户将鼠标悬停在包含文本字段(甚至是不可选择的文本??)的 mc 部分上时,手指光标消失
  2. 当用户试图通过无意中单击并拖动两个文本区域内的任意位置来拖动 mc 时,会导致此错误:TypeError: Error #1034: Type Coercion failed: cannot convert flash.text::TextField@2374a381 to flash.display.MovieClip(两个文本框出现相同的错误)
  3. 输入文本框可能会让用户感到困惑——他们如何有时单击拖动有时单击修改?我认为输入文本需要清楚地是 mc 中的非单击拖动“区域”。 (希望这是有道理的)

不确定,但也许我需要在 mc 中创建一个覆盖区域,以便为拖动检测到点击?
还有其他建议吗?

以下是相关的代码:

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();
}

【问题讨论】:

    标签: flash actionscript-3 drag-and-drop


    【解决方案1】:

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

    • 更简单的方法(正如您已经提到的)可能是在您的 mc 中创建一个可拖动的 hitArea,类似于桌面上窗口的顶部,您可以将事件侦听器添加到该区域,以便 mc只能从那里拖动。

    • 第二种方法是在 MouseDown 上将 mc 的 mouseChildren 属性设置为 false,在 MouseUp 上将其设置为 true。这不应干扰用户在输入文本字段中输入文本。

    【讨论】:

    • 感谢您的建议。 mouseEnabled 快速解决了标签问题。 mouseChildren 在这种情况下不会帮助我,所以我将尝试使用可拖动的 hitArea。
    【解决方案2】:

    只需将事件侦听器(focus_in 和 out)添加到文本字段,创建函数并删除 focus_in 上的拖动事件并将它们返回到 focus_out。 像这样:

    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);
    }
    

    如果用户曾经触摸过文本区域,它不会错误地拖动它,甚至会显示 flash 错误。 干杯

    【讨论】:

      【解决方案3】:

      问题源于 MOUSE_DOWN 用于开始编辑 TextFields 并开始拖动您的 MovieClip。因此,如果您可以区分单击的对象是否是 TextField,您可以摆脱这种歧义,如下所示:

      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();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多