mc的onKeyDown/onKeyUp事件

我一直在使用下面的代码响应按键:
var obj = new Object();
obj.onKeyDown = function() {
trace("key down");
};
obj.onKeyUp = function() {
trace("key up");
};
Key.addListener(obj)
//你可以把obj换成你喜欢的任何对象
实际上mc就有onKeyDown/onKeyUp事件的。原则上我们可以通过mc.onKeyDown=function(){...}这样的代码来定义mc的onKeyDown事件,根据帮助,这样定义的前提是必须设置焦点在mc上,需要采用下面的代码设置焦点在mc上:
mc.focusEnabled = true;
Selection.setFocus(mc);
这样,所有的代码就变成下面的样子了:
mc.focusEnabled = true;
Selection.setFocus(mc);
mc.onKeyDown=function(){
trace("key down");
}
测试一下,怎么没有效果?我当初就是这样发现他有点问题的。
跟pawaca讨论了一下,经过更深入的测试,我们得出这样的讨论结果:
首先应该肯定mc确实是有onKeyDown/onKeyUp事件的(也就是说帮助上面提供的信息是正确的),那问题出在哪里呢,假如你的计算机也跟我的计算机一样反应迟钝的话,你就会在发布的一瞬间看到黄色的框框(没错,这个黄色的框就是flash里面默认的焦点框),这就是说,焦点实际上也被设置在mc上了(也就是说设置焦点的那两行语句是没有问题的),当你移动鼠标的时候就会发现黄色的焦点框从屏幕消失了,原来鼠标这个东西很特殊,在这个例子里面,鼠标只要一移动就会将焦点从mc“转移”到鼠标上来(pawaca箴言:别相信Selection.getFocus()),当mc失去焦点,mc的onKeyDown/onKeyUp也无法响应了。
建议大家等待flash9的mouseFocus,以便解决这个问题。
测试使用的flash版本:macromedia flash mx 2004 7.0.1试用版
测试使用的flash播放器:flashplayer 8(具体版本我没有看清楚)

【翻译】SWF结构规范第四章:显示列表(四)

PlaceObject2
字段 类型 注释
Header RECORDHEADER 标签类型=26
PlaceFlagHasClipActions UB[1] 适用于Flash 5及以后的版本:含有ClipActions字段
(仅用于精灵),否则始终为0
PlaceFlagHasClipDepth UB[1] 有ClipDepth字段
PlaceFlagHasName UB[1] 有Name字段
PlaceFlagHasRatio UB[1] 有Ratio字段
PlaceFlagHasColorTransform UB[1] 有ColorTransform字段
PlaceFlagHasMatrix UB[1] 有Matrix字段
PlaceFlagHasCharacter UB[1] 放置有角色
PlaceFlagMove UB[1] 定义一个被移动的角色
Depth UI16 角色的深度
CharacterId 若PlaceFlagHasCharacter为真,
则类型为UI16 角色ID
Matrix 若PlaceFlagHasMatrix为真,
则类型为UI16 转换矩阵数据
ColorTransform 若PlaceFlagHasColorTransform为真,
则类型为CXFORMWITHALPHA 颜色转换数据
Ratio 若PlaceFlagHasRatio为真,
则类型为UI16
Name 若PlaceFlagHasName为真,
则类型为字符串(STRING) 角色的名称
ClipDepth 若PlaceFlagHasClipDepth为真,
则类型为UI16 影片深度(参看剪辑层)
ClipActions 若PlaceFlagHasClipActions为真,
则类型为CLIPACTIONS 适用于Flash 5及以后的版本:
影片脚本数据

影片脚本仅对被放置的精灵角色有效,它为精灵定义了事件处理器。
CLIPACTIONS
字段 类型 注释
Reserved UI16 必须为0
AllEventFlags CLIPEVENTFLAGS 剪辑脚本中的事件
ClipActionRecords CLIPACTIONRECORD[一个或更多] 单独的事件处理器
ClipActionEndFlag 若SWF版本小于等于5,
则类型为UI16
若SWF版本大于6,
则类型为UI32 必须为0

CLIPACTIONRECORD
字段 类型 注释
EventFlags CLIPEVENTFLAGS 事件处理器运用于的事件
ActionRecordSize UI32 从该字段结束至下一
CLIPACTIONRECORD
(或ClipActionEndFlag)
的字节偏移量
KeyCode 若EventFlags包含
ClipEventKeyPress,
则类型为UI8;
否则没有KeyCode字段 按下的键盘码(参看BUTTONCONDACTION)
Actions ActionRecord[一个或多个]

【翻译】SWF结构规范第四章:显示列表(三)

