要求

    • 必备知识

      本文要求基本了解 Adobe Flex编程知识。

    • 开发环境

      Flash Builder4/Flash Player11

    • 演示地址

      演示地址 资料下载

 

Adobe Flash Player是一种广泛使用的、专有的多媒体程序播放器。它最初由Macromedia编写,在Macromedia被Adobe收购后由Adobe继续开发并分发。Adobe Flash Player 最初设计目的为播放2维向量动画,但至此之后成为适合开发创造丰富型互联网应用程序、流视频音频的工具。Flash Player使用向量图形的技术来最小化文件的大小以及创造节省网络带宽和下载时间的文件。因此Flash 成为嵌入网页中的小游戏、动画以及图形用户界面常用的格式。总而言之Flash Player是目前网站处理丰富型互联网应用程序、流视频音频的的主流工具。

而Flex 是一个高效、免费的开源框架,可用于构建具有表现力的 Web应用程序,这些应用程序利用Adobe Flash PlayerAdobe AIR, 运行时跨浏览器、桌面和操作系统实现一致的部署。所以Flex是目前构建丰富型互联网应用程序的首选。废话不多少! 直接上程序截图和代码。

播放器截图:

制作过程简介:

    • 在设计模式下拖入VideoPlayer组件后,右键创建组件皮肤:

    • 分别定义皮肤部件:

