2008年9月30日星期二

《making things move》笔记(第四章)(3)(有小结公式)

颜色转换
flash.geom.ColorTransform 类及其方法

任何显示对象都有一个属性叫作 transform ,其中包括一些不同的属性用于缩放,旋转,定位和改变影片颜色,影响颜色属性的就是 colorTransform
mySprite.transform.colorTransform
ColorTransform 对象的构造函数如下:
ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier, redOffset, greenOffset, blueOffset, alphaOffset)

转换一个特殊颜色通道的公式如下,以红色通道为例:
newRed = oldRed * redMultiplier + redOffset;

[Embed(source="picture.jpg")]????????

位图(Bitmaps)
BitmapData ,没有继承自 DisplayObject,所有不能直接添加对象。
这就是为什么要有 Bitmap 类的原因, Bitmap 类几乎始终都有一个函数作为 BitmapData 实例的容器
EG:
var myBitmapData:BitmapData = new BitmapData(100, 100, false, 0xff0000);
var myBitmap:Bitmap = new Bitmap(myBitmapData);
addChild(myBitmap);

setPixel 使用24位色彩值忽略了 alpha 通道,
setPixel32 “32”版的则使用32位色彩值其中包括了透明度信息

读取和嵌入资源
一种是在动画播放时将资源读入,这就是我们所熟知的读取(loading)。另一种方法是在 SWF 编译时嵌入(embed)资源。
[Embed]元数据(metadata) 标签
[Embed(source="picture.jpg")] private var Image:Class;
现在可以使用这个变量创建一个新的资源实例,如下: var img:Bitmap = new Image();

本章重要公式
转换为十进制: trace(hexValue);
十进制转换为十六进制: trace(decimalValue.toString(16));

颜色合成:
color24 = red << 16 | green << 8 | blue;
color32 = alpha << 24 | red << 16 | green << 8 | blue;

颜色提取:
red = color24 >> 16;
green = color24 >> 8 & 0xFF;
blue = color24 & 0xFF; alpha = color32 >> 24;
red = color32 >> 16 & 0xFF; green = color32 >> 8 & 0xFF;
blue = color232 & 0xFF;

过控制点的曲线:
// xt, yt is the point you want to draw through
// x0, y0 and x2, y2 are the end points of the curve
x1 = xt * 2 – (x0 + x2) / 2;
y1 = yt * 2 – (y0 + y2) / 2;
moveTo(x0, y0);
curveTo(x1, y1, x2, y2);

2008年9月27日星期六

[千斤顶]一天一个类

一天一个类
改从顶级包里的类开始

9.27
ArgumentError 类表示一种错误,如果函数提供的参数与为该函数定义的参数不一致,则会出现该错误。
例如,如果在调用函数时使用了错误的参数数目、不正确的参数类型或无效参数,则会发生此错误。

《making things move》笔记(第四章)(2)

使用 beingGradientFill 创建渐变填充

beginGradientFill(fillType, colors, alpha, ratios, matrix)
fillType: 填充类型,非常简单,用一个字符串表示,这两个值中的一个:”linear”或”radial”
可以导入 GradientType 类然后输入 GradientType.LINEAR 或 GradientType.RADIAL。
后面每一个参数都是一个数组,因为需要传入至少两个以上的 colors,alphas 及 ratios。
graphics.beginGradientFill(GradientType.LINEAR, [0xffffff, 0x000000], [1, 1], [0, 255], matrix);
matrix(矩阵) 参数
var matrix:Matrix = new Matrix();
matrix.createGradientBox(width, height, rotation, x, y);
不要忘记在类的开始处导入 flash.geom.Matrix 类。
如果仅指定 width 和 height,最后三个值默认为 0。

2008年9月26日星期五

《making things move》笔记(第四章)(1)

第四章 渲染技术
――常识:API 是什么,它是应用程序接口(Application Programming Interface)的缩写。总的来说,API 是指在程序中使用的一些属性和方法来访问某些相关的行为和属性。
FLASH的色彩知识:

将十六进制转换为十进制:trace(0xAC05A2);
将十进制转换为十六进制要用到 toString(16)函数,如:
trace((11273634).toString(16));使用这个数,要加上0x。


色彩值永远都是正数,并有可能超出 int 的值域范围,所以要使用 uint 来存储它们。

