Adobe的JSON转换类还不够完美

JSON格式的数据还是很方便的,在JavaScript中使用非常广泛。因此在Flash和JavaScript的交互中,使用JSON格式把数据传递给Flash也是一个很不错的选择。不过用AS3(ActionScript 3)来解析JSON是个麻烦的事情,还有有Adobe有相关的API——有一个com.adobe.serialization.json包,可以用来解析JSON格式的数据,并转换成和JS中类似的对象。

这个包使用起来非常简单,如下:

// 这是JSON格式的数据
var str:String = '{ "firstName": "Brett", "lastName":"McLaughlin", "email": "[email protected]" }';
// 转换为对象
var obj:Object

在AS3中设置ComboBox的字体和宽高

我基本不用组件的,偶尔为了速度还是需要用一下组件,没想到AS3里的组件变化也非常的大,设置一个ComboBox的属性也够麻烦的。先看看效果:

在AS3中,要设置ComboBox的字体类型和字体大小也要用TextFormat,而且很麻烦的是要分别对TextField和dropdown设置该TextFormat,最诡异的是设置dropdown的宽和高,ComboBox有个dropdownWidth属性,却没有对应的dropdownHeight属性,而是要使用dropdown的rowHeight属性,真是够BT的……具体看下面的代码吧!

// combox 是一个ComboBox组件(Component)
// 设置它的宽度和高度
combox.width = 300;
combox.height = 48;
// 添加几个选项
combox.addItem({data:1,label:'测试项目一'});
combox.addItem({data:2,label:'测试项目二'});

AS3:DoubleClick事件的缺陷?

如果一个MC,里面只有Shape(一个或则多个均可),没有其他MC,那么只要设置它的doubleClickEnabled属性为true,它可以很正常地接收DOUBLE_CLICK事件。那么,现在的问题是这样的:有这样一个MC,假设其实例名称为parentMC,里面含有一个或多个MC,继续假设其中有一个名称为aMC,那么当设置parentMC的doubleClickEnabled属性为true时,它并不可以接收DOUBLE_CLICK事件,但是如果设置其中的aMC的doubleClickEnabled属性为true时,他们都可以接收DOUBLE_CLICK事件。更为奇怪的是,如果你同时为parentMC和aMC添加DOUBLE_CLICK事件侦听,当双击时居然会触发两个DOUBLE_CLICK事件!

无法接收DOUBLE_CLICK事件的代码:

parentMC.doubleClickEnabled

Flash CS 3的两个BUG?

首先是格式化脚本的一个bug,会去掉部分表达式中的括号。本来写得好好的没有任何问题,改来该去后为了代码好看,格式化了一下代码,结果发现结果不正常了,仔细检查了一下代码,发现是格式化后改变了我的正确代码。

正确代码是这样的:

controler.x = (w – controler.width) / 2;

格式化后成这样了:

controler.x=w – controler.width / 2;

这样不出错才怪……

第二个是关于右键菜单的,在Video对象上点击右键不会触发相关事件。具体是这样的,我有一个Player类,继承自MovieClip,在这个类里面我是直接new了一个video,然后直接this.addChild(video),在播放时发现在视频上点右键菜单并不会触发相应的右键菜单事件,而在其他MC上可以触发。…

AS3:新的全屏模式下保持其他MC清晰

在Flash Player 9.0.115.0以后的版本中,可以使用新的全屏模式,并启用硬件加速进行全屏渲染。在测试的过程中,发现当以视频原始大小为矩形进行全屏硬件加速时,播放控制栏会变得很模糊。后来分别使用了几个高清的FLV进行测试,使用1080P的FLV文件(1920×1080)时,播放控制栏会相对变小;使用720P的FLV文件(1280×720)时,播放控制栏大小不变,此时的屏幕宽度我我的显示器分辨率相同;使用480P的FLV文件时,播放控制栏会放大。依据此现象,发现可能要求加速矩形宽高与屏幕分辨率一致,于是把加速矩形改为屏幕分辨率,分别使用不同的FLV文件测试,果然好了。

