我有一個Flash SWF設置爲響應鍵盤命令來播放網絡流。有幾個非常短的視頻剪輯是由數字鍵盤觸發的。由於有很多(在這個未完成的例子中只有少數),所以必須按兩個數字來播放視頻。AS3 KeyboardEvent不會在NetStream停止後添加eventListener
第一個數字觸發videoArray函數,並在videoArray函數內創建一個新的eventListener來播放視頻,而舊的事件偵聽器被刪除。視頻完成後,我使用NetStatusEvent刪除網絡流,並再次添加videoArray eventListener。
所有這些工作正常,但是,有一個由S鍵觸發的stopVideo函數。它具有與NetStatusEvent相同的代碼來刪除網絡流並重新添加eventListener,但只有網絡流被刪除。 eventListener未被添加。
我是否錯過了停止添加eventListener的事情,還是應該以不同的方式做這件事?是否有可能跳到視頻結束並觸發NetStatusEvent來停止它?
import flash.ui.Keyboard;
import flash.events.KeyboardEvent;
// Create a NetConnection object
var nc:NetConnection = new NetConnection();
nc.connect(null);
// Create a NetStream object with NetConnection object as a parameter
var ns:NetStream = new NetStream(nc);
var vid:Video = new Video();
// Play control
stage.addEventListener(KeyboardEvent.KEY_UP,videoArray);
function preStop(event:KeyboardEvent):void {
if (event.keyCode == 97) {
trace("O Stop");
ns.close();
removeChild(vid);
vid.attachNetStream(null);
}
else if (event.keyCode == 98) {
trace("P Stop");
ns.close();
removeChild(vid);
vid.attachNetStream(null);
}
}
function videoArray(event:KeyboardEvent):void {
stage.removeEventListener(KeyboardEvent.KEY_DOWN,preStop);
stage.removeEventListener(KeyboardEvent.KEY_UP,videoArray);
if (event.keyCode == 97) {
stage.addEventListener(KeyboardEvent.KEY_UP,play1);
trace("play1");
}
else if (event.keyCode == 98) {
stage.addEventListener(KeyboardEvent.KEY_UP,play2);
trace("play2");
}
// PLAY 1
function play1(event:KeyboardEvent):void {
if (event.keyCode == 97) {
stage.removeEventListener(KeyboardEvent.KEY_UP,play1);
stage.removeEventListener(KeyboardEvent.KEY_UP,play2);
// Play video
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
ns.play("cfa.mov");
// Create a new Video object and attach NetStream object
vid.attachNetStream(ns);
addChild(vid);
}
else if (event.keyCode == 98) {
stage.removeEventListener(KeyboardEvent.KEY_UP,play1);
stage.removeEventListener(KeyboardEvent.KEY_UP,play2);
// Create a NetStream object with NetConnection object as a parameter
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
ns.play("matilda.mov");
// Create a new Video object and attach NetStream object
vid.attachNetStream(ns);
addChild(vid);
}
stage.addEventListener(KeyboardEvent.KEY_UP,videoArray);
}
// PLAY 2
function play2(event:KeyboardEvent):void {
if (event.keyCode == 97) {
stage.removeEventListener(KeyboardEvent.KEY_UP,play1);
stage.removeEventListener(KeyboardEvent.KEY_UP,play2);
// Create a NetStream object with NetConnection object as a parameter
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
ns.play("illusionists.mov");
// Create a new Video object and attach NetStream object
vid.attachNetStream(ns);
addChild(vid);
}
else if (event.keyCode == 98) {
stage.removeEventListener(KeyboardEvent.KEY_UP,play1);
stage.removeEventListener(KeyboardEvent.KEY_UP,play2);
// Create a NetStream object with NetConnection object as a parameter
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
ns.play("janis.mp4");
// Create a new Video object and attach NetStream object
vid.attachNetStream(ns);
addChild(vid);
}
stage.addEventListener(KeyboardEvent.KEY_UP,videoArray);
}
function asyncErrorHandler(event:AsyncErrorEvent):void {
// ignore error
}
}
// Stop at end of video
ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler);
function statusHandler(event:NetStatusEvent):void
{
trace(event.info.code)
if (event.info.code == 'NetStream.Buffer.Empty') {
ns.close();
removeChild(vid);
vid.attachNetStream(null);
stage.addEventListener(KeyboardEvent.KEY_DOWN,preStop);
stage.addEventListener(KeyboardEvent.KEY_UP,videoArray);
}
}
// Pause control
stage.addEventListener(KeyboardEvent.KEY_UP,togglePauseHandler);
function togglePauseHandler(event:KeyboardEvent):void {
if (event.keyCode == Keyboard.SPACE) {
ns.togglePause();
}
}
// Stop control
stage.addEventListener(KeyboardEvent.KEY_UP,stopVideo);
function stopVideo(event:KeyboardEvent):void {
if (event.keyCode == Keyboard.S) {
ns.close();
removeChild(vid);
vid.attachNetStream(null);
stage.addEventListener(KeyboardEvent.KEY_DOWN,preStop);
stage.addEventListener(KeyboardEvent.KEY_UP,videoArray);
}
}
我沒有看得太緊密(你發佈了很多不太容易閱讀的代碼),但是你的問題可能是內聯函數被用作事件監聽器的結果。每次調用'videoArray'函數時,都會創建一個全新的play1/play方法集,這些方法與以前的方法不同。 – BadFeelingAboutThis
正如我試圖做你所建議的,我注意到事件監聽器正在被videoArray函數中刪除,並且也沒有其他語句。因此,無論何時按下另一個鍵(在本例中爲S),都會禁用eventListeners,但不會觸發play1,play2功能。謝謝參觀。 – Browntastic