色彩合成
如何将红、绿、蓝三种颜色值组成一个有效的颜色值,这是个普遍的问题。
假设有三个变量 red,green,blue,每个变量里面保存一个 0 到 255 之间的数。
下面是这个公式:

color24 = red << 16 | green << 8 | blue;
加入透明度后,建立一个32位色彩值,公式如下:
color32 = alpha << 24 | red << 16 | green << 8 | blue;

位操作符是 << ,是一个按位左移操作符
比如,红色值(red)为 0xFF 或 255,可以由二进制表示为:
11111111
将它向左移动 16 位,结果是:
111111110000000000000000
绿色值(green)为 0x55(十进制 85)
蓝色值为 0xF3(十进制 243)
这样我们总共就拥有了三组数:
111111110000000000000000
000000000101010100000000
000000000000000011110011
使用或(OR)运算,符号是 | 。它会将两组数的每个二进制位进行比较,如果两个之中有一个数为1,那么结果就为 1,如果两个数都为 0,那么结果就为 0。

重要:::
var color24:Number = 0xFF << 16 | 0x55 << 8 | 0xF3; 或者:
var color24:Number = 255 << 16 | 85 << 8 | 243;
(使用二进制操作是 ActionScript 中最快的运算,因为它们属于低级运算。)

获取颜色值
假如有这样一个数 0xFF55F3,要从中提取 red, green, blue 的值。
red = color24 >> 16;
green = color24 >> 8 & 0xFF;
blue = color24 & 0xFF;
& (And)操作符
如果两个都是1那么结果就为 1,如果其中有一个为 0,那么结果就为 0。

绘图对象
直接访问绘图方法,我们可以这样写: mySprite.graphics.lineTo(100, 100);


使用 clear 删除绘制
这个命令中对其它 graphics 绘制的图像不起作用。。。。这个是什么意思。我要验证――



大概写了一个画线

package {
import flash.display.Sprite;
import flash.events.*;
import flash.utils.Timer
public class DrawingApp extends Sprite {
var button:Sprite=new Sprite()
var b:Number
var c:Number
public function DrawingApp() {
init();
button.buttonMode=true
button.graphics.beginFill(0x000000)
button.graphics.drawCircle(0,0,20)
button.graphics.endFill()
addChild(button)
//graphics.lineStyle(line(1))
graphics.lineStyle(1)

}
/*private function line(a:Number){
}*/

private function onclick(e:MouseEvent):void{
graphics.clear()
//graphics.lineStyle(line(1))
graphics.lineStyle(1)
}
private function init(){

stage.addEventListener(MouseEvent.MOUSE_DOWN,ondown)
stage.addEventListener(MouseEvent.MOUSE_UP,onup)
}
private function ondown(e:MouseEvent):void{
graphics.moveTo(mouseX,mouseY)
stage.addEventListener(MouseEvent.MOUSE_MOVE,onmove)

}
private function onup(e:MouseEvent):void{
stage.removeEventListener(MouseEvent.MOUSE_MOVE,onmove)
button.addEventListener(MouseEvent.CLICK,onclick)
}
private function onmove(e:MouseEvent):void{
graphics.lineTo(mouseX,mouseY)

}
}
}

其中 private function line(a:Number){
}
做为一个扩展
希望以后可以写成随鼠标按下时间,越长则a值越大


使用 curveTo 绘制曲线
curveTo(x1, y1, x2, y2),
起点:上一次画线的终点/ moveTo 命令指定画笔的起点/第一次画线默认的起点为0,0。
curveTo 函数中包括两个点。
第一个是控制点影响曲线的形状,
另一个是曲线的终点。

x1 = xt * 2 – (x0 + x2) / 2;
y1 = yt * 2 – (y0 + y2) / 2;
(xt,yt是控制点的实际位置,即mouseX,mouseY)

2008年9月25日星期四

这两天一直困在颜色的问题里

关于颜色的公式

取色器先到这里。用是可以用了。功能还不完善。算法也没搞清。过一段时间再来看

下面是核心算法
下面是头晕算法--

