2007/08/31 | 图片加载和发光滤镜
类别(Flash学习笔记) | 评论(1) | 阅读(500) | 发表于 11:52

在flash8 帮助文件中有这样一段示例:

import flash.filters.GlowFilter;
var mclListener:Object = new Object();

mclListener.onLoadInit = function(target_mc:MovieClip) {
   trace(target_mc._width);
   target_mc._x = (Stage.width - target_mc._width) / 2;
   target_mc._y = (Stage.height - target_mc._height) / 2;
   var glow:GlowFilter = new GlowFilter();
   target_mc.filters = [glow];
};
this.createEmptyMovieClip("img_mc",10);
var img_mcl:MovieClipLoader = new MovieClipLoader();
img_mcl.addListener(mclListener);
img_mcl.loadClip("myPIC.png",img_mc);  //myPIC.png 是和fla 文件同一目录中的图片

以前一直有这样一个问题很困扰我:就是用MC的loadMovie加载进来的图片没办法知道真实的尺寸。比如用下面的代码加载图片,输出的结果始终是0。

_root.createEmptyMovieClip("img_mc",0);
img_mc.loadMovie("myPIC.png");
trace( img_mc._width );

MovieClipLoader 似乎智能了很多,利用它的onLoadInit  事件参数,就可以获取图片的尺寸了,而且是得来全不费功夫,难怪网上这个问题没人提,也没人说,但困扰了我确实很久,所以在这里记下来。

发光滤镜的使用是比较简单的,不使用任何参数的情况下,它会给图片周围加上一圈红色光晕。应用滤镜时,滤镜对象要写在数组中,形式如 [glow],想必这是为了方便应用多个滤镜所设计的。

 var glow:GlowFilter = new GlowFilter();
 target_mc.filters = [glow];

png 格式的图片在应用发光滤镜时,系统会自动忽略掉透明的部分,但是其它的如bmp、jpg 格式的图片就没这么好的待遇,所以如果是追求效果,把图片先转换一下,处理好边缘的空白,再来用滤镜,效果会比较好。

AS3 中 MovieClipLoader 和 LoadVars 类已经被 Loader 和 URLLoader 类取代。

加载图片,并加上滤镜效果,代码如下:

import flash.filters.GlowFilter;

var ldr:Loader = new Loader();
var url:String = "19.png";
var urlReq:URLRequest = new URLRequest(url);
ldr.load(urlReq);
addChild(ldr);

var glow:GlowFilter = new GlowFilter();
ldr.filters = [glow];

AS3 中的加载要求的比较细了,就好比以前是直接到厨房里去拿吃的,现在必须先填单子,写下菜名(url:String) ,定义好你的吃法(urlReq:URLRequest ),然后让服务员给你传菜(ldr.load(urlReq); ),之后,要想看清楚你点的东西,你得把它放到桌子上去(addChild(ldr); )。操作环节分得细了,不论哪个环节出问题都可以很快的被发现,这就是规范化带来的好处。

Loader 类的继承关系这样的:

Loader Inheritance DisplayObjectContainer Inheritance InteractiveObject Inheritance DisplayObject Inheritance EventDispatcher Inheritance Object

所以它是和MC一样具有可视的属性,就当它是个MC直接应用滤镜即可,当然,也得像MC一样通过 addChild 添加到场景中。

如果想知道图片的尺寸,用借用contentLoaderInfo 类的力量,在加载之前加上这些代码:

function initHandler(event:Event):void {
 var loader:Loader = Loader(event.target.loader);
 var info:LoaderInfo = LoaderInfo(loader.contentLoaderInfo);
 trace("initHandler: loaderURL=" + info.loaderURL + " url=" + info.url);
 trace( info.width,info.height);
}
function ioErrorHandler(event:IOErrorEvent):void {
 trace("ioErrorHandler: " + event);
}

ldr.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

终于知道图片的大小了,还有其它的信息。

0

评论Comments