Кто-нибудь знает, как захватить мышь в приложении Flex / Flash Air? - PullRequest
0 голосов
/ 07 июля 2011

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

Попробуйте это в окне приложения flex / air:

<s:Scroller height="500" width="300">
    <s:VGroup>
        <s:Rect width="100%" height="2000">
            <s:fill>
                <s:SolidColor color="#ffcc00"/>
            </s:fill>
        </s:Rect>
    </s:VGroup>
</s:Scroller>

Если нажать и удерживать маркер полосы прокрутки и перетащитьснаружи, даже за окном, полоса прокрутки все еще работает.Это не потеряет фокус.Так что захватывает мышь.

что я хочу:

  • Мышь и сенсорный захват.(Даже за пределами окна, все еще нажимая кнопку или точку касания)

Ответы [ 3 ]

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

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

Я провел несколько тестов, пытаясь прислушиваться к событиям, и пришел с пустыми руками. Игрок сам должен их получить, но в любом случае я не могу его найти.

Итак, я подумал о создании более или менее скрытого компонента прокрутки (или набора из них), который бы захватывал щелчок и запускал событие перетаскивания. Немного взломать, но крутая идея ...

Затем вы можете опрашивать текущую позицию прокрутки, чтобы угадать, где находится мышь (за пределами окна), с набором горизонтальных и вертикальных скроллеров. Вы МОЖЕТЕ сделать это, однако возникает проблема, что значения положения скроллера будут иметь максимальные пределы в зависимости от их собственного размера. Это означает, что у вас останутся пробелы в том, где находится мышь. Таким образом, вы можете узнать, как далеко вверх или вниз мышь Y расположена на экране, даже если она находится далеко за пределами левого или правого (ось X) приложения (я был на втором мониторе, например), НО вы будете не знаю, где он находится на оси X, и вы будете знать только Y, поскольку он относится к размеру приложения (не выше или ниже, где он существует на экране в другом месте).

Вот изображение того, что вы можете захватить с помощью этого трюка / хака: enter image description here

Так что да, вы можете использовать метод опроса, как я описал, но вы получите только эти координаты.

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

Что я не пробовал, так это создание большого контейнера, расположенного за пределами главного окна приложения, и применение к нему скроллера. Если бы вы сделали это, вы могли бы потенциально заставить это работать:

enter image description here

Это была интересная концепция, умная - определенно не поддерживаемая функциональность. : P ~

0 голосов
/ 11 августа 2012

Вот код, который я использую для этой цели:

import flash.display.InteractiveObject;
import flash.events.MouseEvent;
import flash.geom.Point;

public class Dragger
{
    private var target:InteractiveObject;
    private var mouseDownPoint:Point;
    private var originalPosition:Point;

    public function Dragger(target:InteractiveObject)
    {
        this.target = target;
        target.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
    }

    private function onMouseDown(event:MouseEvent):void
    {
        mouseDownPoint = new Point(event.stageX, event.stageY);
        originalPosition = new Point(target.x, target.y);
        event.stopPropagation();

        target.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
        target.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
    } 
    private function onMouseUp(event:MouseEvent):void
    {
        onMouseMove(event);
        mouseDownPoint = null;
        event.stopPropagation();
        target.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
        target.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
    } 
    private function onMouseMove(event:MouseEvent):void
    {
        if (!mouseDownPoint) return;
        target.x = originalPosition.x + event.stageX - mouseDownPoint.x;
        target.y = originalPosition.y + event.stageY - mouseDownPoint.y;
        event.updateAfterEvent();               
        event.stopPropagation();
    } 
}

Чтобы использовать, просто создайте новый Dragger (your_object).

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

По крайней мере, на настольных компьютерах, использующих мышь, это должно работать, насколько я знаю.Например:

import flash.text.TextField;
import flash.events.MouseEvent;

var t:TextField = new TextField();
stage.addChild(t);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouse);

function onMouse( e:MouseEvent ) {
    t.text = e.stageX +", "+ e.stageY;
}

Для меня события отображаются в текстовом поле как тогда, когда мышь находится внутри области Flash, так и когда вы щелкаете внутри Flash и перетаскиваете за ее пределы.Поэтому, если у вас возникли проблемы, я предполагаю, что это может быть связано с компонентами, которые вы используете, или с тем, как структурирован ваш контент (например, какой объект вы регистрируете для событий и т. Д.).Но нет никакого специального способа заставить события мыши продолжаться, когда пользователь перетаскивает из прямоугольника Flash.

(Обратите внимание, что сенсорные устройства могут быть другой ситуацией - часто их браузеры используют жесты панорамирования, прежде чем они получатна Flash, кроме как в полноэкранном режиме, или иногда они дают события перетаскивания Flash, когда Flash «увеличен» (двойным касанием). Ваш пробег может отличаться в разных браузерах на разных устройствах ..)

...