- 浏览: 102018 次
- 性别:
- 来自: 大连
文章分类
最新评论
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();
}
发表评论
-
Adobe Flash Builder 4.6破解方法
2012-12-16 20:08 7C:\Program Files (x86)\Adobe\Ad ... -
FluorineFx 配置支持纯AS3工程!
2012-11-30 13:45 0FluorineFx 配置支持纯AS3工程! 由于自己用的纯 ... -
Flex中ArrayCollection的复制
2012-11-30 13:39 0lex中ArrayCollection的复制 2011- ... -
Flex的array和arrayCollection的应用实例
2012-11-30 13:34 0ArrayCollection是flex中的数组集合类,它是很 ... -
Flex air 中调用com组件的方法
2012-11-30 11:45 0air中直接调用com组件是很难做到的,但我们可以通过Fl ... -
FluorineFx 之 DateFeed,既服务端的数据推送服务
2012-11-30 11:29 0在开发如股票客户端的软件,客户端的数据在实时刷新,是由于服务端 ... -
收藏 flex+fluorinefx+asp.net c#后台如何接收arraycollection 并转换处理
2012-11-30 11:25 0flex,在.NET环境下通过FluorineFx传送Arra ... -
特殊符号收集大全
2012-11-27 19:06 905愛心符號 愛心符號怎 ... -
TextFormat设置中文字体font属性注意的问题
2012-11-27 19:05 2415如果要设置的字体为中文名称,则一定要使用对应的英文名称来设置才 ... -
flex国际化的问题
2012-11-27 18:52 7241、如果是简单项目,一般采用的是类似struts的bundle ... -
flex textfield中文字体
2012-11-27 17:14 963由于flex的图文混排总是有问题,而且效率实在有点低。所以最近 ... -
FLEX如何设置发光字体
2012-11-27 16:35 723<mx:Text id="bulletin&q ... -
Flex实现全屏源代码示例
2012-11-12 10:18 603stage.displayState = (stage.dis ... -
Flex+java+spring 上传和下载文件AIR
2012-11-09 10:50 833什么都别说附上代码 UploadFile.java ... -
FluorineFX初学者之最初配置 Flex4与.NET结合 .
2012-11-09 09:43 888FluorineFX整个架构和BlazeDs差不多,只是最开始 ... -
Flex 绑定/双向绑定
2012-11-08 11:39 6711.什么是数据绑定? Data binding is ... -
Flex ArrayCollection 之排序
2012-11-07 15:59 673利用ArrayCollection的sort属性 & ... -
Flex读取xml文件
2012-11-07 13:12 576<?xml version="1.0& ... -
FLEX中使用FLVPlayback控件
2012-11-07 08:58 817即swc文件的导入,使用问题. FLVPlaybackAS ... -
VideoPlayer
2012-11-06 15:59 2010/** * VERSION: 1.0 * DATE: 20 ...
相关推荐
Flex CSS简介 Flex 使用MXML设置样式 Flex 使用ActionScript设置样式 Flex 样式的继承与叠加 Flex 主题的使用 Flex 自定义皮肤 Flex 应用皮肤
4. **移动设备支持**:随着Flex 4.5,Adobe引入了Flash Player和Adobe AIR的移动平台支持,开发者能够为iOS、Android等移动设备创建原生应用。这包括对触摸事件的支持,以及优化的资源管理和性能。 5. **图形和动画...
关于“flex4.5d sdk”这一主题,其核心知识点主要围绕Adobe Flex 4.5 SDK的使用、功能以及在当前技术环境下的地位与获取途径展开。以下将深入解析Flex 4.5 SDK的重要概念、特性及其应用领域,旨在为读者提供全面而...
3. **Spark组件**:Spark组件是Flex 4.5的一大亮点,它们具有更好的可定制性和性能,比MXML组件更灵活。开发者可以利用这些组件创建出更美观、响应更快的用户界面。 4. **Flex Builder和Flash Builder**:这两款...
本教程将详细介绍如何在Flex 4.5中实现Tree组件与任意组件之间的拖放操作,特别是将树形结构的数据拖拽到DataGrid中,并获取目标位置的全部数据进行添加。 1. **Flex 4.5的DragManager和DropTarget** Flex 4.5中的...
### Flex4.5 + Myeclipse8.5 安装指南 #### 一、前言 随着技术的发展,集成开发环境(IDE)的选择对于开发者来说至关重要。本文将详细介绍如何安装Flex 4.5与MyEclipse 8.5,并解决在安装过程中可能遇到的一些常见...
- **Spark组件架构**:Flex 4.5引入了全新的Spark组件集,与之前的 Halo 组件相比,Spark组件提供了更强大的自定义样式和主题功能,使UI设计更加灵活。 - **Graphical Layout System(图形布局系统)**:引入了...
Flex4.5采用了一种基于组件的开发模型,开发者可以通过继承现有组件并扩展其功能来构建自己的应用程序。这一模型的核心优势在于提高了代码的复用性,简化了开发流程。在Flex中,可视化组件具备以下关键特性: 1. **...
### Flex 4.5'' 弯曲度传感器中文资料 #### 产品简介 Flex 4.5''弯曲度传感器是一款专用于检测物体弯曲程度的传感器。该传感器具有4.5英寸(约11.43厘米)的长度,能够在不同弯曲角度下产生可变电阻值的变化,从而...
2. **Spark组件模型**:Spark组件模型是Flex 4.5的一大亮点,它提供了一种全新的方式来创建和设计UI组件。Spark组件比Halo组件更轻量级,支持CSS样式,使得UI设计更加灵活和美观。 3. **ActionScript 3.0**:Flex ...
Flex4.5 Mobile Hello 是一个基于Adobe Flex 4.5框架开发的移动应用程序示例,主要针对移动设备,如智能手机和平板电脑。Flex是ActionScript 3.0的一个开源框架,用于构建富互联网应用程序(RIA)和跨平台的桌面及...
本书《flex4.5从浅入深》旨在帮助开发者深入理解Flex 4.5的各个方面,从基础知识到高级特性,逐步提升开发技能。标题表明本书分为两大部分,第一章节包含16节内容,第二章节则有5节,都提供了清晰易读的版本。 在...
描述中的“flex4.5自定义组件介绍,自定义组件前提条件”表明我们讨论的是Flex 4.5版本的自定义组件。在Flex 4.5中,开发者需要了解ActionScript 3.0和MXML的基础知识,以及如何使用Spark组件模型来创建组件。自定义...
- **手机应用布局设计**:详细说明如何为移动应用设计合适的布局,包括如何利用Flex 4.5提供的新组件来实现这一目的。 - **处理用户输入**:探讨如何响应用户的触摸、滑动等交互行为,使应用更加互动和友好。 - **...
在Flex4.5中,可以通过自定义组件或者使用Easing函数来实现这种效果。开发者可能使用了Sprite或Shape对象创建图形,并通过时间轴控制动画,让图形在平面上产生向外扩散的波动,增加用户的交互体验。 接着,是“发光...
在Flex 4.5中,开发者可以利用Spark组件模型创建更具视觉吸引力的UI,同时受益于ActionScript 3.0的强大编程能力。 Spring 3是Java企业级应用开发的核心框架,提供了一整套服务,包括依赖注入、AOP(面向切面编程)...
Flex 4.5 是 Adobe 公司开发的一个强大的富互联网应用程序(RIA)框架,它基于ActionScript 3.0和Flash Player运行时环境。在这个框架下,开发者可以创建丰富的、交互性强的网络应用,包括多媒体播放器。在“flex ...
### Flex 4.5 UI布局与组件应用详解 #### 一、引言 随着Web技术的发展,用户界面设计变得越来越重要。Flex作为一种流行的富互联网应用(RIA)开发框架,提供了强大的UI组件库和灵活的布局管理机制。Flex 4.5版本更是...
2. **Flex 4.5**:Flex 是 Adobe 公司开发的一套用于创建富互联网应用程序(RIA)的框架,Flex 4.5 是其版本之一,支持 ActionScript 3.0 和 MXML,提供了更强大的组件库和设计工具,使开发者能构建更具交互性的用户...