引言

上一篇教程明河讲解了如何使用actionscript3.0读取和处理xml,今天明河将主要讲解如何使用actionscript3.0构建个图片画廊,在接下来的教程中有如下工作:
- 构建一个图片画廊的影片剪辑作为画廊的容器
- 构建图片剪辑类
使用actionscript3.0构建个图片画廊
1、新建个图片画廊影片剪辑
在lib.Gallery的加个变量
- //图集的影片剪辑
- public var imagesClip:MovieClip = new MovieClip;
在lib.Gallery的构造函数内加上如下代码:
- imagesClip.y = 180;
- //将图集的影片剪辑添加到舞台
- addChild(imagesClip);
设置图片画廊影片剪辑的y轴位置,并添加到舞台。
2、构建lib.Img类(打开库中的Img元件的文档类)
Img是单个图片剪辑,我们需要知道该图片剪辑的id,设置其宽度、高度,及其位置。Img并非在实例化时就加载图片,而是由外部控制何时加载,所以我们需要一个独立的加载图片的方法loadImage,加载完图片还需要将图片加入到图片剪辑,同时也要向图片剪辑加入图片名,所以我们还需要一个方法displayImage
接下来来看详细的代码:
一、构造函数,设置图片剪辑的几个主要属性(变量的定义略过)
- //构造函数
- /**
- *@param load {String} 图片路径
- *@param m {Object} 主文档画廊类实例
- */
- public function Img(load:String,m:Gallery):void {
- orgWidth = width;
- orgHeight = height;
- //设置图片路径
- src = load;
- //主文档画廊类实例
- main = m;
- //透明度
- alpha = 0;
- //设置图片宽度
- imgWidth = main.imgWidth;
- imgHeight = main.imgHeight;
- //获取字体名
- fontName = Font.enumerateFonts()[0].fontName;
- }
src将保存图片路径,main指向舞台,我们不需要一开始就显示这个图片剪辑,所以设置alpha = 0;(请看库中的Img元件是有loading背景的,我们并不希望一实例化就显示。)
fontName为字体名(图片名部分将采用嵌入的字体,示例中明河嵌入的是微软雅黑,关于这部分将在图片名部分详解)。
二、loadImage函数
loadImage将读取指定src的图片,这部分代码如下:
- /**
- *读取图片
- */
- public function loadImage():void{
- imageLoader.load(new URLRequest(src));
- imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,displayImage);
- }
监听加载完成事件。
三、displayImage函数
- /**
- *显示图片
- */
- public function displayImage(_e : Event):void{
- //如果此id后还存在图片实例,加载下一个图片
- if(main.images[id + 1] != null && !main.images[id + 1].parent) main.images[id + 1].loadImage();
- //控制在缩放时对位图进行平滑处理
- Bitmap(imageLoader.content).smoothing = true;
- //设置图片位置
- imageLoader.x = main.spaceBetween/2 - ( orgWidth /2 );
- imageLoader.y = main.spaceBetween/2 - ( orgHeight /2 );
- imageLoader.width = imgWidth;
- imageLoader.height = imgHeight;
- //添加到图片剪辑
- addChild( imageLoader );
- //显示文件名
- var descr:TextField = new TextField();
- var extensionIndex:Number = src.lastIndexOf( '/' );
- ImgName = src.substr(extensionIndex+1,src.length);
- descr.text = ImgName;
- descr.y = imageLoader.y + imageLoader.height ;
- descr.x = 10 - ( orgWidth /2 );
- //指定将文本视为左对齐文本
- descr.autoSize = TextFieldAutoSize.LEFT;
- //嵌入字体
- descr.embedFonts = true;
- //格式化文字
- var format:TextFormat = new TextFormat(fontName, 12, 0);
- format.color = 0x5B4846;
- descr.setTextFormat(format);
- addChild( descr );
- }
这部分看似代码很多,其实很好理解,可以分成二个部分:
- 向图片剪辑添加图片
- 向图片剪辑添加图片名
向图片剪辑添加图片
- //如果此id后还存在图片实例,加载下一个图片
- if(main.images[id + 1] != null && !main.images[id + 1].parent) main.images[id + 1].loadImage();
- //控制在缩放时对位图进行平滑处理
- Bitmap(imageLoader.content).smoothing = true;
- //设置图片位置
- imageLoader.x = main.spaceBetween/2 - ( orgWidth /2 );
- imageLoader.y = main.spaceBetween/2 - ( orgHeight /2 );
- imageLoader.width = imgWidth;
- imageLoader.height = imgHeight;
- //添加到图片剪辑
- addChild( imageLoader );
这里要做个很重要的判断,即如果此id后还存在图片实例,加载下一个图片,也就是触发大于id索引值的图片剪辑加载图片,这样,我们无需再循环数组重复加载图片。
这里说明下!main.images[id + 1].parent如果一个图片剪辑已经加入到了图片集影片剪辑,那么该图片剪辑取父容器的时候就存在,反之那么该图片剪辑还未加入到图片集影片剪辑。
向图片剪辑添加图片名
- //显示文件名
- var descr:TextField = new TextField();
- var extensionIndex:Number = src.lastIndexOf( '/' );
- ImgName = src.substr(extensionIndex+1,src.length);
- descr.text = ImgName;
- descr.y = imageLoader.y + imageLoader.height ;
- descr.x = 10 - ( orgWidth /2 );
- //指定将文本视为左对齐文本
- descr.autoSize = TextFieldAutoSize.LEFT;
- //嵌入字体
- descr.embedFonts = true;
- //格式化文字
- var format:TextFormat = new TextFormat(fontName, 12, 0);
- format.color = 0x5B4846;
- descr.setTextFormat(format);
- addChild( descr );
文件名来源于图片路径,但我们只需要最后一段URI,即XXX.png即可。所以这里做了如下处理:
- var extensionIndex:Number = src.lastIndexOf( '/' );
- ImgName = src.substr(extensionIndex+1,src.length);
关于字符串的处理有太多的方法了,明河这里用的是笨办法,推荐使用正则。
为啥要使用嵌入字体?
嵌入字体后使swf文件体积大增,但这里有不得不使用嵌入字体的理由,请看demo,图片剪辑有带旋转的效果,如果不使用嵌入字体,就没办法显示文字。关于嵌入字体明河推荐看一篇很好的教程
下一篇教程将是本教程的完结篇,讲解最难部分:如何制作滑动效果。
actionscript3.0实战教程完成后,明河打算再发个系列教程,讲解如何构建wordpress插件。

哇哦 一下4篇连载 写的简单明白 一学就会
……太感动了,总算有人欣赏了,我写到第四篇,以为都没人看呢,万分感谢!
别感动了,呵呵,我看了下我该感动才对呢,。。
我刚从as2的痛苦中解脱出来,现在看AS3, 看到你的东西收货很多,谢谢