<?xml version="1.0" encoding="utf-8"?>
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
alpha.disabledStates="0.5"
chromeColor.fullScreenStates="0xCCCCCC">
<!--
alpha透明度值
0xCCCCCC在fullScreenStates A chrome color 意味着我们忽视了chromeColor的属性 --> <!-- host component
主机组件-->
<fx:Metadata>
[HostComponent("spark.components.VideoPlayer")]
</fx:Metadata> <fx:Script fb:purpose="styling">
<![CDATA[
/* Define the skin elements that should not be colorized.
定义了皮肤元素不应该被彩色化*/
static private const exclusions:Array = ["videoDisplay", "playPauseButton", "scrubBar",
"currentTimeDisplay", "timeDivider", "durationDisplay",
"volumeBar", "fullScreenButton"]; /**
* @private
*/
override protected function initializationComplete():void
{
useChromeColor = true;
super.initializationComplete();
} /**
* @private
*/
override public function get colorizeExclusions():Array
{
return exclusions;
} /**
* @private
*/
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
dropShadow.visible = getStyle("dropShadowVisible"); super.updateDisplayList(unscaledWidth, unscaledHeight);
}
]]> </fx:Script> <!-- states -->
<s:states>
<s:State name="uninitialized" stateGroups="uninitializedStates, normalStates" />
<s:State name="loading" stateGroups="loadingStates, normalStates" />
<s:State name="ready" stateGroups="readyStates, normalStates" />
<s:State name="playing" stateGroups="playingStates, normalStates" />
<s:State name="paused" stateGroups="pausedStates, normalStates" />
<s:State name="buffering" stateGroups="bufferingStates, normalStates" />
<s:State name="playbackError" stateGroups="playbackErrorStates, normalStates" />
<s:State name="disabled" stateGroups="disabledStates, normalStates"/>
<s:State name="uninitializedAndFullScreen" stateGroups="uninitializedStates, fullScreenStates" />
<s:State name="loadingAndFullScreen" stateGroups="loadingStates, fullScreenStates" />
<s:State name="readyAndFullScreen" stateGroups="readyStates, fullScreenStates" />
<s:State name="playingAndFullScreen" stateGroups="playingStates, fullScreenStates" />
<s:State name="pausedAndFullScreen" stateGroups="pausedStates, fullScreenStates" />
<s:State name="bufferingAndFullScreen" stateGroups="bufferingStates, fullScreenStates" />
<s:State name="playbackErrorAndFullScreen" stateGroups="playbackErrorStates, fullScreenStates" />
<s:State name="disabledAndFullScreen" stateGroups="disabledStates, fullScreenStates"/>
</s:states> <!-- drop shadow 阴影-->
<!--- @private
此类通常用于优化投影。如果要对其边缘位于像素边界上的 rectangularly-shaped 对象应用投影,则应使用此类
blurX 水平模糊量
blurY 垂直模糊量
alpha 透明度
distance 阴影的偏移距离,以像素为单位。
angle 斜角的角度。
color 光晕颜色。
excludeFrom 从对应的属性中删除该组件
-->
<s:RectangularDropShadow
id="dropShadow"
blurX="17"
blurY="17"
alpha="0.32"
distance="4"
angle="90"
color="#131313"
left="0"
top="0"
right="0"
bottom="0"
excludeFrom="fullScreenStates"/> <!--- Video and player controls are clipped if they exceed the size of the
component, but the drop shadow above is not clipped and sizes to the component.
We also set verticalScrollPosition so that when we do clip, rather than clipping
off the bottom first, we clip off the top fist. This is so the player controls
are still visible when we start clipping.
视频和播放器控件在超过组件的大小被剪切,
但上方的下拉阴影未裁剪和尺寸的组件。
我们还设置verticalScrollPosition的,
这样,当我们做剪辑,而不是先剪切断底,
我们剪掉顶部拳头。这是为了让玩家控制仍然可见,
当我们开始裁剪。--> <!-- clipAndEnableScrolling 如果是true,则将超出范围的children裁掉不显示出来
-->
<s:Group id="clippedGroup" clipAndEnableScrolling="true" left="0" top="0" right="0" bottom="0"
verticalScrollPosition="{Math.max(0, 184-clippedGroup.height)}"> <!-- 有用于视频和控制的最小尺寸。如果我们去下面,我们被剪切。 -->
<s:Group minWidth="263" minHeight="184" left="0" right="0" top="0" bottom="0"> <!-- background when the videoDisplay doesn't fill its whole spot
背景时,当VideoDisplay没有填充整个点-->
<s:Rect bottom="0" left="0" right="0" top="0">
<s:fill>
<!--蓝色背景-->
<s:SolidColor color="0x000000" />
</s:fill>
</s:Rect> <!--- @copy spark.components.VideoPlayer#videoDisplay
bottom 距离下边24像素控制面板的高度是24像素-->
<s:VideoDisplay
id="videoDisplay"
bottom="50"
left="0"
right="0"
top="0"
bottom.fullScreenStates="0" /> <!-- video player controls
bottom.fullScreenStates全屏时距离下边是150像素
控制面板-->
<s:Group left="0" right="0" height="50" bottom="0" bottom.fullScreenStates="150"> <!-- actual controls with a maxWidth in non-fullScreen mode 在非全屏模式了maxWidth实际控制 -->
<!--- @copy spark.components.VideoPlayer#playerControls
组件区域控制面板-->
<s:Group
bottom="0"
top="0"
horizontalCenter="0"
left="0"
right="0"
maxWidth.fullScreenStates="755"
id="playerControls" > <s:Rect bottom="0" left="0" right="0" top="0"
>
<s:fill>
<!--灰色背景-->
<s:SolidColor color="0x444953" />
</s:fill>
</s:Rect> <!--- @copy spark.components.VideoPlayer#playPauseButton
到这里创建外观声明
playPauseButton:ToggleButtonBase 暂停/播放组件
focusIn 显示对象获得焦点后调度。 事件
focusOut 显示对象失去焦点后调度。 事件
-->
<s:Group width="50" height="50" left="0" bottom="0">
<s:ToggleButton
id="playPauseButton"
verticalCenter="0"
horizontalCenter="0"
skinClass="skins.PlayPauseButtonSkin" layoutDirection="ltr"
focusIn="event.target.depth=1" focusOut="event.target.depth=0" />
</s:Group> <!-- scrub bar + currentTime/duration in a HorizontalLayout
scrub bar+ currentTime的/持续时间在一个HorizontalLayout-->
<s:Group left="50" right="100" height="50" bottom="0">
<s:layout>
<s:HorizontalLayout verticalAlign="middle" gap="1" />
</s:layout> <!--- @copy spark.components.VideoPlayer#scrubBar -->
<s:ScrubBar id="scrubBar"
left="0"
right="0"
liveDragging="true"
width="100%"
skinClass="skins.ScrubBarSkin"
/> <!-- spacer 垫片-->
<s:Rect width="8" height="1" /> <!--- @copy spark.components.VideoPlayer#currentTimeDisplay
可选外观部件,用于显示 codecurrentTime 的当前值。 -->
<s:Label id="currentTimeDisplay" color="0xFFFFFF"
fontFamily="微软雅黑" fontSize="13"
fontWeight="bold"
verticalAlign="middle"/> <!--- @private -->
<s:Label id="timeDivider" text="/" color="0xFFFFFF" verticalAlign="middle"
/> <!--- @copy spark.components.VideoPlayer#durationDisplay
要显示 duration 的可选外观部件。-->
<s:Label id="durationDisplay"
color="0xFFFFFF"
fontFamily="微软雅黑" fontSize="13"
fontWeight="bold"
verticalAlign="middle"/> </s:Group> <!--- @copy spark.components.VideoPlayer#volumeBar
音量按钮-->
<s:Group right="50" height="50" width="50">
<s:VolumeBar id="volumeBar" snapInterval=".01" stepSize=".01" liveDragging="true"
horizontalCenter="0"
verticalCenter="0"
layoutDirection="ltr"
skinClass="skins.VolumeBarSkin"
focusIn="event.target.depth=1" focusOut="event.target.depth=0"
/>
</s:Group>
<!--- @copy spark.components.VideoPlayer#fullScreenButton
全屏按钮-->
<s:Group width="50" height="50" right="0">
<s:Button id="fullScreenButton" right="0" bottom="0" label="Fullscreen"
skinClass="skins.FullScreenButtonSkin" focusIn="event.target.depth=1" focusOut="event.target.depth=0"
verticalCenter="0"
horizontalCenter="0"
/>
</s:Group> </s:Group> </s:Group> </s:Group>
</s:Group>
</s:SparkSkin>

