2011-09-24 14 views
5

एक पिछले प्रश्न ने मुझे सोच लिया है। क्या माउसईवेंट.किकिक को पहले ही एक MOUSE_DOWN के बाद एक MOUSE_UP द्वारा फायर करके निकाला जा सकता है।माउस डाउन और अप ईवेंट का उपयोग करके माउस क्लिक को सिम्युलेट करना संभव है?

एडोब के ड्यूमेंटेशन के अनुसार। "... एक क्लिक घटना होने के लिए, यह हमेशा घटना के क्रम में घटनाओं की इस श्रृंखला का पालन करना होगा: माउसडाउन ईवेंट, फिर माउसअप। लक्ष्य ऑब्जेक्ट इन दोनों घटनाओं के लिए समान होना चाहिए, अन्यथा क्लिक ईवेंट नहीं है माउसडाउन या माउसअप घटनाओं के बीच किसी भी समय अन्य माउस ईवेंट हो सकते हैं; क्लिक ईवेंट अभी भी होता है। " http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/InteractiveObject.html#event:click

मेरे परीक्षणों से यह दिखाता है कि क्लिक ईवेंट एक्शनस्क्रिप्ट 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 (' एक के बजाय घटनाओं मिलना चाहिए दो।

+3

आप सही हैं। यह एक नया क्लिक ईवेंट नहीं बना रहा है जब यह MOUSE_UP के बाद MOUSE_DOWN देखता है (संभवतः क्योंकि यह घटना लूप कोड में ऐसा करने के लिए बहुत अजीब होगा, और माउस इनपुट प्रोसेसिंग कोड में ईवेंट उत्पन्न करने के लिए और अधिक प्राकृतिक)। आपको मैन्युअल रूप से तीनों को आग लगाना होगा। मुझे लगता है कि दस्तावेज नियमित माउस घटनाओं का जिक्र कर रहा था; उन्हें मैन्युअल रूप से फायर करना, यह असंभव है कि ईवेंट ऑर्डर लागू करने वाला कोई विशेष कोड है। – Cameron

+1

मुझे लगता है कि दस्तावेज भ्रमित कारण और थोड़ा सा प्रभाव डाल रहा है। उसी ऑब्जेक्ट पर माउस नीचे + माउस ऊपर एक क्लिक ईवेंट उत्पन्न होता है। परिणामस्वरूप सभी तीन एक्शनस्क्रिप्ट घटनाएं भेजी जाती हैं। रनटाइम एक्शनस्क्रिप्ट ईवेंट का उपयोग स्वयं यह निर्धारित करने के लिए नहीं करता है कि एक क्लिक ईवेंट प्रेषित करना है या नहीं। –

उत्तर

3

कारण यह नहीं है कि आप तीनों प्रकार प्लगइन द्वारा बनाए गए हैं, और एक-दूसरे पर निर्भर नहीं हैं।

MouseEvent.MOUSE_DOWN जैसे ही आप एक इंटरैक्टिव ऑब्जेक्ट पर दबाते हैं, निकाल दिया जाता है। MouseEvent.MOUSE_UP जैसे ही आप माउस छोड़ते हैं, निकाल दिया जाता है, यह उसी इंटरएक्टिव ऑब्जेक्ट के भीतर माउस क्लिक करने के लिए माउस क्लिक पर निर्भर नहीं करता है। MouseEvent.CLICK केवल तब निकाल दिया जाएगा जब दोनों घटनाएं एक ही ऑब्जेक्ट में कर्सर के बिना माउस के नीचे और माउस के इटर्नवल के बीच ऑब्जेक्ट को छोड़कर होती हैं।

तो आप देख सकते हैं कि एक साधारण मामला है, या दो भी, जिसमें दोनों MOUSE_DOWN और MOUSE_UP निकाल दिए जाते हैं, लेकिन क्लिक को कॉल नहीं किया जाता है क्योंकि ईवेंट क्लिक नहीं होता है।

इसके अलावा, बस MouseEvent.CLICK ईवेंट को प्रेषित करने की क्षमता इसे कई माउस ईवेंटों को फायर करके नकली उपयोगकर्ता इंटरैक्शन बनाने के लिए अनावश्यक बनाता है, जब केवल एक को बुलाया जाता है। माउस डाउन श्रोता में क्लिक की गई प्रत्येक ऑब्जेक्ट को ट्रैक करना अजीब होगा, ताकि यह जांच सके कि मऊ अप को भी एक क्लिक ट्रिगर करना चाहिए। ROLL_OUT ईवेंट होने पर आपको संदर्भों को हटाने की भी आवश्यकता होगी।

संक्षेप में, क्लिक ईवेंट वास्तव में MOUSE_DOWN और MOUSE_UP ईवेंट से बहुत अधिक है। यह भी प्रबंधन कर रहा है कि घटना उत्तराधिकार में और वस्तु को छोड़ दिए बिना उसी प्रदर्शन वस्तु पर हुई। जब ऐसा होता है, और केवल जब ऐसा होता है तो फ्लैश एक क्लिक ईवेंट भेजता है।

2

यह नामुमकिन है, इस कोड:

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

ओउओ, मुझे यह पसंद है ... अगर (चरण) ... – eLouai

+0

मुझे उत्सुकता है कि क्यों ... आपको लगता है कि वे ऐसा करेंगे, यह पूरे ईवेंट को मुझे मिलने वाली त्रुटियों के लिए खुलेगा। चूंकि वे सिस्टम पर्यावरण से उपयोग कर रहे हैं कि वे क्लिक ईवेंट बनाने के लिए हैं, क्योंकि वे अपने स्वयं के कार्यक्रमों का उपयोग करने के विरोध में हैं। – eLouai

+0

मुझे 'EventDispatcher' के बाहर 'ईवेंट' प्रेषण करने की संभावना पसंद नहीं है। यदि आप कर सकते हैं तो इससे बचें। मैंने इसे देखा है जब डेवलपर्स मेनू में पहले बटन को सक्षम करने के लिए "नकली" क्लिक करना चाहते हैं, लेकिन मैं अंदर से प्रेषित एक फ़ंक्शन लिखना पसंद करता हूं। – Mattias

0

यकीन नहीं पर दबाया जाता है फ्लैश के लिए इसके बारे में। लेकिन जब मैं विंडोज एमएफसी सीख रहा था और अनजान था। मैंने जो किया वह था कि मैंने थोड़ी देर के बाद WM_MOUSEUP को WM_MOUSEUP भेज दिया। यह काम किया और बटन के दृश्य राज्य भी बदल गए - बिना किसी माउस क्लिक के!

0

यदि मैं समझता हूं कि आप क्या पूछ रहे हैं तो उत्तर हाँ है।

मैं उत्सुक हूं कि अगर मैंने समाधान को सरल बना दिया है तो विशेष रूप से आपके कोड प्रयास को पढ़ने के बाद। माउस क्लिक को "अनुकरण" करना बहुत आसान है। नीचे दिए गए कोड में दो "आउटपुट पर क्लिक किया गया है" जब ऑब्जेक्ट पर क्लिक किया जाता है और कोई भी माउस नीचे नहीं जाता है तो ऑब्जेक्ट सीमाओं से बाहर निकलता है।

इस कक्षा ने मंच पर बनाए गए मूवीक्लिप को बढ़ाया, इसलिए मुझे बॉक्स को कोड करने की आवश्यकता नहीं थी।

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" जो भी है तो केवल फ्रेम प्रति एक ईवेंट सक्रिय करेगा के माध्यम से घटना श्रोता डिस्पैच को चलाने के लिए कोशिश कर रहे हैं - कभी नहीं दो। आपके कोड का परीक्षण करने के बाद भी मुझे यकीन नहीं है कि आप "टिक" चर के साथ क्या करने की कोशिश कर रहे थे क्योंकि आपने कभी इसे रीसेट नहीं किया था। तो MOUSE_UP घटना एक बार आग लगती है (जब टिक = 2, जब तक कि आप माउस को दबाए रखें) तब कोई भी अन्य प्रेषण कभी भी आग नहीं लगाएगा।

0

बिल्कुल यकीन नहीं है कि हर कोई इन जटिल स्पाइक्स क्यों बना रहा है। या शायद मैं बस कुछ देख रहा हूँ।

वैसे भी, यहाँ यह जांच करने के लिए एक बहुत ही आसान तरीका है:

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 के अनुक्रम का उपयोग करके एक क्लिक ईवेंट अनुकरण करना चाहता हूं?

क्या मैं एक बटन हूं, जिसमें अस्तित्व में संकट है?

या क्या यह केवल जिज्ञासा से एक प्रश्न है? लेकिन आप जानते हैं कि बिल्ली के साथ क्या हुआ ... ठीक है, लेकिन शायद यह schrödinger की बिल्ली है, जिसका मतलब है कि इस पूरी तरह से अप्रासंगिक ट्रेन के विचार के अंत में, जिज्ञासा वास्तव में किया और बिल्ली को मार नहीं किया।

अगर बिल्ली एक बॉक्स से बाहर है।

तो शायद यह अभी बर्बाद हो गया।

देखें, बॉक्स से बाहर सोचने से आप मारे जा सकते हैं।

संबंधित मुद्दे