2012-06-04 12 views
5

जब मैं अपने प्रोजेक्ट में EVENT.ACTIVATE श्रोता जोड़ता हूं, और तब alt-tab दूर और मेरी प्रोजेक्ट पर वापस चला जाता है तो यह दो बार ट्रिगर होता है।मेरा EVENT.ACTIVE दो बार क्यों ट्रिगर करता है?

संपादित करें: shaunhusain और मुझे समस्या का कारण मिला है, हालांकि समाधान के बिना। स्टैंडअलोन प्लेयर संस्करण 11+ चलाते समय ईवेंट 2x ट्रिगर करता है। स्टैंडअलोन प्लेयर संस्करण < 11 या ब्राउज़र में कोई भी संस्करण चलाते समय यह 1x ट्रिगर करता है। तो ऐसा लगता है कि फ़्लैश प्लेयर प्रोजेक्टर के हाल के संस्करणों में एक बग हो सकता है। मैं सटीक संस्करणों को कम करने जा रहा हूं और इसे एडोब को रिपोर्ट कर रहा हूं और देख सकता हूं कि क्या होता है। किसी को भी धन्यवाद जो इसे पढ़ता है और मदद करने की कोशिश करता है !!

मैं फोकस बदलने पर हर बार आग लगाना चाहता हूं, मैं इसे हर बार दो बार आग लगाना चाहता हूं जब भी मैं फोकस बदलता हूं।

यह क्यों है? क्या मुझसे कुछ गलत हो रही है? इस व्यवहार को रोकने का सबसे अच्छा तरीका क्या है?

ऐसा लगता है कि यह एक आम सवाल होगा, लेकिन Google ने कुछ भी नहीं बदला।

कोड:

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

    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); 
      // entry point 
      stage.addEventListener(Event.ACTIVATE, test); 
     } 

     private function test(e:Event):void 
     { 
      trace(e.target); 
     } 

    } 

} 

वास्तविक परिणाम:

[object Stage] 
[object Stage] 

वांछित परिणाम:

[object Stage] 

यह एक फर्क मैं चरण के लिए श्रोता जोड़ने का प्रतीत नहीं होता या कुछ और, व्यवहार वही है।

वही बात EVENT.DEACTIVATE के साथ भी होती है। माउस जैसे अन्य काम ठीक है।

मेरा लक्ष्य EVENT.DEACTIVATE पर एक गेम को रोकना है और EVENT.ACTIVATE पर इसे रोकना है। समस्या यह है कि जब घटना दो बार आग लगती है, तो यह अनपॉज़ फ़ंक्शन को दो बार कॉल करती है जिसमें अवांछित परिणाम होते हैं।

+1

कृपया उस संदर्भ के बारे में अधिक जानकारी जोड़ें जिसमें आप इसे बना रहे हैं/इसे चला रहे हैं। मैंने अभी फ्लैशबिल्डर में एक एएस 3 प्रोजेक्ट बनाया है, इसे 4.6 एसडीके का उपयोग करके एआईआर एप्लिकेशन के रूप में चलाने के लिए कहा है और पुन: उत्पन्न नहीं कर सकता, वेब की भी कोशिश की 4.5 एसडीके के साथ आवेदन भी पुन: पेश नहीं कर सकता है, दोनों मामलों में मुझे अपेक्षित परिणाम मिलते हैं। – shaunhusain

+1

http://www.shaunhusain.com/CheckActiveEventWeb/ http://www.shaunhusain.com/CheckActiveEventWeb/srcview – shaunhusain

+1

वास्तव में यह अजीब बात है! कोशिश करने के लिए धन्यवाद। मैं फ्लेक्स 4.6.0 के साथ FlashDevelop 4.0.0 बीटा आर 1 9 78 का उपयोग कर रहा हूं। मेरे पास FlashBuilder तक पहुंच नहीं है लेकिन फ्लैशडेफ फ़ोरम पर पूछेगी। इस बीच यदि किसी के पास फ्लैशडेफ है तो यह शानदार होगा अगर आप परिणामों को दोबारा करने का प्रयास कर सकते हैं। – WgFunstorm

उत्तर

1

ActionScript® 3.0 Reference for the Adobe® Flash® Platform says about this event:

भेजा जब फ़्लैश प्लेयर या आकाशवाणी आवेदन लाभ ऑपरेटिंग प्रणाली फोकस और सक्रिय हो जाता है। यह घटना एक प्रसारण कार्यक्रम है, जिसका अर्थ है कि यह सभी ईवेंटडिस्पर ऑब्जेक्ट्स द्वारा इस ईवेंट के लिए पंजीकृत श्रोता के साथ भेजा जाता है। प्रसारण ईवेंट के बारे में अधिक जानकारी के लिए, DisplayObject क्लास देखें।

मेरे लिए ऐसा लगता है कि आप इसके डिज़ाइन किए गए व्यवहार को रोकना चाहते हैं? मुझे लगता है कि जब भी आप फोकस बदलते हैं, तो क्या यह आग लगने के लिए डिज़ाइन किया गया था, या क्या मैं गलत हूं? तुम्हारी क्या हासिल करने की इच्छा है? हालांकि इस एक जवाब है, तो आप क्या लिखा है पर आधारित है - आप सिर्फ एक श्रोता को हटाकर एक वैकल्पिक हल कर सकते हैं के बाद वह एक बार गोली चलाई:

private function test(e:Event):void 
    { 
     stage.removeEventListener(Event.ACTIVATE, test); 

     trace(e.target); 
    } 

लेकिन मैं आपको सलाह देते हैं कि आपको यह प्रयोग कर रहे हैं के बारे में अधिक कुछ लिखने के लिए होगा और यदि यह संतोषजनक नहीं है तो क्या हासिल करना चाहते हैं।

+0

के रूप में मैं EVENT.DEACTIVATE पर एक गेम को रोकना चाहता हूं, और फिर मैं इसे EVENT.ACTIVATE पर फिर से शुरू करना चाहता हूं। \t \t आपके द्वारा उद्धृत दस्तावेज पढ़ने के बाद, मुझे अभी भी समझ में नहीं आता कि यह दो बार क्यों आग लगती है। जब भी मैं फोकस बदलता हूं, मैं इसे आग लगाना चाहता हूं, मैं बस फोकस बदलने पर हर बार दो बार आग लगाना नहीं चाहता हूं। (क्योंकि तब यह अनपॉज़() फ़ंक्शन को दो बार कॉल करता है जिसमें अवांछित प्रभाव होते हैं)। \t \t यदि मैं आपके सुझाव के अनुसार ईवेंट श्रोता को हटा देता हूं, तो अगली बार फोकस प्राप्त होने पर यह फिर से आग नहीं आता है। – WgFunstorm

+0

क्या होगा यदि आप इसे DEACTIVATE पर जोड़ते हैं? –

+0

हम्म यह वास्तव में अजीब व्यवहार है, लेकिन लगातार दिखता है ताकि आप घटनाओं की गणना कर सकें और हर सेकेंड को अनदेखा कर सकें। शायद कोई और इसे समझाने में सक्षम होगा। –

0

मेरे एआईआर मोबाइल ऐप में भी यही समस्या है।

इस समस्या को ठीक करने के लिए, मैंने अंतिम ईवेंट नाम को सक्रिय/निष्क्रिय करने के लिए ट्रिगर किया है। यह एक पंक्ति में दो बार करने का प्रयास किया गया है, तो यह सिर्फ एक return;

private static function onAppStateChanged(e:Event):void { 
    if (_STATE == e.type) { 
     return; 
    } 

    _STATE = e.type; 
    switch(_STATE) { 
     case Event.ACTIVATE: whenActivated.dispatch(); break; 
     case Event.DEACTIVATE: whenDeactivated.dispatch(); break; 
    } 
} 

पहले तो साथ छोड़ दिया जाता है, _STATE का मूल्य इतना है कि यह पहली बार के माध्यम से चारों ओर पारित करने के लिए अनुमति चाहिए, अशक्त साथ शुरू होता है।

मैं दोनों Event.ACTIVATE और Event.DEACTIVATE ही श्रोता के लिए, onAppStateChanged मेरे ऐप की आरंभीकरण विधि में बाँध, इसलिए जैसे:

_STAGE.addEventListener(Event.ACTIVATE, onAppStateChanged); 
_STAGE.addEventListener(Event.DEACTIVATE, onAppStateChanged); 

आप तथापि स्विच-वक्तव्य जगह ले सकता है आपको पसंद है, मैं व्यक्तिगत रूप से रॉबर्ट पेननर के AS3Signals (GitHub) को ऐप में फिर से शुरू/निलंबित सिग्नल प्रसारित करने के लिए व्यक्तिगत रूप से पसंद करना पसंद करता हूं।

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