代码如下:

var scalingRect:Rectangle = new Rectangle(0,0,Capabilities.screenResolutionX,Capabilities.screenResolutionY);

AS3:双击及手形鼠标指针

以前在AS2中,只要为MC指定onRelease或者onRollOver等等点击事件,当鼠标移到MC上时,鼠标就变成手形了,完全不用管。在AS3中改变了这一规则,你首先得用addEventListener添加事件,添加完事件之后,鼠标移到MC上依然是默认的箭头形状。要改变这个形状,还需要指定MC的buttonMode属性为true:

myMC.buttonMode = true;

AS3中支持双击事件,不过要启用这个双击事件就得指定另外一个属性——doubleClickEnabled为true:

myMC.doubleClickEnabled = true;

不过,需要注意的是,如果你这个MC同时有单击事件和双击事件那么在双击的第一下会触发单击事件,而第二下则不回触发单击事件~…

AS3:onLastSecond or onPlayStatus?

检测FLV是否播放完成,在Flash CS3的帮助文档中有onPlayStatus的说明,其返回的信息对象可能的值有两个,一个是 NetStream.Play.Switch,还一个是NetStream.Play.Complete。结果在client的事件中写上onPlayStatus,发现在编辑器中这个事件名称居然还是黑色,而不是和onMetaData一样的蓝色!如果此时加上trace(info.code),在FLV播放完成后还会报错,错误信息中冒出来一个onLastSecond。在帮助文档中查了一下这个事件,居然没有任何介绍。

既然onPlayStatus不管用,不妨试试onLastSecond,这个事件名称还是黑色,写上trace(info.code),结果FLV播放完成之后trace出来一个undefined,看来NetStream中还真有这个事件,但是为什么文档中没有任何介绍呢?

不管怎样,总算还能用onLastSecond检测FLV播放完成,不过这应该不是什么好方法………

AS3中有趣的event.localX属性


在上面的这个图片中,现在那个绿色的矩形(绿线)长度为250,这条绿色的线是一个MovieClip,若其原长度为250,那么用event.localX获得的值将在0到250之间;但是如果其原长度为400,那么用event.localX获得的值将会在0到400之间,而与该MC在影片中的实际长度无关。

不过这样也还好,获取事件触发的x坐标占这个MC长度的百分比依然很简单,直接用除以MC的原长度就行了。…

AS3控制FLV的音量方法(不用组件)

在AS3中,NetStream类有这样一个属性:soundTransform,可以用来控制FLV的声音,其实现为:

实现
public function get soundTransform():SoundTransform
public function set soundTransform(value:SoundTransform):void

SoundTransform类又有个volume属性,于是想是不是直接这样写就行了:

var volumeSize:Number = 0.2;
ns.soundTransform.volume = volumeSize;

结果丫的没任何反应……莫非必须重新为ns指定一个soundTransform对象?于是改成这样:

var volumeSize:Number = 0.2;
var st:SoundTransform = new SoundTransform(volumeSize,0);
ns.soundTransform

暂停Flash中的所有MC

这几天在被Flash玩(还没到玩Flash的境界),在flash中写了个自定义右键菜单,其中有个暂停功能,本来以为来个简单的stop()就够了,结果发现不是那么回事,所有MC仍在继续播放……看来只有一个一个地停止所有MC了,但是这个工作显然不能人工搞定,程序吧。由于MC里面嵌套有MC,只有用递归才是比较好的办法。先找出目标MC中的所有MC,然后一个一个地stop。这样想清楚了,其实代码也很简单:

function stopAllClips(target:MovieClip) {
for (var mc in target) {
var objMC = target[mc];
if (objMC instanceof MovieClip) {
objMC.stop();
stopAllClips(objMC);
}
}
target.stop();
}

同样,播放所有MC的function和这个也是一样的。不过,还是有一点点问题,貌似duplicate出来的MC不能停止,不知道有没有什么办法?不过我的那个Flash中不暂停也蛮好的,本来就是用来做背景的,呵呵~~…