function hslToRgb(H,S,L) {
var p1,p2;
var rgb=new Array(3);
if (L <= 0.5) {
p2 = L*(1+S);
} else {
p2 = L+S-(L*S);
}
p1=2 * L - p2;
if (S == 0) {
rgb.r=L;
rgb.g=L;
rgb.b=L;
} else {
rgb.r=toRgb(p1,p2,H + 120);
rgb.g=toRgb(p1,p2,H);
rgb.b=toRgb(p1,p2,H - 120);
}
rgb.r*= 255;
rgb.g*= 255;
rgb.b*= 255;

var _rgb=Math.round(rgb.r) * 256 * 256 + Math.round(rgb.g) * 256 + Math.round(rgb.b);
return _rgb;
}
function toRgb(q1,q2,hue) {
if (hue > 360) {
hue=hue - 360;
}
if (hue < 0) {
hue=hue + 360;
}
if (hue < 60) {
return (q1+(q2-q1)*hue/60);
} else if (hue < 180) {
return q2;
} else if (hue < 240) {
return (q1+(q2-q1)*(240-hue)/60);
} else {
return q1;
}
}
调用的时候生成是的6*11的矩阵

private function colors() {
for (var i:uint=0; i<6; i++) {
var _colorBlack:__color=new __color(hslToRgb(0,0,1-i*.2));
pick.addChild(_colorBlack);
_colorBlack.y=i*17;
for (var j:uint=0; j<10; j++) {
var _color:__color=new __color(hslToRgb(36*j,1,.8-i*.1));
pick.addChild(_color);
_color.x=j*17+17;
_color.y=i*17;
}
}
}



P。S。 googleRR 的时间怪怪的

关于取色器

今天下午在论坛里提了一个问题
高手真多


颜色填充问题
我在循环里生成六个矩形
这六个矩形要用不同的颜色(但是这六个颜色是渐变的)来填充
比如像这样
for(var i:uint=0;i<6;i++){
graphics.beginFill(color);
graphics.drawRect(0,0,8);
graphics.endFill();
}
里面的color要写成什么样,才能让它是渐变色。直接用RGB来表示简单,还是用HSL表示简单。
我想先让它是同色相的,比如从白的0xffffff,到灰的0xcccccc到0x999999到0x666666到0x333333最后刚好到黑的0x000000
可以了之后再加一个循环,写不同色相的渐变。
不知道我有没有把问题说清楚。麻烦各位高人指点。

里面的color要写成什么样,才能让它是渐变色???





=========================================
一牛人给了答案:

package ziv.utils {

/**
* @Class: ziv.utils.ColorUtil
* @Author ziv.yuan
* @Version: ver 1.0
* @Describe:
*
* @Usage:
*
*/
public class ColorUtil {
public static function getColorBetween(ca:Number=0xFFFFFF, cb:Number=0x0, percent:Number=0.5):Number {
var coa:Object = getColorObject(ca);
var cob:Object = getColorObject(cb);
var cre:Object = getColorObject(0);

percent = percent > 1 ? 1 : percent < 0 ? 0: percent;

cre["R"] = Math.round((cob["R"]-coa["R"])*percent) + coa["R"];
cre["G"] = Math.round((cob["G"]-coa["G"])*percent) + coa["G"];
cre["B"] = Math.round((cob["B"]-coa["B"])*percent) + coa["B"];
return cre["R"]<<16|cre["G"]<<8|cre["B"];
}
public static function getColorObject(c:Number):Object {
var rc:Object = {};
rc["R"] = c >> 16 & 0xFF;
rc["G"] = c >> 8 & 0xFF;
rc["B"] = c & 0xFF;
return rc;
}
}
}
根据百分比取中间色的类
LZ的6个颜色分别是
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 0/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 1/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 2/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 3/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 4/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 5/5);


还是不懂算法--可怜的

AS3一些网摘 关于SETTER/GETTER

从天地会一个贴子里看到的
解答了我关于SETTER/GETTER的疑惑


原文:http://www.asarea.cn/showdiary.jsp?id=155

这是我总结的一些

setter和getter的妙用
以前在写c++代码时经常在想java怎么那么傻,搞个什么setter和getter出来,既然留了门,那不就等于public么,不过最近在as里用起来,感觉有些地方还是很不错的。
A、setter或者getter一个不是普通的成员变量,假定某类中有一个sprite,我们总是要在类内部获取该sprite的高、宽,每次都***.width, ***.height岂不是很累,我们可以

private function get ...():Number{return ***.width};

以后直接...即可,代码看起来也要舒服很多。
B、setter不一定要和某成员变量联系起来,譬如

public function set data(...)...

,我们可以在set中做很多工作,譬如把data转换为我们需要的数据,根据数据刷新显示等等,不一定是要有一个data属性与之相对应!

