2012-06-04 48 views
5

Khi tôi thêm một người nghe EVENT.ACTIVATE vào dự án của mình, sau đó nhấn Alt-tab và quay lại dự án của tôi, nó sẽ kích hoạt hai lần.Tại sao kích hoạt EVENT.ACTIVE của tôi hai lần?

chỉnh sửa: shaunhusain và dường như tôi đã tìm ra nguyên nhân của sự cố, mặc dù không có giải pháp. Khi chạy phiên bản trình phát độc lập 11+, sự kiện sẽ kích hoạt 2x. Khi chạy phiên bản trình phát độc lập < 11 hoặc bất kỳ phiên bản nào trong trình duyệt, nó sẽ kích hoạt 1x. Vì vậy, có vẻ như có lỗi trong các phiên bản gần đây của trình phát flash player. Tôi sẽ đánh dấu các phiên bản chính xác và báo cáo nó để adobe và xem những gì sẽ xảy ra. Nhờ bất cứ ai đọc điều này và cố gắng giúp đỡ !!

Tôi muốn nó kích hoạt mỗi khi tôi thay đổi tiêu điểm, tôi không muốn nó bắn hai lần mỗi khi tôi thay đổi tiêu điểm.

Tại sao điều này? Tôi có làm điều gì sai? Cách tốt nhất để ngăn chặn hành vi này là gì?

Dường như nó sẽ là một câu hỏi phổ biến, nhưng Google không bật lên.

Code:

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); 
     } 

    } 

} 

kết quả thực tế:

[object Stage] 
[object Stage] 

kết quả mong muốn:

[object Stage] 

Nó dường như không tạo sự khác biệt cho dù tôi thêm người nghe với giai đoạn hoặc bất cứ điều gì khác, hành vi là như nhau.

Điều tương tự cũng xảy ra với EVENT.DEACTIVATE. Những người khác như chuột lên làm việc tốt.

Mục tiêu của tôi là tạm dừng trò chơi trên EVENT.DEACTIVATE và bỏ tạm dừng nó trên EVENT.ACTIVATE. Vấn đề là khi sự kiện cháy hai lần, nó gọi hàm hủy bỏ hai lần có hậu quả không mong muốn.

+1

Vui lòng thêm thông tin khác về ngữ cảnh bạn đang xây dựng/chạy ứng dụng này. Tôi vừa tạo một dự án AS3 trong FlashBuilder, yêu cầu nó chạy dưới dạng ứng dụng AIR sử dụng SDK 4.6 và không thể tái tạo, cũng đã thử một trang web ứng dụng với 4.5 SDK cũng không thể tái tạo, trong cả hai trường hợp, tôi nhận được kết quả mong đợi. – shaunhusain

+1

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

+1

Điều đó thật kỳ lạ! Cảm ơn bạn đã thử nó. Tôi đang sử dụng FlashDevelop 4.0.0 Beta R1978 với Flex 4.6.0. Tôi không có quyền truy cập vào FlashBuilder nhưng sẽ hỏi trên diễn đàn flashdevelop. Trong khi chờ đợi, nếu ai đó có flashdevelop nó sẽ là tuyệt vời nếu bạn có thể cố gắng để repro kết quả. – WgFunstorm

Trả lời

1

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

cử đến khi phiên bản Flash Player hoặc tăng ứng dụng AIR hoạt động hệ thống lấy nét và trở nên tích cực. Sự kiện này là sự kiện phát sóng, có nghĩa là nó được gửi bởi tất cả các đối tượng EventDispatcher với một người nghe đã đăng ký cho sự kiện này. Để biết thêm thông tin về các sự kiện phát sóng , hãy xem lớp DisplayObject.

Đối với tôi, có vẻ như bạn muốn ngăn chặn hành vi được thiết kế của nó? Tôi cho rằng nó được thiết kế để bắn mỗi khi bạn thay đổi tiêu điểm, hoặc tôi có sai không? Bạn muốn thực hiện những gì? Tuy nhiên đây là một câu trả lời, vì vậy dựa trên những gì bạn đã viết - bạn có thể làm một cách giải quyết bằng cách chỉ cần loại bỏ một người biết lắng nghe sau khi ông bị sa thải một lần:

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

     trace(e.target); 
    } 

Nhưng tôi sẽ khuyên bạn nên viết một cái gì đó thêm về lý do tại sao bạn đang sử dụng nó và những gì muốn thực hiện nếu điều này là không thỏa đáng.

+0

Tôi muốn tạm dừng trò chơi trên EVENT.DEACTIVATE và sau đó tôi muốn tiếp tục trò chơi trên EVENT.ACTIVATE. \t \t Sau khi đọc tài liệu bạn đã trích dẫn, tôi vẫn không hiểu tại sao nó lại kích hoạt hai lần. Tôi muốn nó cháy mỗi khi tôi thay đổi tiêu điểm, tôi chỉ không muốn nó bắn hai lần mỗi khi tôi thay đổi tiêu điểm. (Bởi vì sau đó nó gọi hàm unpause() hai lần có tác dụng không mong muốn). \t \t Nếu tôi xóa trình xử lý sự kiện theo đề xuất của bạn, sau đó nó sẽ không kích hoạt lần nữa lấy nét theo thời gian tiếp theo. – WgFunstorm

+0

Nếu bạn thêm nó vào DEACTIVATE thì sao? –

+0

Hmm đây thực sự là hành vi kỳ lạ, nhưng có vẻ phù hợp để bạn chỉ có thể đếm các sự kiện và bỏ qua mọi giây. Có lẽ một người khác sẽ có thể giải thích điều này. –

0

Tôi đã gặp sự cố tương tự trong ứng dụng AIR Mobile của mình.

Để khắc phục sự cố này, tôi đã lưu trữ tên sự kiện cuối cùng được kích hoạt cho sự kiện Kích hoạt/hủy kích hoạt. Nếu đó là cố gắng hai lần liên tiếp, nó chỉ bị bỏ qua với một 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; 
    } 
} 

Lúc đầu, giá trị của _STATE bắt đầu với rỗng, do đó nên cho phép nó đi qua lần đầu tiên xung quanh.

tôi ràng buộc cả hai Event.ACTIVATEEvent.DEACTIVATE cho người nghe cùng, onAppStateChanged trong phương thức khởi tạo ứng dụng của tôi, như vậy:

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

Bạn có thể thay thế các Switch-Tuyên Bố tuy nhiên bạn thích, cá nhân tôi chỉ thích sử dụng AS3Signals của Robert Penner (GitHub) để phát tín hiệu tiếp tục/tạm dừng trên Ứng dụng.

Các vấn đề liên quan