php

位置:IT落伍者 >> php >> 浏览文章

使用PHP 快速生成Flash 动画


发布日期:2022年11月22日
 
使用PHP 快速生成Flash 动画

Rich Internet Application 是 Web 中的新时髦词并且就 Web 的实质而言一个关键组件就是 Adobe Flash了解如何将 Flash 动画集成到应用程序中并使用 Ming 库动态生成 Flash 动画

Web 引入了 Rich Internet Application但 Rich Internet Application 的含义是什么?通常它意味着向应用程序中添加具有高度响应能力的交易操作具体来说它意味着可以即时更改页面中的小部件Web 表单和报告而无需从服务器中检索新页面

一种用于构建 Rich Internet Application(RIA)的方法就是使用动态 HTML(Dynamic HTMLDHTML)它是 AjaxJavaScript层叠样式表(Cascading Style SheetCSS)和 HTML 的组合(请参阅 参考资料)但是 DHTML 并不是向 Web 应用程序中添加互动操作的惟一方法另一种重要方法是使用 Adobe Flash Player使用它为 Web 站点添加交互操作已经有十年的历史

第一版的 Flash 曾是用于创建动画图片的工具而最新版本的 Flash 已经可以托管一个完整的界面可用于控制 Web 服务访问并使用 ECMAScript(JavaScript 的正式版本)来提供完整的脚本支持

了解 Flash

Flash Player 是集成到运行 Microsoft? Windows?Mac OS X 和 Linux? 的计算机的 Web 浏览器中的一个插件截至本文完稿时最新版本的 Flash Player 是 V它是可以免费获得的大多数浏览器都附带安装了此插件它十分流行并且具有优秀的客户机渗透力 —— 而这种渗透力随着 YouTube 和 Google Video 这类服务的出现得到了提高这些服务都使用 Flash 显示视频流

Flash Player 只是天平的一端要发挥作用Flash Player 还需要使用一个 Flash 动画此类动画通常是使用一种 Flash 的开发工具编译的文件其文件扩展名为 swf但正如您将在本文中看到的那样还可以使用 Ming 库用几乎与动态创建图片相同的方法来动态构建 swf 文件并在 Web 服务器上绘制图形Ming 库利用由 PHP 代码构建的对象和方法在新的 swf 文件中构建操作代码

您可以通过两种方法中的任意一种方法来查看 Web 站点中的 swf 文件第一种方法只需导航到 swf 文件的 URL这样做将把 Web 服务器的整个内容区域替换为 Flash 动画此方法便于进行调试但主要的用法还是将动画嵌入到 HTML Web 页面的 <object> 标记中该 <object> 标记然后再通过 URL 引用 SWF 动画<object> 方法的优点在于您可以把动画放在页面的任意位置并可通过 JavaScript 代码进行动态控制就像处理页面中的任何其他元素一样

清单 显示的是一个引用 SWF 动画的 <object> 标记的示例

清单 嵌入式 Flash 动画

<OBJECT classid=clsid:DCDBEAEDcfBcodebase=# version=WIDTH= HEIGHT=><PARAM NAME=movie VALUE=linesswf><EMBED src=linesswf WIDTH= HEIGHT=TYPE=application/xshockwaveflashPLUGINSPAGE=></EMBED></OBJECT>

这组标记将引用一个名为 linesswf 的动画内部的 <embed> 标记用于确保 Flash 动画可以在安装了插件的各种浏览器中播放

标记还把 Flash Player 的高度和宽度分别指定为 像素和 像素非常值得注意的是Flash 动画中的图形都是基于矢量的这意味着当您使用 Flash 命令绘制线条和文本时那些元素都被存储为坐标并且按照匹配显示区域的比例进行缩放如您所见Flash 动画有自己的坐标系统您可以按照适合自己的方法使代码尽可能整洁

Ming