显示列表标签
Display List Tags


显示列表标签用于给显示列表添加角色和角色的属性。
PlaceObject
PlaceObject标签为显示列表添加一个角色。CharacterId决定往显示列表中添加的角色,Depth字段决定深度层,Matrix字段指定角色的位置,比例和旋转度。若PlaceObject标签超过了转换矩阵的限度,则会为记录附加一个ColorTransform字段。
这就为角色具体指定了一个颜色效果(比如透明度),一个角色可以被多次添加入显示列表,只要他们含有不同的深度和转换矩阵。
注意:PlaceObject标签很少用于SWF 3及以后的版本,在SWF 3和以后的版本中,PlaceObject由PlaceObject2取代。
所支持的最小文件版本是SWF 1。
PlaceObject
字段 类型 注释
Header RECORDHEADER 标签类型=4
CharacterId UI16 被放置的角色的ID
Depth UI16 角色的深度
Matrix MATRIX 转换矩阵的数据
ColorTransform(可选) CXFORM 颜色转换的数据
PlaceObject2
PlaceObject2扩展了PlaceObject标签的功能,PlaceObject2标签可以给显示列表添加角色或者修改已经处于显示列表中的角色的属性。Flash 4和flash 5中PlaceObject2标签稍微有些改变,Flash 5加入了剪切动作(clip actions)。
标签开始于一组标记,这些标记指出现有哪些字段在标签内。可选字段为CharacterId,Matrix, ColorTransform,Ratio,ClipDepth,Name和ClipActions,只有Depth是唯一一个一直需要的字段。
深度值控制了显示的角色的层次。低深度的角色在高深度的角色之下。深度为1的角色显示于最底处。显示列表种可以有多个相同的角色,但它们必须处于不同的深度,一个深度只能容纳一个角色。也就是说,角色可以由自己的深度来标明(因此CharacterId是可选项)
PlaceFlagMove和PlaceFlagHasCharacter指出一个新的角色是否被添加入显示列表,或显示列表中的一个角色是否被修改。这两个标记的含义如下:
• PlaceFlagMove = 0并且PlaceFlagHasCharacter = 1
一个新的角色(带有ID或CharacterId)被指定具体的深度并且放置于显示列表。其他字段设置新角色的属性。
• PlaceFlagMove = 1并且PlaceFlagHasCharacter = 0
指定深度的角色被修改。其他字段修改这个角色的属性。因为一个深度只能含有一个角色,所以CharacterId为可选字段。
• PlaceFlagMove = 1并且PlaceFlagHasCharacter = 1
指定深度的角色被移除,同时新角色(带有ID或CharacterId)被放置于该深度。其他字段设置新角色的属性。
比如一个在几帧之内做运动的角色,它的PlaceFlagHasCharacter在第一帧被设置,之后的几帧PlaceFlagMove被设置。第一帧时该角色被放置在指定的深度,然后初始化转换矩阵,之后的几帧仅仅替换该角色的转换矩阵即可。
PlaceObject2标签的可选字段有如下含义:
• CharacterId字段指定被添加入显示列表的角色。只有在添加新角色时使用。如果已经在显示列表的角色被修改了,则会缺少CharacterId字段。
• Matrix字段指定了添加或者修改的角色的位置,比例,旋转度。
• ColorTransform字段指定了添加或者修改的角色所运用的颜色效果。
• Ratio字段指定了添加或修改的对象的形素比(morph ratio),仅当该角色定义DefineMorphShape时该字段才会有用。并且控制形素进行的程度。若为0则在形态的开始就显示。ratio值为65535,则角色在形态结束时显示。在0至65535之前的值,flash Player会在形状开始和形状结束之间修改,并且显示一个中间形状。
• ClipDepth字段指定了被放置的角色遮住的最大深。ClipDepth为0则表示该角色不是一个剪切角色(clipping character)。
• Name字段指定添加或者修改的角色的名称,该字段仅用于精灵(sprite)角色。为SetTarget动作标识精灵。它允许主影片(或者其他精灵)在精灵内部执行动作(参看精灵和影片剪辑)。
• ClipActions字段,仅用于放置精灵角色,定义多个事件处理器。
所支持的最小文件版本是SWF 3。

【翻译】SWF结构规范第四章:显示列表(二)

剪辑层
Clipping Layers


显示列表中有一种特殊的角色被叫做剪辑层(clipping layer),它不会显示,而是会剪切(遮住)其上的角色。PlaceObject2的ClipDepth字段指定由剪辑层遮住的最大深度。假如一个形状的深度是1,而clipDepth的值为4,所有的深度都大于1,包括深度4,但深度4仍会被深度1的角色遮住,而深度4以上的角色不会被遮住。


