Drag-drop AS3: проблема при перетаскивании mc, который содержит динамический и вводимый текст - PullRequest
0 голосов
/ 13 ноября 2010

Простое приложение для перетаскивания, в котором mc перетаскивается из одного родительского mc и перетаскивается в другой родительский mc.
Все работает нормально, пока я не добавлю 2 текстовых поля в mc - одно из них не выбирается для динамического текстового поля.(метка), которая устанавливается кодом, другой - выбираемый вводимый текст, который пользователь может изменить.

Текстовые поля вызывают некоторые проблемы:

  1. Курсор пальца исчезает, когда пользовательпарит над разделом mc, который содержит текстовые поля (даже текст без возможности выбора ??)
  2. Когда пользователь пытается перетащить mc путем неосторожного перетаскивания в любом месте в обеих текстовых областях, это вызывает эту ошибку: Ошибка типа: ошибка # 1034: сбой приведения типа: невозможно преобразовать flash.text :: TextField @ 2374a381 в 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();
}

Ответы [ 3 ]

3 голосов
/ 13 ноября 2010

Проблема в том, что текстовые поля являются mouseEnabled.Свойство поля метки mouseEnabled должно быть установлено в false, так как для другого TextField я могу придумать два решения.

  • Более простой подход (как вы уже упоминали) может состоять в создании перетаскиваемого объекта.HitArea в вашем mc, аналогично верхней части окна на рабочем столе, вы можете добавить своих слушателей событий в эту область, так что mc можно только перетаскивать оттуда.

  • секундуподход может заключаться в том, чтобы установить для свойства mC mouseChildren значение false для MouseDown и значение true для MouseUp.Это не должно мешать пользователю вводить текст в поле ввода текста.

2 голосов
/ 31 июля 2012

Просто добавьте прослушиватели событий (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);
}

Если пользователь когда-либо прикасается к текстовым областям, он не перетаскивает его по ошибке и даже не отображает ошибку флэш-памяти. Приветствия

0 голосов
/ 13 июня 2012

Проблема связана с тем, что MOUSE_DOWN используется для начала редактирования TextFields, а также для начала перетаскивания вашего мувиклипа.Таким образом, если вы могли бы определить, является ли выбранный объект текстовым полем, вы можете выйти из этой неопределенности следующим образом:

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

}
...