Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.07.2009, 20:12
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 1  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Question Drag & drop реагирует на дочерних элементах

Есть экземпляр Panel, на нем размещены элементы управления. В приведенном ниже примере Drag & drop срабатывает всегда, даже когда юзер сделал клик на кнопке или текстовом поле. А хочется, чтобы панель перетаскивалась только за заголовок. Вариант добавить на все элементы событие mouseDown и душить его, чтобы оно не обрабатывалось панелью нравится не очень Наверное же есть способ по-красивее?

Код AS3:
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" >
	<mx:Script><![CDATA[
		import flash.net.URLLoader;
		import flash.net.URLRequest;
		import flash.net.URLVariables;
 
		import flash.events.Event;
		import flash.events.IOErrorEvent;
		import flash.events.MouseEvent;
 
 
 
		private function eventPanelStartDrag(e:MouseEvent):void
		{
			if (e.currentTarget == panel)
			{
				panel.startDrag();
 
 
			}
 
			txtLog.text += "\n" + e.target.toString();
			txtLog.text += "\n" + e.currentTarget.toString();
		}
 
		private function eventPanelStopDrag(e:MouseEvent):void
		{
			panel.stopDrag();
 
			txtLog.text += "\n" + "stop";
		}
 
        private function onSendData(e:MouseEvent):void
        {
 
        }    
    ]]></mx:Script>
	<mx:Panel id="panel" width="500" height="300" title="test" layout="vertical" 
		horizontalAlign="center" paddingTop="8" paddingBottom="8" paddingLeft="8" paddingRight="8"
		mouseDown="eventPanelStartDrag(event)" mouseUp="eventPanelStopDrag(event)" >
		<mx:TextInput id="txtParams" width="100%" text="g_ind=2" />
		<mx:Button id="btnSendData" label="Send data" click="onSendData(event)" />
		<mx:TextArea id="txtLog" width="100%" height="100%" text="log:" editable="false" />
	</mx:Panel>
</mx:Application>

Старый 09.07.2009, 17:24
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 2  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Свойство event.currentTarget для любого элемента внутри панели всегда будет указывать на саму панель, т.к. событие всплывающее, а подписан обработчик именно на событие панели. Следует использовать свойство event.target, указующее на оригинальный элемент, в котором произошло событие, т.е. определить, что приходит в event.target при нажатии на заголовок и стартовать перетаскивание только в этом случае.
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 09.07.2009, 19:42
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 3  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Приходит Main0.panel.UIComponent18.UITextField20, но делать такое сравнение:
Код AS3:
if (e.target.name == "UITextField20")
{
	panel.startDrag();
}
выглядит как-то не кошерно Тем более, что имя для заголовка дается автоматически, и нет гарантий, что при добавлении новых элементов управления оно не изменится, скажем, на UITextField21

Старый 09.07.2009, 20:09
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 4  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
У этого объекта наверняка есть десятка два характерных свойств. Родитель и позиция кажутся наиболее многообещающими.
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 10.07.2009, 17:39
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 5  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Добавил для Panel на событие creationComplete свойство hitArea:
Код AS3:
private function initHitArea(e:Event):void
{
	var hitTitle:Sprite = new Sprite();
 
	hitTitle.graphics.beginFill(0x00FF00);
	hitTitle.graphics.drawRect(0, 0, panel.width, 30);
 
	panel.hitArea = hitTitle;
	hitTitle.mouseEnabled = false;
 
	//panel.rawChildren.addChild(hitTitle);
}
по началу все казалось рабочим, но потом выяснилось, что если нажать на кнопке, или текстовом поле, которые лежат на панеле - все начинает тягаться снова
И еще, параллельный вопрос, почему использование FlexSprite приводит к ошибке:
Код AS3:
private function initHitArea(e:Event):void
{
	var hitTitle:FlexSprite = new FlexSprite();
 
	hitTitle.graphics.beginFill(0x00FF00);
	hitTitle.graphics.drawRect(0, 0, panel.width, 30);
 
	panel.hitArea = hitTitle;
	hitTitle.mouseEnabled = false;
 
	panel.addChild(hitTitle);
}
Ведь FlexSprite наследник UIComponent?

Старый 10.07.2009, 18:10
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 6  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
По прежнему не понимаю твоей проблемы. Я положил панель, написал ей заголовок, в неё кинул кнопку, на клик подписал событие, в котором выводил класс источника события и класс парента этого объекта, и вот что получил:
Код:
mx.containers::Panel BlackTest // клик по пустой панели
mx.controls::Button mx.containers::Panel // клик по кнопке
mx.core::UITextField mx.core::UIComponent // клик по заголовку
Если на имена объектов закладываться действительно не стоит, то пара "класс объекта" + "класс парента объекта" выглядит надёжно.
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 10.07.2009, 18:37
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 7  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Согласен, для моей небольшой задачки этого вполне достаточно. Просто я изучаю Flex и меня очень удивил этот момент, захотелось найти хорошее решение. Наиболее приличный вариант, как на мой взгляд, выглядит так:
Код AS3:
private function eventPanelStartDrag(e:MouseEvent):void
{
	var mousePoint:Point = panel.globalToLocal(new Point(e.stageX, e.stageY));
 
	if ((mousePoint.x > 0 && mousePoint.x < panel.width) && (mousePoint.y > 0 && mousePoint.y < 30))
	{
		panel.startDrag();
	}
}
но и тут не обошлось без неприятного момента
У панели есть свойство headerHeight, которое определяет высоту заголовка окна отлично задается через mxml. Однако, при обращении к этому свойству через AS, дабы определить область заголовка, возникает ошибка компиляции:
Код:
Error: Access of possibly undefined property headerHeight through a reference with static type mx.containers:Panel.
ах-ха, добрался таки до этого свойства через
Код AS3:
panel.getStyle("headerHeight")
уже что-то, жаль только, по умолчанию оно undefined


Последний раз редактировалось litebox; 10.07.2009 в 18:49. Причина: добавлен ответ
Создать новую тему Ответ Часовой пояс GMT +4, время: 19:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 19:52.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.