本文中提供的使用 Flash 动画的第一种方法是使用 Ming 库动态生成它们Ming 库是一个 PHP 库其中有一组映射到 SWF 动画中的数据类型的对象子图形图形文本位图等等我将不讨论如何构建和安装 Ming因为其操作是特定于平台的而且并不特别简单(请参阅 参考资料)在本文中我使用了预编译的扩展 php_mingdll 库用于 Windows 版本的 PHP

必须指出的是Ming 仍处于开发阶段截至本文完稿时库的版本是 V并且较老版本中的一些命令在最新版本中不能使用我使用了 V 撰写本文因此要使用这段代码您需要使用这个版本

清单 显示了使用 Ming 库实现的 HelloWorld 示例

清单 Hellophp

<?php$f = new SWFFont( _sans );$t = new SWFTextField();$t>setFont( $f );$t>setColor( );$t>setHeight( );$t>addString( Hello World );$m = new SWFMovie();$m>setDimension( );$m>add( $t );$m>save( helloswf );?>

在命令行中运行这段代码将生成文件 helloswf当我在 Web 浏览器中打开该文件时看到了图 所示的结果

使用 Ming 的 HelloWorld 示例

回过头来查看这段代码我做的第一件事是创建指向一个内置字体(_sans)的指针然后创建文本字段设定字体颜色和大小最后为其提供一些文本内容(Hello World再接下来创建了一个 SWFMovie 对象并设定其尺寸最后向动画中添加了文本元素并将动画保存到文件中

作为直接构建文件的替代性方法也可以使用下面的代码使 SWF 动画像页面那样输出而无需使用 save 方法

header( Contenttype: application/xshockwaveflash );$m>output( );

此过程类似于使用 PHP 中的 ImageMagick 库来构建位图对于所有 Ming 示例我都将使用 save 方法但您可以根据喜好来选择是否使用 save 方法

让文本动起来

只是将一些文本放入 Flash 动画中是没有多大意义的除非您能让它动起来因此我整合了清单 中的示例它包括两段文本一部分开始很小后来变得越来越大而另一部分保持静态

清单 Textphp

<?php$f = new SWFFont( _sans );$pt = new SWFTextField();$pt>setFont( $f );$pt>setColor( );$pt>setHeight( );$pt>addString( );$tt = new SWFTextField();$tt>setFont( $f );$tt>setColor( );$tt>setHeight( );$tt>addString( Points );$m = new SWFMovie();$m>setDimension( );$pts = $m>add( $pt );$pts>moveTo( );$tts = $m>add( $tt );$tts>moveTo( );for( $i = ; $i < ; $i++ ) { $m>nextframe(); $pts>scaleTo( + ( $i / ) + ( $i / ) );}$m>save( textswf );?>

在命令行中执行这段代码时它将生成 textswf在 Web 浏览器中打开该文件时我看到了图 所示的图片

textswf 文件

文本 开始时很小大小为 个点然后使用 scaleTo() 方法使其增大为 个点方法是对动画对象使用 nextframe() 方法

要理解其工作原理需要了解一点 Flash 制作动画的方法Flash 中的动画就像电影中的动画一样运行按帧运行子图形将按帧在动画框架中移动一个主要差别是 Flash 不获取每帧的快照它存储子图形对象在每帧的状态

您可能会注意到我有一个名为 $pt 的变量该变量具有文本 随后当我把 $pt 添加到动画中时获得了通过 add() 方法返回的名为 $pts 的新对象该对象是 SWFDisplayItem表示子图形的实例然后我可以围绕动画框架的表面逐帧移动实例这有点儿混乱但我可以拥有同时移动的多个版本的 文本子图形或 points 文本子图形

绘制一些图形

接下来要处理的是矢量图形首先仅绘制一条简单的直线它从框架的左侧顶部到右侧底部

清单 Linephp

<?php$m = new SWFMovie();$m>setDimension( );$s = new SWFShape();$s>setLine( );$s>movePenTo( );$s>drawLineTo( );$m>add( $s );$m>save( lineswf );?>

在命令行中运行此脚本然后查看输出的 swf 文件效果如图 所示

绘制简单的直线

好的 —— 这十分简单也不怎么令人激动那么我做了什么?创建了一个新的 SWFShape 对象然后向其中添加了一些笔触移动和直线然后我将其作为子图形添加到了动画中

为了让它变得更有趣我使用了与刚才文本中使用的相同的帧式动画但在本例中我用下面所示的代码使这条直线围绕动画的中心旋转

清单 旋转直线

<?php$m = new SWFMovie();$m>setDimension( );$s = new SWFShape();$s>setLine( );$s>movePenTo( );$s>drawLineTo( );$ts = $m>add( $s );$ts>moveTo( );for( $i = ; $i < ; $i++ ) { $ts>rotate( ); $m>nextframe();}$m>save( rotateswf );?>

在本例中我从 画了一条直线这将把直线的中心放在坐标 这样当我在旋转图形时直线的中心将发生旋转

当我向动画中添加图形时将移动返回到框架中心的 SWFDisplayItem然后用 rotate() 方法使它旋转并每旋转一周就增大其框架

使用图片

文本和诸如直线曲线和矩形之类的简单矢量图形都是十分优秀的但在理想的情况下您必须能访问这些 Flash 动画中的图片值得庆幸的是Ming 库使您可以轻松的使用图片如下所示

清单 使用图片

<?php$img = new SWFBitmap( file_get_contents( meganjpg ) );$s = new SWFShape();$imgf = $s>addFill( $img );$s>setRightFill( $imgf );$s>movePenTo( );$s>drawLineTo( $img>getWidth() );$s>drawLineTo( $img>getWidth() $img>getHeight() );$s>drawLineTo( $img>getHeight() );$s>drawLineTo( );$m = new SWFMovie();$m>setDimension( $img>getWidth() * $img>getHeight() * );$is = $m>add( $s );$is>moveTo( $img>getWidth() / $img>getHeight() / );for( $i = ; $i < ; $i++ ){ $is>skewx( );$is>skewy( );$m>nextframe();}$m>save( imageswf );?>

在命令行中运行此脚本并在浏览器中查看 imageswf结果如图 所示

生成的图片动画

此脚本在开始时读取了本地的 jpeg 文件(在本例中是我女儿 Megan 的照片)然后创建一个矩形并在其中填充图片在那之后它在 帧处使用了位移效果使图片稍微移动

继续移动

我只是触及了 Ming 库可为您提供的操作的表面在这里我没有展示交互部分在交互部分您可以将简单的脚本与元素连接起来(但是如果换成是交互操作如果您有一个十分复杂的 Flash 动画则可能需要考虑使用 Flash 开发工具来构建 Web 应用程序内与 Web 服务对话的 Flash 动画

构建更加复杂的 Flash 动画的另外一种选择是使用诸如 Adobe Flex 或 Laszlo 之类的制作工具这两种工具都提供了用于为 Flash 动画的用户界面布局的 XML 语法以及一个更轻松地例程可用于开发为界面提供互动操作的 JavaScript

XML Chart 和 XML Gauge

给我留下深刻印象的两个 Flash SWF 是 XML Chart 和 XML Gauge可在 maanius 获得(请参阅 参考资料)使用动画就可以轻松地为 Web 站点提供动态的规格和图形您只需在 PHP 应用程序中创建 XML 页面

第一步是从站点下载 SWF然后将其嵌入到 Web 页面的 <object> 标记中并将 URL 提供给 XML 数据摘要制作一个 PHP 页面按照控制所需的格式导出 XML这些动画的 XML 格式在站点中得到了详细说明并且非常易于创建

结束语

Flash 带来了一种机会使您可轻松将大量交互操作添加到 Web 应用程序就像一些小部件样式的控件一样从微不足道开始变得越来越流行XML Chart 和 XML Gauge 提供了机会让您在投入大量时间了解 MingFlex 或 Laszlo 之前先尝试使用这些类型的 Flash 小部件无论如何值得花时间去了解 Flash 及其功能来扩展 Web PHP 应用程序的功能及交互操作

上一篇:php:根据中文裁减字符串函数方法

下一篇:PHP中利用MySQL进行访问统计的思路