使用显示列表
Using the Display List


下面是创建一个flash动画的过程:
1 用定义标签定义每个角色,每个角色都被赋予唯一的一个ID,并被添加入字典。
2 通过PlaceObject2标签将每个角色添加入显示列表。PlaceObject2标签指定了要显示的角色,有下面的属性:
■ depth值,该值控制了显示的角色的层次。低深度的角色在高深度的角色之下。深度为1的角色显示于最底处。显示列表种可以有多个相同的角色,但它们必须处于不同的深度,一个深度只能容纳一个角色。
■ transformation matrix属性。该属性定义了要显示的角色的位置,比例,系数,角度,旋转值。不同transformation matrix属性的同一个角色可能会被放置多次(在不同的深度)。
■ 可选的color transform属性。具体指定了被放置的角色所运用的颜色效果。颜色效果包括透明度和颜色转换。
■ 可选的name字符串。为SetTarget定义了角色。SetTarget用于在精灵内执行脚本。
■ 可选的ClipDepth值。指定被放置的角色遮住的最大深度。
■ 可选的ratio值。控制形素对象被放置时如何显示。若为0则在形态的开始就显示。ratio值为65535,则角色在形态结束时显示。
3 通过ShowFrame标签将显示列表的内容呈递给屏幕。
4 通过PlaceObject2标签修改显示列表中的每一个角色。PlaceObject2会在角色被分配与深度的同时分配给它一个新的转换矩阵(角色ID无需指定,因为每一个深度只有一个角色)。
5 通过ShowFrame标签在新的位置显示角色。步骤4和步骤5反复进行,保证了帧动画的进行。
注意:如果一个对象在每一帧都没有改变,也就没有必要在每一帧都重新替换它。
6 通过RemoveObject2标签移除显示列表中的所有角色,只需要被移除角色的深度值,以便标识被移除的角色。

【翻译】SWF结构规范第四章:显示列表(一)

SWF结构规范已经在图书下载专题中提供下载。

这里仅公布去年翻译的SWF结构规范第四章:显示列表。

正文:
SWF文件的每一帧的显示都需要经过三个过程:
1 对象被定义标签(definition tags)定义(定义标签包括DefineShape,,DefineSprite等)。每个对象都有一个唯一的ID,该ID被叫做角色(character),存储在被叫作字典(dictionary)的库中。
2 被选中的角色从字典中拷贝,之后置于显示列表(display list),该列表内含有下一帧将要显示的所有对象。
3 上面两个过程一旦完成,显示列表中的内容就会通过ShowFrame标签呈递给屏幕。显示列表中的所有对象都含有一个深度(depth)值,深度决定了对象的排列层次。低深度的角色在高深度的角色之下。深度为1的角色显示于最底处。显示列表种可以有多个相同的角色,但它们必须处于不同的深度,一个深度只能容纳一个角色。
在SWF 1和2中,显示列表结构简单,包含了屏幕上此时显示的所有对象。SWF 3和之后的版本中显示列表是有层次的,显示的对象仍然可以有一个关于其子对象的列表。详情请参考DefineSprite。
• PlaceObject 在显示列表中添加一个角色
• PlaceObject2 在指定的深度添加或修改角色
• RemoveObject 从显示列表移除指定的角色
• RemoveObject2 从指定的深度移除角色
• ShowFrame 将要显示的内容呈递给显示列表
注意:PlaceObject和RemoveObject是较旧的标签,已经很少在SWF 3以及后面的版本中使用了。
下表说明了显示过程,首先定义三个对象,一个形状(shape),一个文本对象(text object)和一个精灵(sprite)。这些对象被赋予ID并储存在字典中。角色1(形状渐变)放在深度1,当这一帧出现时它将被其他对象所掩盖。角色2(文本对象)被放置了两次,一次在深度2,一次在深度4。角色3(精灵)在深度3。

解决对象无法访问主场景函数方法举例

经常会遇到这种情况,就是对象内部无法访问主场景的自定义函数。
比如下面的代码:
//AS in _root
function test(n){
trace("n: "+n);
}
//AS in frame 1 of symbol a
test(20);
//output窗口为空。
这是为什么呢?因为在对象内部调用函数的时候,对象会首先在自己的函数列表中查找,如果找到了相应的函数,就会调用,如果没有找到,就会进一步到toplevel function中寻找。即顶级函数,顶级函数的调用是不需要前缀的。
(more)

Void与void的差别