当然还有很多,连flex的数据绑定就是setter的强大功力体现,自己慢慢体会吧


======================================


getXX()来代替 get XX(),效率也高点~

只不过带空格的,使用的时候是 xx=myClass.XX

不带空格的,使用的时候是 xx=myClass.getXX()


==================================================================

其实用private+ getter setter是为了增强封装性!
你想,如果把变量暴露给外部使用,假如后期,需求
上要对这个变量先进行些处理,那你就得改N个你
调用它的地方,而如果是用了getter和setter,那你
只要改这两个方法就可以 ...


=================================================================

要用get、set
1需要创建只读或只写属性的时候用,访问控制
2除了提供属性访问,还要做额外事情,例如计访问属性的次数、trace等等,灵活扩展
一种情况要注意
本着类不能太裸露的原则,不要滥用get、set

一个很好玩的颜色代码:

var setBtnColor:ColorTransform=new ColorTransform();


在调用函数里写:
setBtnColor.color=0x123456;
selectColor.transform.colorTransform=setBtnColor;
就可以改变名为selectColor
当然,你把0x123456换成一个变量
就可以动态改变颜色

卡在颜色这里了

从 HSL 到 RGB 的转换
给定 HSL 空间中的 (h, s, l) 值定义的一个顏色,带有 h 在指示色相角度的值域 [0, 360) 中,分别表示饱和度和亮度的 s 和 l 在值域 [0, 1] 中,相应在 RGB 空间中的 (r, g, b) 三原色,带有分别对应于红色、绿色和蓝色的 r, g 和 b 也在值域 [0, 1] 中,它们可计算為:

首先,如果 s = 0,则结果的顏色是非彩色的、或灰色的。在这个特殊情况,r, g 和 b 都等於 l。注意 h 的值在这种情况下是未定义的。

当 s ≠ 0 的时候,可以使用下列过程:

2008年9月24日星期三

《making things move》笔记(第三章)(2)

双角波形


一种思想:

设置两套数值 angle1 和 angle2,

为它们各自增加一个中心点(center)和速度(speed)值。

用一个正弦波作为一种属性,另一个正弦波作为另一种属性,比如位置或缩放。

从 Random.as 文档类开始,这里面拥有两个角度(angle),两个速度(speed)和两个中心点(center),将其中一个角(angle1)作为小球的X坐标,另一个角(angle2)作为Y坐标。运行程序时,就像只虫子在房间里飞


将ball替换成点。可以画出轨迹。

xpos=centerX+Math.sin(angleX)*range;

ypos=centerY+Math.sin(angleY)*range;

angleX+=xspeed;

angleY+=yspeed;

graphics.lineTo(xpos,ypos)


轨迹图――





圆形运动


在执行物体移动的动画时,完全可以使用余弦来代替正弦。

实际上,余弦和正弦协同工作时,才能形成一个更加有用的功能:使物体沿圆形运动

记住用正弦函数计算 y ,用余弦函数计算 x。

ball.x = centerX + Math.cos(angle) * radius;

ball.y = centerY + Math.sin(angle) * radius;

angle += speed;





椭圆运动


。如果让x和y运动的大小相同,那么就得到一个圆。如果想得到一个椭圆形,我们只需要在计算x和y位置时使用不同的半径值: radiusX 和 radiusY 。

ball.x = centerX + Math.cos(angle) * radiusX;

ball.y = centerY + Math.sin(angle) * radiusY;

angle += speed;




勾股定理


在 Flash 中,最常见的情况是我们只知道两条直角边的长度要求出斜边的长度。比如,求出两点间的距离。

dx = x2 – x1;

dy = y2 – y1;

dist = Math.sqrt(dx*dx + dy*dy);


在学到碰撞检测时,我们会发现内置的碰撞检测(hit testing)方法存在着先天不足,然后会看到使用勾股定理公式完成基于距离(distance-based)碰撞检测方法。它还非常适合用于计算重力或弹力等,因为这些力的大小与两个物体之间的距离成正比。



===========================================


本章重要公式


基本三角函数的计算:

角的正弦值 = 对边 / 斜边

角的余弦值 = 邻边 / 斜边

角的正切值 = 对边 / 邻边


角度制与弧度制的相互转换:

弧度 = 角度 * Math.PI / 180

角度 = 弧度 * 180 / Math.PI


