一、何谓"多态按钮"
在各种多媒体产品的图形用户界面中,多态按钮都拥有非常广泛的应用。所谓的"多态",即对于鼠标的不同操作可以有不同的响应方式,这些方式表现为按钮或鼠标形态的改变,同时发出提示声音或给出提示画面,并且执行相应的操作。总之,一个完整的多态按钮能够响应用户的不同操作并完成各种指定的任务。
二、多态按钮的功能
一个多态按钮的主要功能包括:
* 鼠标进入后按钮本身呈掠过状态。
* 鼠标点击时按钮本身呈按下状态。
* 按钮被成功点击后执行相应的命令。
* 当鼠标位于按钮内部时改变光标形态,离开按钮时恢复光标形态。
* 在整个过程中会有操作提示音(或提示画面)。
三、多态按钮行为的编写
新建一个剧本演员,命名为"Multistate Button Behavior",不要忘记将其属性更改为"Behavior"。
首先,我们需要声明即将使用的属性变量。
property pNormalMember -- 用来存储按钮的正常状态。
property pUseRolloverSound, pRolloverSound -- 掠过按钮时是否发出声音,使用的声音演员。
property pUseRolloverMember, pRolloverMember -- 掠过按钮时是否改变演员,改变后的演员。
property pUseDownSound, pDownSound -- 按下按钮时是否发出声音,使用的声音演员。
property pUseDownMember, pDownMember -- 按下按钮时是否改变演员,改变后的演员。
property pCustomGuide -- 成功点击按钮后所执行的自定义导航命令。
property pUseChangeCursor -- 是否根据鼠标与按钮的不同位置改变鼠标的形态。
property pChangeCursor -- 改变后的鼠标形态。
下面的getPropertyDescriptionList函数看起来好像非常复杂,其实无非是给需要使用的属性变量构建参数对话框,每一项参数都拥有#comment、#format和#default这三个必需的部分。
on getPropertyDescriptionList me
myList = [:]
addProp myList, #pUseRolloverSound, [#comment: "Use Rollover Sound", #format: #boolean, #default: TRUE]
addProp myList, #pRolloverSound, [#comment: "Rollover Sound", #format: #sound, #default: ""]
addProp myList, #pUseRolloverMember, [#comment: "Use Rollover Member", #format: #boolean, #default: TRUE]
addProp myList, #pRolloverMember, [#comment: "Rollover Member", #format: #bitmap, #default: ""]
addProp myList, #pUseDownSound, [#comment: "Use Down Sound", #format: #boolean, #default: TRUE]
addProp myList, #pDownSound, [#comment: "Down Sound", #format: #sound, #default: ""]
addProp myList, #pUseDownMember, [#comment: "Use Down Member", #format: #boolean, #default: TRUE]
addProp myList, #pDownMember, [#comment: "Down Member", #format: #bitmap, #default: ""]
addProp myList, #pCustomGuide, [#comment: "Custom Lingo", #format: #string, #default: ""]
addProp myList, #pUseChangeCursor, [#comment: "Use Change Cursor", #format: #boolean, #default: TRUE]
addProp myList, #pChangeCursor, [#comment: "Change Cursor", #format: #cursor, #default: ""]
return myList
end
这里需要注意一下#format和#default的取值。
#format的取值多种多样,但主要可以分为两类:
1. 数据类:包括#integer、#float、#string、#symbol和#boolean等。
2. 非数据类:包括#member(也可以具体写出#member的类型,例如#bitmap即表示位图演员)、#frame、#marker和#ink等。
而#default的取值则可以是数字、布尔值(TRUE或FALSE,仅当#format为#boolean时)或字符串。一般情况下,#default的取值是依赖于#format的,但要求也不是很严格,毕竟#default只是为属性列表的每个属性提供一个缺省值,最终的使用值还是需要我们自己在参数对话框中指定。
其实#default还可以指定为VOID,以表示没有合适的缺省值,但并不推荐使用,原因在于:
1. 数字、布尔值和字符串已经几乎可以囊括#default所有的取值情况,并不需要再增添一个VOID。
2. 如果getPropertyDescriptionList函数返回的属性列表中有任何一个属性的缺省值被指定为VOID,则在使用runPropertyDialog函数时系统会报错。
下面我们添加runPropertyDialog函数。其实在这里并没有什么使用runPropertyDialog函数的必要,仅仅是为了熟悉它。
on runPropertyDialog me, myList
setProp myList, #pCustomGuide, "go to frame 5"
pass
return myList
end
接着是isOKToAttach命令、getBehaviorDescription函数和getBehaviorTooltip函数。
on isOKToAttach me, spriteType
if spriteType = #script then
return FALSE
else
return TRUE
end if
end
-- isOKToAttach函数使行为可以在帧剧本通道外的任何地方使用。
on getBehaviorDescription me
return "MULTISTATE BUTTON"&RETURN&"This is a custom behavior." -- 利用RETURN(相当于回车换行)将两个字符串联系起来,增加了可读性,而且通过RETRUN的协助,使得添加更为复杂的描述信息成为可能。
end
on getBehaviorTooltip me
return "Multistate Button" -- 注意这里的字符最好不要太多,以免影响"Tooltip"的可读性。
end
现在我们开始编写行为的主体代码。这里涉及到了几乎所有的鼠标事件,注意区别它们发生的条件和作用。
on beginSprite me
pNormalMember = sprite(me.spriteNum).member -- 在按钮角色首次出现在舞台上时将其对应的正常状态下的演员存储到属性变量pNormalMember中。
end
on mouseEnter me
if pUseRolloverSound then
sound(1).play(member(pRolloverSound)) -- 如果在参数对话框里选择了"使用掠过声音",则播放选定的声音。
end if
if pUseRolloverMember then
sprite(me.spriteNum).member = pRolloverMember -- 如果在参数对话框里选择了"使用掠过演员",则将当前按钮角色使用的演员更换为选定的演员。
end if
if pUseChangeCursor then
cursor(pChangeCursor) -- 如果在参数对话框里选择了"改变鼠标",则将当前鼠标形态改变为选定的鼠标形态。
end if
end
on mouseLeave me
sprite(me.spriteNum).member = pNormalMember -- 恢复按钮角色对应的演员为正常状态下的演员。
cursor(0) -- 鼠标复位。
end
on mouseDown me
if pUseDownSound then
sound(1).play(member(pDownSound)) -- 如果在参数对话框里选择了"使用按下声音",则播放选定的声音。
end if
if pUseDownMember then
sprite(me.spriteNum).member = pDownMember -- 如果在参数对话框里选择了"使用按下演员",则将当前按钮角色使用的演员更换为选定的演员。
end if
end
on mouseUp me
sprite(me.spriteNum).member = pRolloverMember -- 鼠标仍位于按钮之上,所以应该将按钮角色对应的演员更换为"掠过演员"而不是"正常演员"。
cursor(0)
do pCustomGuide -- 执行自定义的导航命令,例如我们在runPropertyDialog函数中指定的"go to frame 5"。
end
到此为止,一个完整的多态按钮行为就写好了。只要将其指定给需要的演员并调整好相应的参数就可以正常工作了。如果在编写过程中遇到了什么困难,可以参考附件里的样本影片。
相关附件
