Jw Flv Player Controller块

本部分是MVC模式的C(Controller-控制器)部分,通常意义上的控制器只是个分发器,并不做任何的数据处理,它只是接收View传递过来的用户输入,然后它把这个输入传递给Model,有Model完成处理.但在这个JW FLV Player中,Controller会处理一部分的事务,比如处理getLink(),也就是当播放器设置了link参数,并且用户点击了之后要跳转,就是有Controller自己完成的;还有就是fullscreen的功能,也就是由Controller实现的.其实这两个功能是完全可以放到Model中去的.

AbstractController

jw flv player AbstractController类图

这是AbsctractPlayer类图结构,它实现了FeedListener接口.它有8个私有属性:

  • randomizer:用来取随机数(以便控制播放列表的随机播放)
  • registeredModels:保存所有Models(如FLVModel,MP3Model),发送更新消息时用
  • congfig:设置信息
  • feeder:管理播放列表
  • currentItem:当前播放对象的索引
  • currentURL:播放对象的路径
  • isPlaying:是否增在播放
  • itemsPlayed:已经播放完的文件数

17个方法

  • AbstractController:构造函数.初始化config和feeder及根据shuffle参数确定是否乱序播放.
  • startMCV:公有方法,完成MVC模型,开始事件流(该类中并未定义实际应该如何操作)
  • getEvent:公有方法,从View中接收事件,主要事件有playpause,prev,next,stop,scrub,volume,playitem,getlink,fullscreen,complete,captions,audio
  • setPlayPause():私有方法,控制播放暂停(该类中并未定义实际应该如何操作)
  • setPrev:私有方法,处理"前一个文件"事件(该类中并未定义实际应该如何操作)
  • setNext:私有方法,处理"后一个文件"事件(该类中并未定义实际应该如何操作)
  • setStop:私有方法,处理"停止"事件(该类中并未定义实际应该如何操作)
  • setScrub:私有方法,处理进度条拖动事件(该类中并未定义实际应该如何操作)
  • setPlayitem:私有方法,播放指定对象(该类中并未定义实际应该如何操作)
  • setGetlink:私有方法,处理链接事件,打开链接指定的地址(该类中并未定义实际应该如何操作)
  • setComplete:私有方法,处理播放完成事件.(该类中并未定义实际应该如何操作)
  • setVolume:私有方法,处理音量变动事件(该类中并未定义实际应该如何操作)
  • setFullscreen():私有方法,处理全屏状态切换事件(该类中并未定义实际应该如何操作)
  • setCaption:私有方法,处理字幕切换事件(该类中并未定义实际应该如何操作)
  • setAudio:私有方法,处理音频切换事件(该类中并未定义实际应该如何操作)
  • sendChange:私有方法,向保存在registeredModels数组里的Model传递变动消息
  • onFeedUpdate:公有方法,当播放列表更新时的处理

PlayerController

jw flv player PlayerController类图

PlayerController是AbstractController的子类,它拥有AbstractController的所有属性和方法.

PlayerController的属性:

  • playerSO:私有属性,用来保存音量,是否使用字幕,是否使用音频的信息

PlayerController的方法

  • PlayerController:构造函数.在它内部会首先调用父类的构造函数.然后通过playerSO获取保存在用户计算机上的音量,是否使用字幕,是否使用音频的信息.
  • startMCV:公有方法.父类中也有这个方法,只不过未指定任何操作.这里的这个方法定义了一些操作.它首先保存使用的Model到registeredModels数组中,以在后面向Model发送变动消息.然后根据设置,分别想Model发送item,volume变动消息.如果usecaptions为fales,则隐藏字幕MC.如果useaudio为false,则停止声音,按钮以40的不透明度显示.如果autostart为false,则发送一个pause事件,否则发送start事件到Model中.
  • setPlayPause:私有方法,播放/暂停切换.实际用Model来完成,Controller只是发送一个pause或start的消息.
  • setPrev:私有方法.播放前一个
  • setNext:私有方法,播放后一个.
  • setStop:私有方法,停止播放.它会依次发送pause,stop,item消息到Model.并把isPlaying设成false.
  • setScrub:私有方法.处理进度条鼠标拖动事件,如果当前增在播放广告,则不允许拖动.
  • setPlayitem:设置播放项.
  • setGetlink:跳转链接. AS Code
    private function setGetlink(idx:Number) {
    	if(feeder.feed[idx]["link"] == undefined) {
    		setPlaypause();
    	} else {
    		getURL(feeder.feed[idx]["link"],config["linktarget"]);
    	}
    };
    如果设定了link参数,则打开link指定的页面,否则当作播放暂停处理.
  • setComplete:项目播放完成时的处理.
  • setVolume:设置音量. AS Code
    private function setVolume(prm) {
    	if (prm < 0 ) { prm = 0; } else if (prm > 100) { prm = 100; }
    	if(config["volume"] == 0 && prm == 0) { prm = 80; }
    	config["volume"] = prm;
    	sendChange("volume",prm);
    	playerSO.data.volume = prm;
    	playerSO.flush();
    };
    PlayerController类只是记录下新的音量值,实际操作还是有Model完成.
  • setFullScreen:全屏/还原切换 AS Code
    private function setFullscreen() {
    	if(Stage["displayState"] == "normal" && 
    		config["usefullscreen"] == "true") { 
    		Stage["displayState"] = "fullScreen";
    	} else if (Stage["displayState"] == "fullScreen" && 
    		config["usefullscreen"] == "true") {
    		Stage["displayState"] = "normal";
    	} else if (config["fsbuttonlink"] != undefined) {
    		sendChange("stop");
    		getURL(config["fsbuttonlink"],config["linktarget"]);
    	}
    };
    如果没有指定自定义的全屏操作,则利用FlashPlayer9的全屏功能实现.
  • setCaptions:切换字幕
  • setAudio:切换音频