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