部件的外观定义和步骤一中创建VideoPlayer皮肤类似,这里就不多介绍了。

在文章的开始出我提供了参考手册,和皮肤中的图片,可以动手试试啊!!

作者:Li-Cheng
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Flex4/AS3.0自定义VideoPlayer组件皮肤,实现Flash视频播放器的更多相关文章

  1. AS3.0 自定义右键菜单类

    AS3.0 自定义右键菜单类: /** * 自定义右键菜单类 * 自定义菜单项不得超过15个,每个标题必须至少包含一个可见字符. * 标题字符不能超过100个,并且开头的空白字符会被忽略. * 与任何 ...

  2. vue.js2.0 自定义组件初体验

    理解 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在有些情况 ...

  3. vue2.0 自定义 弹窗(MessageBox)组件

    组件模板 src/components/MessageBox/index.vue <!-- 自定义 MessageBox 组件 --> <template> <div c ...

  4. vue2.0 自定义 饼状图 (Echarts)组件

    1.自定义  图表  组件 Echarts.vue <!-- 自定义 echart 组件 --> <template> <div> <!-- echart表格 ...

  5. vue3系列:vue3.0自定义弹框组件V3Popup|vue3.x手机端弹框组件

    基于Vue3.0开发的轻量级手机端弹框组件V3Popup. 之前有分享一个vue2.x移动端弹框组件,今天给大家带来的是Vue3实现自定义弹框组件. V3Popup 基于vue3.x实现的移动端弹出框 ...

  6. vue3系列:vue3.0自定义全局弹层V3Layer|vue3.x pc桌面端弹窗组件

    基于Vue3.0开发PC桌面端自定义对话框组件V3Layer. 前两天有分享一个vue3.0移动端弹出层组件,今天分享的是最新开发的vue3.0版pc端弹窗组件. V3Layer 一款使用vue3.0 ...

  7. vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件

    基于Vue3.0构建PC桌面端自定义美化滚动条组件V3Scroll. 前段时间有分享一个Vue3 PC网页端弹窗组件,今天带来最新开发的Vue3.0版虚拟滚动条组件. V3Scroll 使用vue3. ...

  8. [转]Flash、Flex、AS3.0框架及类库资源收集之十全大补

    原文地址:http://www.d5power.com/portal.php?mod=view&aid=27 APIs.Libs.Components1.as3ebaylibhttp://co ...

  9. 从0到1搭建一款Vue可配置视频播放器组件(Npm已发布)

    前言 话不多说,这篇文章主要讲述如何从0到1搭建一款适用于Vue.js的自定义配置视频播放器.我们平时在PC端网站上观看视频时,会看到有很多丰富样式的视频播放器,而我们自己写的video标签样式却是那 ...

随机推荐

  1. lucene.net helper类 【结合盘古分词进行搜索的小例子(分页功能)】

      转自:http://blog.csdn.net/pukuimin1226/article/details/17558247 添加:2013-12-25 更新:2013-12-26 新增分页功能. ...

  2. 监控Linux性能的18个命令行工具

    监控 Linux 性能的 18 个命令行工具 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐 认识到监控和保 ...

  3. 【maven】之使用jetty发布web项目

    <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin ...

  4. string和stringBuilder区别

    C# String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与 ...

  5. activiti自定义流程之整合(一):整体环境配置

    结合之前所说的自定义流程的思路,分别是后台.前台.整合,之前的内容也分别进行了相关的练习和尝试,现在就该到了最后的整合了,依旧是以实现功能为目的,细节暂且不去管他. 因为我们实际项目后端用的是spri ...

  6. JavaScript-获得当前时间

    js获得当前时间 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位, ...

  7. struts 2 <s:select> 标签

    名称 必填 缺省值 类型 描述 emptyOption false false Boolean 是否在题头选项后面添加一个空的(--)选项 headerKey false   Object/Strin ...

  8. (WPF, MVVM) Event 处理

    WPF的有些UI元素有Command属性可以直接实现绑定,如Button 但是很多Event的触发如何绑定到ViewModel中的Command呢? 答案就是使用EventTrigger可以实现. 继 ...

  9. BIP_开发案例05_BI Pubisher标准做法以BIP.XML为数据源以BIP.RTF为模板的简单例子(案例)

    2014-05-31 Created By BaoXinjian

  10. NeHe OpenGL教程 第六课:纹理映射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...