向鼠标旋转(或向某点旋转):

// substitute mouseX, mouseY with the x, y point to rotate to

dx = mouseX - sprite.x;

dy = mouseY - sprite.y;

sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;


创建波形:

// assign value to x, y or other property of sprite or movie clip,

// use as drawing coordinates, etc.

public function onEnterFrame(event:Event){

value = center + Math.sin(angle) * range;

angle += speed; }


创建圆形:

// assign position to x and y of sprite or movie clip,

// use as drawing coordinates, etc.

public function onEnterFrame(event:Event){

xposition = centerX + Math.cos(angle) * radius;

yposition = centerY + Math.sin(angle) * radius;

angle += speed; }


创建椭圆:

// assign position to x and y of sprite or movie clip,

// use as drawing coordinates, etc.

public function onEnterFrame(event:Event){

xposition = centerX + Math.cos(angle) * radiusX;

yposition = centerY + Math.sin(angle) * radiusY;

angle += speed; }


计算两点间距离:

// points are x1, y1 and x2, y2

// can be sprite / movie clip positions, mouse coordinates, etc.

dx = x2 – x1;

dy = y2 – y1;

dist = Math.sqrt(dx*dx + dy*dy);

《making things move》笔记(第三章)(1)

我们所讨论的角度,对于计算机来说,就是弧度。

公式:

弧度(radians) = 角度(degrees) * Math.PI /180

角度(degrees) = 弧度(radians) * 180 / Math.PI


FLASH坐标系:

Flash 是基于视频屏幕的坐标系,0,0 点为左上角,如图3-4。X值从左向右不断增大,但Y轴是相反的,


正值向下,负值向上。

所以,角度的计算在 Flash 中是颠倒的。顺时针旋转角度为正角。逆时针就意味着为负角。


三角函数

ActionScript 拥有一套用于计算不同三角关系的三角函数:

正弦,余弦,正切,反正弦,反余弦和反正切







正弦(Sine)


一个角的正弦值等于该角的对边与斜边的比,在 ActionScript中,使用 Math.sin(angle) 函数来表示。(angle: 将结果转换为弧度制)


Eg: Math.sin(30 * Math.PI / 180)






余弦(Cosine)


在 Flash 中,使用 Math.cos(angle) 就可以计算余弦值,余弦的定义为角的邻边与斜边之比






正切(Tangent)


Math.tan(angle)。它反应的是对边与邻边之间的关系


在 ActionScript 中,这个函数并不常用,而使用正弦和余弦的时候要多一些。另外,反正切函数却是非常有用的,后面会讲到,这里请大家记住正切函数的比例关系。






反正弦(Arcsine)和反余弦(Arccosine)


Math.asin(ratio) 和 Math.acos(ratio)

Eg:

Math.asin(0.5) * 180 / Math.PI

Math.acos(0.865) * 180 / Math.PI




反正切(Arctangent)


反正切简单地说就是正切函数的反函数。

Math.atan(ratio)

Math.atan2(y,x),这是 Flash 的另一个反正切函数,两个参数:对边长度与邻边长度。





旋转(Rotation)




var dx:Number = mouseX - arrow.x;

var dy:Number = mouseY - arrow.y;

var radians:Number = Math.atan2(dy, dx);

arrow.rotation = radians * 180 / Math.PI;


把这段代码放入enterFrame事件里。




波形




平滑的上下运动


Math.sin(angle):

如果想让物体上下或左右移动,那么就要用到这个函数。

考虑:使用 0~1~-1~0 的变化来实现这个动画,并且反复地使用这个波形。


例如。一个球类ball

ball.y = stage.stageHeight / 2 + Math.sin(angle) * 50;

ball的Y轴在(舞台宽度)/2的上下五十范围变化


利用这些,再加上X轴方向的速度,可以完成波形运动

ball.x += xspeed;

ball.y = centerY + Math.sin(angle) * range;

angle += yspeed;


ball.scaleX = ball.scaleY = centerScale + Math.sin(angle) * range正弦波还可以在 alpha,rotation 等属性中应用。

《making things move》笔记(第一、二章)

onEnterFrame是这本书内容基础。


开始看到一个很有意思的地方:

1.创建一个新的 FLA 文件,并在舞台上绘制一些图形。

2.选中图形按下 F8 键转换为元件。

3.在转换为元件窗口中输入一个名称,并设置为影片剪辑类型。

