- 浏览: 101971 次
- 性别:
- 来自: 大连
文章分类
最新评论
Flex4中增加了一个视频播放组件:VideoPlayer,相信很多朋友已经在使用了,确实比原先方便很多(记得在Flex3的时候,我们还需要借用Flash IDE带的视频播放组件)。它的功能确实也足以覆盖我们大部分的一般性的需求。如果您有一些自定义的需求,比如需要自定义播放器的全屏行为,就要了解VideoPlayer的一些内部逻辑。
首先,VideoPlayer是支持全屏播放的,注意播放器的右下角有一个控制全屏状态的按钮,点击之后,视频就进入全屏状态,而播放条会位于稍微靠底部的位置,并且过一段时间后就会自动隐藏。再次点击全屏按钮,或按ESC键,即可退出全屏状态,恢复之前的默认状态。这是默认情况下,VideoPlayer的全屏行为。
如果我们为播放器实现了一个字幕显示功能,那么进入全屏状态后,如何把字幕也显示出来呢?来看一下具体的代码实现:
首先,要实现字幕功能,我们必然要对VideoPlayer的功能进行扩展。基于优先使用组合,而不是继承的建议,我们没有直接继承VideoPlayer,而是使用了Group,内部包含一个VideoPlayer和一个Text组件,Text组件显然是用来显示字幕的,它会叠加在VideoPlayer之上。
<s:VideoPlayer id="vplayer" width="100%" height="100%" currentTimeChange="timeChangeHander(event)" complete="vplayerCompleteHandler(event)" skinClass="com.riameeting.skin.RIAPlayerSkin"/>
<mx:Text id="captionText" width="100%" bottom="24"
textAlign="center" text="{currentCaption}"
filters="{[dropFilter]}"
selectable="false"
fontWeight="bold" color="#FFFFFF"
fontSize.normal="{model.captionFontSize}"
fontSize.fullScreen="{model.captionFontSizeFullScreen}"
/>
假设我们已经完成了字幕的解析和显示功能,那么在正常情况下,字幕播放是正常的,但是一旦进入全屏状态,我们就会发现字幕没有显示出来。因为显然用于显示字幕的Text组件在VideoPlayer之外。所以我们还需要做一些额外的工作,来把字幕显示也加入到VideoPlayer的全屏显示界面里面。
因为VideoPlayer也是基于皮肤机制的,所以我们需要为它指定一个自定义的皮肤(注意控制全屏的按钮,是在皮肤里面存在的),然后我们就可以控制全屏按钮的行为,禁用它的默认行为,并派发一个事件给我们的组件,这样我们的组件就可以在接受到事件之后,完成我们自定义的全屏代码的控制工作。代码里面我们直接注视掉了原先的按钮,增加一个显示和原先一致的新按钮,注意ID是不同的。
<!--
<s:Button id="fullScreenButton" right="0" bottom="0" label="Fullscreen"
skinClass="spark.skins.spark.mediaClasses.normal.FullScreenButtonSkin"
skinClass.fullScreenStates="spark.skins.spark.mediaClasses.fullScreen.FullScreenButtonSkin"
focusIn="event.target.depth=1" focusOut="event.target.depth=0"/>
-->
<s:Button id="fullScreenButtonImp1" right="0" bottom="0" label="Fullscreen"
skinClass="spark.skins.spark.mediaClasses.normal.FullScreenButtonSkin"
skinClass.fullScreenStates="spark.skins.spark.mediaClasses.fullScreen.FullScreenButtonSkin"
focusIn="event.target.depth=1" focusOut="event.target.depth=0" click="dispatchEvent(new Event('videoFullScreen',true))"/>
注意它派发了一个"videoFullScreen"的事件,并且是冒泡的,所以会被我们的组件接收到。然后我们就可以自定义播放器的全屏行为了。参见下面的代码片段,这段代码参阅了VideoPlayer自身的代码,并针对需求进行了一些改动。注意它的全屏控制,并不是简单的设置stage.displayState,还需要用PopUpManager将组件自身添加到最顶层显示,并将尺寸放大到全屏尺寸(之所以要这样实施,是因为如果用stage.fullScreenSourceRect属性,简单的定义全屏显示区域的话,播放器本身的UI会在放大后出现明显的锯齿,显示非常丑陋)。代码我大体上进行了注释,如下:
private var beforeFullScreenInfo:Object;
/**
* 全屏按钮被点击后,执行的事件侦听方法
*/
protected function fullScreenButtonHandler(event:Event):void
{
//判断状态,如果是全屏,就退出全屏,否则进入全屏
if(stage.displayState == StageDisplayState.FULL_SCREEN) {
//注意这个设置会触发fullScreenEventHandler,返回初始状态,将组件归位
stage.displayState = StageDisplayState.NORMAL;
} else {
var screenBounds:Rectangle = new Rectangle(0,0,stage.fullScreenWidth,stage.fullScreenHeight);
//这里要记录下当前组件的一些数据,用于返回初始状态的时候,将组件设置到原先的状态
beforeFullScreenInfo = {parent: this.parent,
x: this.x,
y: this.y,
explicitWidth: this.explicitWidth,
explicitHeight: this.explicitHeight,
percentWidth: this.percentWidth,
percentHeight: this.percentHeight,
isPopUp: this.isPopUp};
//获取组件在原先的父级上的索引
if (parent is IVisualElementContainer){
var ivec:IVisualElementContainer = IVisualElementContainer(parent);
beforeFullScreenInfo.childIndex = ivec.getElementIndex(this);
ivec.removeElement(this);
}else{
beforeFullScreenInfo.childIndex = parent.getChildIndex(this);
parent.removeChild(this);
}
//用PopUp机制,将组件添加到最上层显示
PopUpManager.addPopUp(this, FlexGlobals.topLevelApplication as DisplayObject, false, null, moduleFactory);
//设置组件的尺寸,匹配全屏下屏幕的尺寸
setLayoutBoundsSize(screenBounds.width, screenBounds.height, true);
this.explicitWidth = width;
this.explicitHeight = height;
setLayoutBoundsPosition(0, 0, true);
this.validateNow();
systemManager.stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenEventHandler);
stage.displayState = StageDisplayState.FULL_SCREEN;
currentState = "fullScreen";
}
}
/**
* 屏幕状态切换的时候,触发的事件侦听方法
*/
private function fullScreenEventHandler(event:FullScreenEvent):void
{
//只判断状态从全屏进入普通模式的情况
if(event.fullScreen) return;
currentState = "";
systemManager.stage.removeEventListener(FullScreenEvent.FULL_SCREEN, fullScreenEventHandler);
//根据之前记录的数据,将组件归位
this.x = beforeFullScreenInfo.x;
this.y = beforeFullScreenInfo.y;
this.explicitWidth = beforeFullScreenInfo.explicitWidth;
this.explicitHeight = beforeFullScreenInfo.explicitHeight;
this.percentWidth = beforeFullScreenInfo.percentWidth;
this.percentHeight = beforeFullScreenInfo.percentHeight;
if (!beforeFullScreenInfo.isPopUp){
// remove from top level application:
PopUpManager.removePopUp(this);
// add back to original parent
if (beforeFullScreenInfo.parent is IVisualElementContainer)
beforeFullScreenInfo.parent.addElementAt(this, beforeFullScreenInfo.childIndex);
else
beforeFullScreenInfo.parent.addChildAt(this, beforeFullScreenInfo.childIndex);
}
beforeFullScreenInfo = null;
invalidateSize();
invalidateDisplayList();
}
首先,VideoPlayer是支持全屏播放的,注意播放器的右下角有一个控制全屏状态的按钮,点击之后,视频就进入全屏状态,而播放条会位于稍微靠底部的位置,并且过一段时间后就会自动隐藏。再次点击全屏按钮,或按ESC键,即可退出全屏状态,恢复之前的默认状态。这是默认情况下,VideoPlayer的全屏行为。
如果我们为播放器实现了一个字幕显示功能,那么进入全屏状态后,如何把字幕也显示出来呢?来看一下具体的代码实现:
首先,要实现字幕功能,我们必然要对VideoPlayer的功能进行扩展。基于优先使用组合,而不是继承的建议,我们没有直接继承VideoPlayer,而是使用了Group,内部包含一个VideoPlayer和一个Text组件,Text组件显然是用来显示字幕的,它会叠加在VideoPlayer之上。
<s:VideoPlayer id="vplayer" width="100%" height="100%" currentTimeChange="timeChangeHander(event)" complete="vplayerCompleteHandler(event)" skinClass="com.riameeting.skin.RIAPlayerSkin"/>
<mx:Text id="captionText" width="100%" bottom="24"
textAlign="center" text="{currentCaption}"
filters="{[dropFilter]}"
selectable="false"
fontWeight="bold" color="#FFFFFF"
fontSize.normal="{model.captionFontSize}"
fontSize.fullScreen="{model.captionFontSizeFullScreen}"
/>
假设我们已经完成了字幕的解析和显示功能,那么在正常情况下,字幕播放是正常的,但是一旦进入全屏状态,我们就会发现字幕没有显示出来。因为显然用于显示字幕的Text组件在VideoPlayer之外。所以我们还需要做一些额外的工作,来把字幕显示也加入到VideoPlayer的全屏显示界面里面。
因为VideoPlayer也是基于皮肤机制的,所以我们需要为它指定一个自定义的皮肤(注意控制全屏的按钮,是在皮肤里面存在的),然后我们就可以控制全屏按钮的行为,禁用它的默认行为,并派发一个事件给我们的组件,这样我们的组件就可以在接受到事件之后,完成我们自定义的全屏代码的控制工作。代码里面我们直接注视掉了原先的按钮,增加一个显示和原先一致的新按钮,注意ID是不同的。
<!--
<s:Button id="fullScreenButton" right="0" bottom="0" label="Fullscreen"
skinClass="spark.skins.spark.mediaClasses.normal.FullScreenButtonSkin"
skinClass.fullScreenStates="spark.skins.spark.mediaClasses.fullScreen.FullScreenButtonSkin"
focusIn="event.target.depth=1" focusOut="event.target.depth=0"/>
-->
<s:Button id="fullScreenButtonImp1" right="0" bottom="0" label="Fullscreen"
skinClass="spark.skins.spark.mediaClasses.normal.FullScreenButtonSkin"
skinClass.fullScreenStates="spark.skins.spark.mediaClasses.fullScreen.FullScreenButtonSkin"
focusIn="event.target.depth=1" focusOut="event.target.depth=0" click="dispatchEvent(new Event('videoFullScreen',true))"/>
注意它派发了一个"videoFullScreen"的事件,并且是冒泡的,所以会被我们的组件接收到。然后我们就可以自定义播放器的全屏行为了。参见下面的代码片段,这段代码参阅了VideoPlayer自身的代码,并针对需求进行了一些改动。注意它的全屏控制,并不是简单的设置stage.displayState,还需要用PopUpManager将组件自身添加到最顶层显示,并将尺寸放大到全屏尺寸(之所以要这样实施,是因为如果用stage.fullScreenSourceRect属性,简单的定义全屏显示区域的话,播放器本身的UI会在放大后出现明显的锯齿,显示非常丑陋)。代码我大体上进行了注释,如下:
private var beforeFullScreenInfo:Object;
/**
* 全屏按钮被点击后,执行的事件侦听方法
*/
protected function fullScreenButtonHandler(event:Event):void
{
//判断状态,如果是全屏,就退出全屏,否则进入全屏
if(stage.displayState == StageDisplayState.FULL_SCREEN) {
//注意这个设置会触发fullScreenEventHandler,返回初始状态,将组件归位
stage.displayState = StageDisplayState.NORMAL;
} else {
var screenBounds:Rectangle = new Rectangle(0,0,stage.fullScreenWidth,stage.fullScreenHeight);
//这里要记录下当前组件的一些数据,用于返回初始状态的时候,将组件设置到原先的状态
beforeFullScreenInfo = {parent: this.parent,
x: this.x,
y: this.y,
explicitWidth: this.explicitWidth,
explicitHeight: this.explicitHeight,
percentWidth: this.percentWidth,
percentHeight: this.percentHeight,
isPopUp: this.isPopUp};
//获取组件在原先的父级上的索引
if (parent is IVisualElementContainer){
var ivec:IVisualElementContainer = IVisualElementContainer(parent);
beforeFullScreenInfo.childIndex = ivec.getElementIndex(this);
ivec.removeElement(this);
}else{
beforeFullScreenInfo.childIndex = parent.getChildIndex(this);
parent.removeChild(this);
}
//用PopUp机制,将组件添加到最上层显示
PopUpManager.addPopUp(this, FlexGlobals.topLevelApplication as DisplayObject, false, null, moduleFactory);
//设置组件的尺寸,匹配全屏下屏幕的尺寸
setLayoutBoundsSize(screenBounds.width, screenBounds.height, true);
this.explicitWidth = width;
this.explicitHeight = height;
setLayoutBoundsPosition(0, 0, true);
this.validateNow();
systemManager.stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenEventHandler);
stage.displayState = StageDisplayState.FULL_SCREEN;
currentState = "fullScreen";
}
}
/**
* 屏幕状态切换的时候,触发的事件侦听方法
*/
private function fullScreenEventHandler(event:FullScreenEvent):void
{
//只判断状态从全屏进入普通模式的情况
if(event.fullScreen) return;
currentState = "";
systemManager.stage.removeEventListener(FullScreenEvent.FULL_SCREEN, fullScreenEventHandler);
//根据之前记录的数据,将组件归位
this.x = beforeFullScreenInfo.x;
this.y = beforeFullScreenInfo.y;
this.explicitWidth = beforeFullScreenInfo.explicitWidth;
this.explicitHeight = beforeFullScreenInfo.explicitHeight;
this.percentWidth = beforeFullScreenInfo.percentWidth;
this.percentHeight = beforeFullScreenInfo.percentHeight;
if (!beforeFullScreenInfo.isPopUp){
// remove from top level application:
PopUpManager.removePopUp(this);
// add back to original parent
if (beforeFullScreenInfo.parent is IVisualElementContainer)
beforeFullScreenInfo.parent.addElementAt(this, beforeFullScreenInfo.childIndex);
else
beforeFullScreenInfo.parent.addChildAt(this, beforeFullScreenInfo.childIndex);
}
beforeFullScreenInfo = null;
invalidateSize();
invalidateDisplayList();
}
发表评论
-
AS3 经典的代码库
2013-03-29 16:39 03D引擎 Papervision3Dhttp://b ... -
AS3开源资源整理
2013-03-29 16:38 0一个使用Stage3D APIs 实现 ... -
代码改变影片剪辑亮度、色调、高级、透明度的方法
2012-12-03 08:41 866通过Color类来改变影片颜色 亮度:(设置影片明暗效果) ... -
as3自己写皮肤
2012-11-30 09:47 0<?xml version="1.0" ... -
AS3 正则表达式详解
2012-11-30 09:27 01.新建正则表达式,有两 ... -
TweenLite用法
2012-11-30 09:26 0TweenLite 是一个缓动的类 ... -
AS3位图的加载、拷贝、绘制
2012-11-30 09:26 0建Bitmap可以是使用Bitmap ... -
AS3中的反射
2012-11-30 09:25 658什么是反射 反射 (Reflection) 是指在程序在运行时 ... -
AS3文本操作
2012-11-30 09:03 1226设置文本框的边框、背景与前景色 默认状态下,文本框的边框和背景 ... -
as3日期格式化以及htmlText的安全转义类
2012-11-30 08:57 1036package org.juke{ ... -
Flash AS3.0关于TextField的过滤,HTML格式,对齐,换行等介绍
2012-11-30 08:56 1375过滤文字输入 TextField.restrict = &q ... -
AS3碎裂重组特效
2012-11-26 15:04 883碎裂指的是图片的碎裂 那我们要先做的是就是得到这张图片,在a ... -
Flash AS3.0实例---接近鼠标的图片缓动效果
2012-11-26 15:02 1177当鼠标移动到图片的一定位置时,图片会缓冲移动到鼠标位置,在现 ... -
flex air 启动本地应用程序
2012-11-26 09:23 854在air 2.0中,可以利用NativeProcess启动本地 ... -
as3打开和保存本地文件
2012-11-26 08:52 2394package { import flash.displa ... -
FLV视频类播放器全屏切换完整AS代码示例
2012-11-21 10:53 825function setFullScreen() { ... -
as3冒泡排序
2012-11-20 09:12 0<?xml version="1.0" ... -
Flex在Image组件使用蒙板
2012-11-16 17:34 0Flex在Image组件使用蒙板 1.Flex SDK3.0 ... -
Flex导入Excel文件示例
2012-11-16 17:33 01.SDK3.0 2.导入文件用FileFilter过滤。由于 ... -
Flash as3把2D图片分析成文本实现代码
2012-11-16 17:32 0一篇在游戏开发中常用到的功能就是利用as3把2D图片分析成文本 ...
相关推荐
通过这种方式,我们可以完全控制全屏行为,避免了页面闪烁的问题,从而提供更好的用户体验。 总结起来,`vue-video-player`通过自定义按钮组件实现全屏切换效果,关键在于理解其组件系统和事件监听机制,以及如何...
此外,videoPlayer还支持自定义皮肤和控件,开发者可以根据网站的设计风格进行定制,提供一致的用户体验。 videoPlayer的一大特性是其互动性。它允许添加各种交互功能,比如播放、暂停、快进、快退、全屏切换等,还...
3. **高级功能**:WRP Android Video Player Pro可能包含多种高级特性,如视频流支持、全屏模式、播放控制(暂停、播放、快进、快退)、音量调节、视频质量选择、字幕支持等。这些功能使用户能够在不同场景下灵活...
`VideoPlayer` 插件还支持一些高级特性,如控制条自定义、全屏模式、播放/暂停按钮、进度条等。开发者可以根据需求调整这些元素的样式和行为,以适应不同的设计风格。此外,插件通常提供了事件监听接口,可以监听到...
9. **扩展性与自定义**:为了满足不同需求,Simple Video Player可能还提供了插件机制或自定义选项,让用户能够添加额外功能或改变播放器的行为。 通过这个项目,开发者可以学习到如何在WPF环境中集成多媒体功能,...
4. **自定义配置**:用户可以通过插件设置调整播放器的外观和行为,比如调整播放速度、选择默认的视频编码库等。 5. **与Atom生态系统兼容**:由于Atom的插件系统非常灵活,Atom-atom-videoplayer能够与其他插件...
- **全屏功能**:为用户提供全屏观看选项。 - **流控制**:管理视频流的加载和缓冲,确保流畅播放。 - **连接管理**:处理与服务器的通信,包括建立和维护连接。 - **额外功能**:如广告集成、权限管理、播放列表...
在你的React应用中,引入`VideoPlayer`组件,并传递必要的属性,如视频源(`src`)、初始状态(`paused`、`muted`等)和自定义回调函数(如`onPlay`、`onPause`等)。 `react-custom-video-player`提供了丰富的API...
3. **交互控制**:通过ActionScript(Flash的编程语言)自定义播放器的外观和行为,添加额外的控制功能。 4. **兼容性检查**:尽管Flash曾经非常流行,但随着HTML5的崛起,现在许多设备和浏览器不再支持Flash。因此...
虽然本文不提供具体代码示例,但以下是一个基本的C#脚本框架,可用于控制`VideoPlayer`组件的基本行为: ```csharp using UnityEngine; using UnityEngine.Video; public class VideoController : MonoBehaviour {...
《深入解析videoplayer:构建一个视频播放器》 在当今数字化时代,视频内容已经成为人们日常生活中不可或缺的一部分。因此,创建一个高效、用户友好的视频播放器对于任何在线平台都至关重要。"videoplayer"是一个专...
在移动设备上,尤其是苹果的iOS系统中,用户在Safari浏览器中观看视频时,默认情况下,视频会自动全屏播放,以提供最佳的观看体验。...对于Web环境,开发者可能需要寻找其他变通方法,或者接受默认的全屏行为。
这对于开发者来说,意味着拥有更高的自定义程度和灵活性,可以根据需要对背景图片的展示方式做出个性化调整。 其次,“Flash素材”通常指的是用于制作Flash内容的各种元素,如图形、动画片段、按钮等。在这个压缩包...
此外,可以使用MediaPlayerManager来控制播放行为,例如全屏模式,小屏幕模式以及RecyclerView中的智能匹配模式。Features全屏,小屏播放内部支持RecyclerView中播放自定义UIAPP内全局播放静音循环播放手势操作(小...
`options`属性允许你自定义Video.js播放器的行为和外观。例如,你可以选择显示哪些控制条元素,调整皮肤,甚至添加自定义的插件或皮肤。 为了处理播放事件,可以使用React的`onPlay`、`.onPause`等属性。例如,如果...
自定义播放控件通常包括播放/暂停按钮、进度条、音量控制、全屏切换等功能,通过CSS我们可以对这些元素进行精准布局和美化。在"自定义视频播放控件.html"中,你可能看到HTML结构,它定义了播放器的各种元素,如`...
FLV(Flash Video)是Adobe Flash平台广泛支持的一种视频格式,特别适合在网络上传输,因为它的压缩效率高,加载速度快,且能在大多数现代浏览器中通过Flash插件流畅播放。Vcastr 3.0 播放器正是为了充分利用这种...
video.js的强大之处还在于其丰富的插件生态,如广告插件、字幕插件、全屏插件等。只需按照官方文档指引引入并初始化插件,即可轻松扩展播放器的功能。 9. **"video.js demo"分析** "video.js demo.zip"中包含了一...
首先,FLV(Flash Video)是一种常用的网络流媒体格式,尤其在Adobe Flash Player广泛普及的年代,FLV被大量用于在线视频分享网站。本播放器支持这种格式,确保了对历史视频资源的良好兼容性。 项目的一大亮点在于...
3. **XML配置**:f4player通常使用XML文件来定义皮肤布局和行为,开发者可以通过修改XML来调整控件的位置和功能。 4. **JavaScript交互**:利用JavaScript,开发者可以编写代码来实现更复杂的交互逻辑,比如响应...