Void和void同是flash中的关键字,但是他们之间存在差别。
首先Void是一种特殊的类型,因此函数可以是Void型的。之所以说Void特殊,是因为没有Void型的变量。
比如下面的代码:
var k:Void;
//error:A variable may not be of type Void.
Void型的函数表示不返回任何类型的对象。
function myfunc(Void):Void {
}
假如有看过as2lib包内的类文件,里面经常可以看到类似上面的语句,参数为Void表示无参数。
void很少单独使用(我想应该有单独使用的例子,但是很遗憾我没有找到),void(x)表示忽略x的值返回undefined。
如果函数参数省略Void:
function myfunc():Void{
trace(arguments[0]);
}
myfunc(12);
//output:12
则可以接受任何参数,而且个数不限。有时为了模拟方法重载所以会省略Void

AS脚本类关联mc的一个问题

该问题的后果就是,对于被关联的类的私有成员,可以不被限制地加以利用。在类外或者在类内。
(more)

construct事件

去年时候发表的文章,关于flash中的隐藏construct事件:
construct事件是组件用来传递参数的,当我们在component definition面版设置好参数(或者利用Inspectable),我们在制作工具中修改了该参数的值,那么这个值就是通过construct事件传递回去的。


另外需要注意的是no instance name assigned这一行字,应该说既然是onClipEvent事件,应该存在于某个mc上,而从debugger面版返回的信息来看,其实这段代码没有加在任何地方(包括帧上)。朋友们有好多很好的回复,但是因为我找不到了,非常抱歉没有能够转过来 (more)

UIObject研究之准备(2):CSSStyleDeclaration

CSSStyleDeclaration位于mx包的styles内。
一开始该类就引入了mx.styles.CSSTextStyles,mx.styles.StyleManager两个类。
首先大概的讲一下CSSTextStyle。该类也是一个静态类,并且只有一个静态方法addTextStyles。其作用就是给一个指定的对象添加textAlign,fontWeight,color,fontFamily,textIndent,fontStyle,marginLeft,marginRight,fontSize,extDecoration,embedFonts伪属性。他使用了addProperty方法。其实原理都是类似的。设置的都是o对象的_tf内的对应属性。简单的说,就是该类接受一个对象,并且为该对象的添加一系列伪属性(就是上面的textIndent那些) (more)

UIObject研究——准备工作(1):StyleManager


首先还是需要做两个准备工作:第一步就是阅读StyleManager的源代码。
该类位于mx包的styles下。打开他以后首先看到的是Macromedia的废话版权说明…………略过略过…………
接下来大家看到的该类所定义的各种属性,需要说明的是StyleManager是一个静态类,他的实际作用就是管理各种颜色和风格属性。根据Macromedia在该文件一开始的说明,CSS风格中也使用了该类。该类为各种需要提供省缺风格。同时该类也提供了7个接口。接下来我回一点一点说明。 (more)

奇怪的constructor

首先这是一个关于constructor的问题(最近我发现的关于constructor的问题实在太多了...)从mhiguera的blog上看到,constructor()方法在子类方面的表现实在是不太好。 (more)

flash模拟inner classes

thinking in java中翻译inner classes做内隐类。意指那些定义在类中的类。但是AS并不支持inner classes,mhiguera提出利用AS1.0的prototype来模拟inner classes,下面为他的类代码: (more)

bug(3)flashMX中的constructor的问题

该问题只表现在flashMX中,因为AS1.0没有完全的类的概念,所以也没有区分类方法。
function myclass() {}//构造一个新的myclass类
trace(myclass.constructor("www.cn-flash.com"));//通过trace调用myclass的构造函数
可是结果竟然是www.cn-flash.com
目前为止,我仍然不能对此做出一个很好的解释:)姑且算是一个bug把,在mx2004下,不能通过myclass直接访问constructor()方法了(MM终于也认识到了这个问题哈),而且也不会出现这个bug了。不管怎么说,修改好了就是好的:)

bug(2)onRelease事件?脱离mc响应

class someComponent{
private var prop:String="www.cn-flash.com";
function onRelease():Void{
trace(prop);}
} (more)

job post

none

Calendar

<< September 2010 >>
SunMonTueWedThuFriSat
   1234
567891011
12131415161718
19202122232425
2627282930  

Search


Last comments

夏思 says 2010年最新股民资源,最新一手股民资源,Q Q 9 7 8 5 7 1 9 1 9...

PearsonNell says People deserve very good life time and <a...

MarcyHouston says All people deserve wealthy life and <a...

hV35Chloe says When people stuck with argument essay creating, hence I would propose to buy custom...

Yardley says Best site in world. I am from Botswana and know bad English, please tell me right I...