mouseUp и mouseMove вне приложения? - PullRequest
0 голосов
/ 07 июня 2011

Я пытаюсь реализовать очень простой способ выбора части экрана с помощью мыши.Рабочий процесс является стандартным для многих приложений - нажмите на начальную точку, переместите мышь и обновите прозрачный прямоугольник между нажатой первой точкой и текущей позицией мыши.Базовый код выглядит примерно так (за исключением графики, которая проста)

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" mouseDown="application1_mouseDownHandler(event)">

    <fx:Script>
        <![CDATA[
            import spark.components.mediaClasses.VolumeBar;

            private var _anchorPoint:Point = new Point();
            private var _currentPoint:Point = new Point();

            protected function application1_mouseDownHandler(event:MouseEvent):void
            {
                addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
                addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
                _anchorPoint = new Point(event.stageX, event.stageY);   
            }

            private function handleMouseMove(e:MouseEvent):void
            {
                _currentPoint.x = e.stageX;
                _currentPoint.y = e.stageY;
                trace("rectangle between (",_anchorPoint.x, ",", _anchorPoint.y, ") and (", _currentPoint.x, ",", _currentPoint.y, ").");
            }

            private function handleMouseUp(e:MouseEvent):void
            {
                removeEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
                removeEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
            }
        ]]>
    </fx:Script>
</s:Application>

Это ломается, когда пользователь перемещает мышь за пределы приложения.Не только _currentPoint перестает обновляться, но и если вы отпустите кнопку мыши за пределами приложения, вы пропустите событие mouseUp, т. Е. Когда вы вернете мышь назад в приложение, _currentPoint снова начнет обновляться, как будто вы никогда не отпускали кнопку мыши,Мне было интересно, есть ли способ во Flex (для веб-приложений) обойти это, слушая события mouseMove и mouseUp, когда они находятся вне приложения (если это возможно) или любым другим способом, который может иметь смысл.

спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Вот что большинство людей не знают: MouseEvents отслеживаются за пределами окна приложения, если сработало событие MOUSE_DOWN, но не MOUSE_UP.Вы можете захватывать позиции мыши за пределами окна приложения (и даже за пределами окна браузера) , пока пользователь не удерживает мышь нажатой. Чтобы проверить это, попробуйте выполнить следующий код:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx"
           creationComplete="init()">
<fx:Script>
    <![CDATA[
        protected function init():void {
            addEventListener(Event.ADDED_TO_STAGE, magic)
        }

        protected function magic(e:Event):void {
            stage.addEventListener(MouseEvent.MOUSE_MOVE, moreMagic);
        }

        protected function moreMagic(e:MouseEvent):void {
            magicalButton.label = "Hold me down! " + String(e.stageX) + "x" + String(e.stageY);
        }
    ]]>
</fx:Script>    
<s:Button id="magicalButton" label="Hold me down!"/>

0 голосов
/ 07 июня 2011

Хотя это не приведет вас туда, куда вы хотите, вы можете использовать события Event.MOUSE_LEAVE и MouseEvent.MOUSE_MOVE, чтобы отслеживать, находится ли курсор в границах приложения.

0 голосов
/ 07 июня 2011

Это может быть возможно при некотором взломе в AIR, но определенно не при веб-приложении, открытом в браузере.

Только представьте, что произойдет, если веб-сайты смогут отслеживать вашу мышь вне браузера и делать снимки экранавашей ОС!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...