4.选择为 ActionScript 导出。

随意输入一个类名,不必担心没有这个类,然后点击确定。这个地方很有趣,Flash 找不到这个类,它就会自动生成一个类,并对其进行编译。并不是说 Flash 会创建一个 ActionScript 类文件,但它会在 SWF 中,生成一串字节代码表示一个继承自 Sprite 或 MovieClip 的类。

如,你的类名为 Ball。在文档类或时间轴上,可以这么写:

var ball:Ball = new Ball(); addChild(ball);

这样就在舞台上创建了一个库中的元件


以前我也会这么用。但都是多此一举再建一个空类。原来根本不需要。




--------------------------------

第一、二章讲的都是基础。比较简单。

--------------------------------

2008年9月17日星期三

Flex登陆框实例

" layout="absolute" creationComplete="initApp()">



























2008年9月16日星期二

生成验证码代码

算法:使用FOR循环生成四次随机数。如果随机数是偶数,转化为一个数字。反之,转化为一个字母。
private function GenerateCheckCode():String{
var ran:Number
var number:Number
var code:String
var checkCode:String=""
for (var i:int=0;i<4;i++){
ran=Math.random()
number=Math.round(ran*10000)
if(number%2==0)
code=String.fromCharCode(48+(number%10))
else
code=String.fromCharCode(65+(number%26))
checkCode+=code
}
return checkCode
}

完全手册 FLEX3.0 RIA开发详解 笔记1

ALT+/ 打开代码提示添加注释:

第十四章 FLEX常用组件P180
1.按扭组件Button
2.下拉框组件ComboBox应用于选择一项数据源。属于多值组件eg:有XML id="myXML" 则 dataProvider="{myXML.item.@label}"labelField属性指明下拉框数据绑定至数据源的某一字段,配合dataProvider使用 dataProvider="{myXML.item}" labelField="lable"
3.图象组件Image
4.标签组件Lable显示单行文本
5.多行文本组件TextArea
6.输入框组件TextInput
7.文本编辑组件RichTextEditor
FLEX3.0中不能生成新页面,可以生成新状态(State)

2008年9月12日星期五

2008年9月11日星期四

变成FLEX啦

至今天可以说写AS3两个月了刚好两个月。觉得学得挺烂的。公司的一个项目,源代码在我手上,前前后后研究了好久,看得懂但是死都写不出来。这段时间觉得停在一个地方,进不了。主要是自己太懒了。书也没看代码也没写。经理说让我写一个模板,我来负责这一块的。好在刚开始还有一个人带我。好在这个项目不会急。不然我就上树了。
经理今天下午给了我一本书。借我。不是给我。FLEX3.0的。我不知道拿来干麻。我要先学习一下。
那么学习吧。

2008年9月4日星期四

创建BitmapData对象

8.1 创建BitmapData对象
var bitmap:BitmapData=new BitmapData(100,100,true,0x00ffffff)
//添加到显示列表中.addChild( ) 方法添加的对象必须是flash.display.DisplayObject的子类才行,
而BitmapData 类继承自Object,所以不能直接加到列表中。要加到可视化对象列表中,可使用flash.display.Bitmap类,它是DisplayObject.类的子类,实际上是
BitmapData的一个包装类,允许BitmapData可被显示。
var image:Bitmap=new Bitmap(bitmap)addChild(image)
8.4问题我要载入外部图片作为BitmapData处理
解决办法使用flash.display.Loader 类载入图片,当图片载入完成时,通过loader的content 属性property,它就是个Bitmap。访问Bitmap的bitmapData 属性就在访问载入的图片
讨论通过Loader类载入外部位图。通过URLRequest 对象和位图的URL,监听loader的complete事件确定是否载入完成:
package {import flash.display.Sprite;import flash.display.Loader;import flash.events.Event;import flash.net.URLRequest;public class BitmapLoader extends Sprite {private var _loader:Loader = new Loader( );public function BitmapLoader( ) {_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);_loader.load(new URLRequest("image.jpg"));}}}public function onComplete(event:Event):void {var image:Bitmap = Bitmap(_loader.content);var bitmap:BitmapData = image.bitmapData;addChild(image);}
Bitmap(bitmapData:BitmapData = null, pixelSnapping:String = "auto", smoothing:Boolean = false)
初始化 Bitmap 对象以引用指定的 BitmapData 对象。