Можно ли симулировать щелчок мышью, используя события мыши вверх и вниз? - PullRequest
5 голосов
/ 24 сентября 2011

Предыдущий вопрос заставил меня задуматься.Можно ли смоделировать MouseEvent.CLICK для запуска, просто запустив сначала MOUSE_DOWN, а затем MOUSE_UP.

В соответствии с требованиями Adobe."... Чтобы произошло событие щелчка, оно всегда должно следовать за этой серией событий в порядке появления: событие mouseDown, затем mouseUp. Целевой объект должен быть одинаковым для обоих этих событий; в противном случае событие нажатия не происходит. Любое количество других событий мыши может происходить в любое время между событиями mouseDown или mouseUp; событие щелчка по-прежнему происходит ».http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/InteractiveObject.html#event:click

Из моих тестов видно, что событие CLICK НЕ составлено из очереди событий ActionScript 3.Или что-то не так с кодом?

См .:

package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;

[SWF(backgroundColor="0xFFFFFF", frameRate="30", width="800", height="600")]

public class Test extends Sprite
{
    private var spr:Sprite = new Sprite();
    public function Test()
    {
        trace("Test()");
        this.addEventListener(Event.ADDED_TO_STAGE,init);
    }
    public function init(e:Event):void
    {
        trace("init()");
        spr.graphics.beginFill(0xFF0000);
        spr.graphics.drawRect(0,0,200,80);
        spr.graphics.endFill();
        addChild(spr);
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
        spr.addEventListener(MouseEvent.CLICK, onClick);
    }
    private var tick:int = 0;
    private function onEnterFrame(e:Event):void
    {
        if (tick == 1) spr.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN,true,false));
        if (tick == 2) spr.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP,true,false));
        if (tick == 3) spr.dispatchEvent(new MouseEvent(MouseEvent.CLICK,true,false));
        tick++;
    }
    private function onClick(e:MouseEvent):void
    {
        trace("onClick() MouseEvent.CLICK dispatched"); 
    }
}
}

Я должен получить ДВА события onClick () вместо одного.

Ответы [ 5 ]

3 голосов
/ 12 октября 2011

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

MouseEvent.MOUSE_DOWN запускается, как только вы нажимаете на интерактивный объект. MouseEvent.MOUSE_UP запускается, как только вы отпускаете мышь, это не зависит от щелчка мыши, запустившего MOUSE_DOWN в том же InteractiveObject. MouseEvent.CLICK будет запущен только тогда, когда оба события происходят в одном и том же объекте без курсора, оставляющего объект между внутренним указателем мыши вниз и мыши вверх.

Таким образом, вы можете видеть, что есть простой случай, или даже два, в котором оба MOUSE_DOWN и MOUSE_UP запускаются, но CLICK не вызывается, потому что событие не является CLICK.

Кроме того, возможность просто отправлять событие MouseEvent.CLICK делает ненужным создание ложного взаимодействия с пользователем, вызывая несколько событий мыши, когда требуется только одно. Было бы неловко отслеживать каждый объект, нажатый в приемнике мыши, чтобы убедиться, что нажатие клавиши вверх также должно вызывать щелчок. Вам также необходимо удалить ссылки, когда произошло событие ROLL_OUT.

Короче говоря, событие CLICK действительно намного больше, чем события MOUSE_DOWN и MOUSE_UP. Он также управляет тем, что события происходили последовательно и на одном и том же экранном объекте, не покидая объект. Когда это происходит, и ТОЛЬКО когда это происходит, flash отправляет событие CLICK.

2 голосов
/ 25 сентября 2011

невозможно, этот код:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;

    /**
     * ...
     * @author www0z0k
     */
    public class Main extends Sprite {

        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            stage.addEventListener(MouseEvent.CLICK, onClick);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);
        }

        private function onStageKeyDown(e:KeyboardEvent):void {
            trace('pressed');
            stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN));
            stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP));           
            stage.dispatchEvent(new MouseEvent(MouseEvent.CLICK));          
        }

        private function onClick(e:MouseEvent):void{
            trace('clicked');
        }       
    }   
}

выводит просто:

нажатанажал

после нажатия клавиши на клавиатуре

0 голосов
/ 12 октября 2011

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

В любом случае, вот очень простой способ проверить это:

import flash.events.MouseEvent;

stage.addEventListener(MouseEvent.CLICK, function(){
    trace( 'clicked' );
} );

stage.dispatchEvent( new MouseEvent( MouseEvent.MOUSE_DOWN ) );
stage.dispatchEvent( new MouseEvent( MouseEvent.MOUSE_UP ) );

И ответ будет: "нет, это невозможно" ...

... и, вероятно, должен следовать встречный вопрос: ПОЧЕМУ я хочу имитировать событие щелчка, используя последовательность mousedown и mouseup, когда я могу отправить щелчоксобытие так же хорошо?

Есть ли у меня кнопка с экзистенциальным кризисом?

Или это вопрос из простого любопытства?Но вы знаете, что случилось с кошкой ... Правильно, но, возможно, это кошка Шредингера, а это означает, что в конце этого совершенно неуместного хода мыслей ДЕЙСТВИТЕЛЬНО произошло и НЕ убило кошку.если кошка из коробки.

Тогда это, вероятно, просто напрасно.

Видите, мысли из коробки могут убить вас.

0 голосов
/ 11 октября 2011

Если я понимаю, что вы спрашиваете, тогда ответ - ДА.

Мне любопытно, упростил ли я здесь решение, особенно после прочтения вашей попытки кода.«Симулировать» щелчок мышью очень просто.Приведенный ниже код выводит два оператора «Меня щелкнули», когда объект щелкают, и ни одного, когда вы щелкаете мышью, а затем выходите за границы объектов.

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

package  {

import flash.display.MovieClip;
import flash.events.MouseEvent;


public class clickMe extends MovieClip {


    public function clickMe() {
        // constructor code

        this.addEventListener(MouseEvent.CLICK, clicked);
        this.addEventListener(MouseEvent.MOUSE_DOWN, mDown);

    }

    private function clicked(e:MouseEvent):void{
        trace("I have been clicked");
        this.removeEventListener(MouseEvent.MOUSE_UP, clicked);
    }

    private function mDown(e:MouseEvent):void{
        this.addEventListener(MouseEvent.MOUSE_UP, clicked);
    }
}
}

В вашем коде я считаю, что проблема заключается в том, что вы пытаетесь запустить диспетчер прослушивателей событий через "onEnterFrame", который будет запускать только одно событие на кадр - никогдадва.Также после тестирования вашего кода я не уверен, что вы пытались сделать с помощью переменной "tick", потому что вы никогда не сбрасывали его.Таким образом, событие MOUSE_UP срабатывает один раз (когда tick = 2, если вы не удерживаете мышь), тогда ни одна из других отправок не будет запущена снова.

0 голосов
/ 11 октября 2011

не уверен в этом для вспышки.Но когда я изучал Windows MFC и был невежественен.Я отправил WM_MOUSEDOWN, а затем WM_MOUSEUP после небольшой задержки.Это сработало, и визуальное состояние кнопки также изменилось - без щелчка мышью!

...