![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
Есть экземпляр Panel, на нем размещены элементы управления. В приведенном ниже примере Drag & drop срабатывает всегда, даже когда юзер сделал клик на кнопке или текстовом поле. А хочется, чтобы панель перетаскивалась только за заголовок. Вариант добавить на все элементы событие mouseDown и душить его, чтобы оно не обрабатывалось панелью нравится не очень
Наверное же есть способ по-красивее?<?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> |
|
|||||
|
некрофил
Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
|
Свойство event.currentTarget для любого элемента внутри панели всегда будет указывать на саму панель, т.к. событие всплывающее, а подписан обработчик именно на событие панели. Следует использовать свойство event.target, указующее на оригинальный элемент, в котором произошло событие, т.е. определить, что приходит в event.target при нажатии на заголовок и стартовать перетаскивание только в этом случае.
__________________
...убивать людей не удовольствия ради, но для еды. |
|
|||||
|
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
Приходит Main0.panel.UIComponent18.UITextField20, но делать такое сравнение:
выглядит как-то не кошерно Тем более, что имя для заголовка дается автоматически, и нет гарантий, что при добавлении новых элементов управления оно не изменится, скажем, на UITextField21 |
|
|||||
|
некрофил
Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
|
У этого объекта наверняка есть десятка два характерных свойств. Родитель и позиция кажутся наиболее многообещающими.
__________________
...убивать людей не удовольствия ради, но для еды. |
|
|||||
|
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
Добавил для Panel на событие creationComplete свойство hitArea:
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 приводит к ошибке: Ведь FlexSprite наследник UIComponent? |
|
|||||
|
некрофил
Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
|
По прежнему не понимаю твоей проблемы. Я положил панель, написал ей заголовок, в неё кинул кнопку, на клик подписал событие, в котором выводил класс источника события и класс парента этого объекта, и вот что получил:
Если на имена объектов закладываться действительно не стоит, то пара "класс объекта" + "класс парента объекта" выглядит надёжно.
__________________
...убивать людей не удовольствия ради, но для еды. |
|
|||||
|
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
Согласен, для моей небольшой задачки этого вполне достаточно. Просто я изучаю Flex и меня очень удивил этот момент, захотелось найти хорошее решение. Наиболее приличный вариант, как на мой взгляд, выглядит так:
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. уже что-то, жаль только, по умолчанию оно undefined ![]() Последний раз редактировалось litebox; 10.07.2009 в 18:49. Причина: добавлен ответ |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|