|
?8 _4 c% a+ A4 M5 B
8 {- K E. _' i% e+ L4 d % [, L' A. t/ c
Fireworks MX已经推出一段时间了,从此次的升级可以看出,Macromedia的三剑客在WEB程序方面变得越来越强大,Fireworks MX在WEB应用方面的作用也在继续扩展,现在Fireworks MX插件已经是标准的MXP文件,Extention Manage可以直接管理Fireworks MX的插件。) R) T0 N% A) X4 I
Fireworks MX的插件更多的是依靠JavaScript程序来进行扩充,Fireworks MX中的每个功能基本都可以通过相应的JavascriptAPI来访问到,开发人员可以使用Javascript自己编写复杂的Commands命令来自动完成一些软件所没有提供的功能,或者将一些复杂的步骤封装在一起以方便普通用户的使用,同时也可以扩充软件原本没有的功能。 现在Macromedia支持在Flash MX中开发扩充的插件,结合Flash强大的Action编程功能,开发人员可以做出漂亮的界面,并将其Command命令封装到SWF文件中,最后结合XML文件,封装成为标准的MXP格式文件,这样我们就可以在Fireworks MX中很方便地安装插件了。 其实Fireworks MX已经内置了多个用这种方法封装的命令,举个例子,很多朋友以为新扩充Align命令是原有命令的扩充,其实不然,原有的Align面版仍旧在Modify菜单中,而Window菜单下的Align其实就是新开发的用SWF封装的新的扩充命令。$ I. N/ z, t$ G1 B0 W. }0 k
本教程将对一个“透明按钮”的Fireworks MX插件开发实例做详细剖析,并从以下几方面介绍Fireworks MX插件开发的基本方法和流程,大家不妨先下载MacButton.mxp试用体验一下。
, [+ q. l3 R) B7 g6 h \"
2 x( O w2 a% @) ?, O* D) x \"
6 \' a; h @6 X% `$ X6 W! L" d \" \" \"
2 h3 _& u: F& E2 `6 b' s2 M \"
% K. _# X+ S& f7 w3 M2 ~0 I \" \" \" \"
* |* W7 s4 |# g" M+ ? \" _4 t# ~$ a. b) _+ P- k2 u
\" \" \" ! `, B7 `5 v5 f6 r( b
\"
' l7 ]. i& {/ U" R 一、? 基础知识
. M; d3 R$ o4 t& X2 \% ]1 C 1、两种可开发的扩充插件( g: C- ]3 H" |/ o3 ?
在Fireworks MX中我们根据最终插件所在位置的不同,我们可以将其分为两类。 一类是从Command命令下访问的Command功能插件,这种插件最终安装在/Command/目录下。 另一类是从Windows命令下访问的面板插件,它在Fireworks MX文档中显示为一个标准面板形式,并具有与其他面板同样的属性,例如可以相互组合,折叠、关闭等等,这种插件最终安装在/Command Panels/目录下。 从本质上来说这两类插件没有大的区别,只是存在的位置不同,这里我重点介绍Command插件的开发。
! {4 T) f' O5 {' o! i 2、Fireworks MX命令是什么( [8 P6 {1 S5 I( y" y* [- D
Fireworks MX的Command命令其实就是一些JavaScript命令的集合,由于几乎所有的Fireworks功能都可以通过Fireworks Javascript API来访问,因此利用程序内部的API函数我们就可以扩展基本的FireworksMX功能。有些人迷惑于Fireworks MX本是一个图形软件引擎,它如何能处理Javascript命令?其实Fireworks MX软件内置了Javascript 1.4解释器。作为流行的Web脚本语言,Javascript拥有众多的使用者,因此将其作为控制Web开发工具描述语言是一个明智的选择。Fireworks MX Javascript API(应用程序编程接口)包括一组特定的带有属性和方法的对象,这些对象的属性和方法可以访问、控制并修改Fireworks MX文档。, K( R7 g1 ~5 e
3、须具备的相关知识
: n( N6 l, ]4 H+ b 了解和熟练掌握JavaScript知识是开发FireworksMX插件的基础,除此之外仔细理解Fireworks MX的文档对象模型、API接口,以及Fireworks提供的对象、属性和方法将有助于你少走弯路。
1 ^" ] F+ K( |% L5 F5 @. f 4、Flash知识) z. K0 A$ E/ C2 f* u1 s( g
我们已经知道新的插件可以通过SWF文件来制作界面和程序开发,因此有必要了解一些简单的Flash MX使用知识,以便制作基本的界面。此外还需要了解基本的Flash Action知识,因为我们的大多数开发过程是在Flash MX中使用Action开发,了解如何通过Action在两个不同的程序之间传递参数和变量非常重要。
+ y m# ^: W: y& x; T5 ^" ~ 二、? 目标和计划# `( N7 y, R: S6 B7 V( \
上面讲了一大堆预备知识,也许一些朋友感到麻烦有些退却了,别急,开发插件虽然比较麻烦,但让我们从小事情开始,不论是一大步,还是一小步,都是改变你自己的的一步,相信你会得到快乐的。在本教程中我将以一个简单的插件为例,介绍开发插件中的基本步骤和需要注意的一些问题。
2 i7 y. ]6 U( x4 L& f- R/ z8 C 1、制定你的开发目标
) z0 ~0 a6 n9 _/ H! H- {7 k 首先我们来看一下我们要完成的目标,很多朋友都见过Mac风格的透明按钮,如下图所示:
: _2 Q3 w3 n. X. E) K* L* o5 }+ s: j4 A9 M3 e5 w* i( n4 |

8 ]6 }. O2 t% S4 T* d / r( p+ i$ K3 y8 q2 _
/ ~/ {# R+ ]3 N; H7 a
这种按钮色彩鲜艳,光感强烈,晶莹剔透,得到许多朋友的喜爱,但每次创建此种按钮都经过繁琐的步骤实在让人生厌,像我这样的懒人也很少去做这种按钮。好在Fireworks MX的强项就是将繁琐的任务简单化,它是一个不知疲倦的程序,让我们花些时间完成这样一个插件,以后就可以偷懒了。
( {5 |( t& i! t 2、制定开发Command的计划. ]" @6 N8 `0 Z! `4 @; R) h7 k
说大一些,开发插件也算是一个系统工程,因此做好前期的准备、筹划和分析至关重要。先让我们来看看需要准备些什么,并制定一下开发的计划和流程。
# M6 }0 c$ y8 C! q" |' B; h A、分析阶段:首先分析一下创建一个Mac风格的按钮在Fireworks MX中需要哪些操作,我们可以打开Fireworks MX实际创建一个Mac风格的按钮,并分析相应的程序代码,以找出需要的参数。! r' R* U ?5 i- I% i
B、其次我们要确定完成此任务需要的几个参数:
" D$ l# r- H4 ~- K/ [ 1)按钮尺寸:Width(宽),Height(高) 2)按钮位置:Left(左边界),Top(顶边界) 3)圆角数值:Roundness(设定矩形按钮圆角数值) 4)按钮颜色:Color(基本色)0 r7 A8 x- p4 s- @6 J
C、输入框:根据以上的参数,我们需要在Flash MX中创建获取这些参数的输入框。
+ f) w; J; o+ C6 g8 e: W5 V; q: i* E
A+ }6 U5 Y- C2 \0 d. _5 ]4 w! n6 Q1 p( @% T' x. J

\6 [+ I/ a9 A/ r9 _
. V( m0 e( i, t- e
0 X9 L8 p" H# [" D D、其他的相关说明信息:我们需要为此插件添加简单的使用说明和作者信息,因此增加一个Help按钮和界面。如下图所示:
5 M/ ^5 Y8 N- A6 O6 {
' G9 U! _1 V- r3 D( Y, [
0 }# x9 g( [8 _% C $ ^; h& j6 D2 X# R5 D; Z
]7 [% y& {& j+ e& t h
' h( C% o) `, A; U% ~2 h E、执行和取消操作:上面我们从用户取得的参数最终通过按OK按钮后启动我们的JavaScript程序来创建按钮,也可以按Cancel取消此次操作。* `% z$ z8 j; }8 |* f2 Q
三、? 分析阶段 下面我们就开始根据上面制定的步骤来将我们的任务分解,这里我们先启动Fireworks MX软件,并实际创建一个Mac风格的按钮。
) S4 s9 Q3 z" a! W, r/ v 首先要说明的是,我们只是创建一个类似Mac风格的按钮,因此也许会有人说,你这个按钮根本不像Mac风格,很多朋友创建此种风格的按钮要经过很多步骤,并且有许多的细节,这样出来的效果才可以逼真。不过我们的重点是在创建插件的过程,而不是插件实现的效果,所以我们要尽量简化在Fireworks MX中的操作步骤。3 \+ k1 n a- f( g/ C
(一)实例制作分析0 p- z% K: r+ q: T
1、? 新近一个文档,使用圆角矩形工具绘制一个圆角矩形。
- @1 h$ R' C6 d, V4 i/ B% r9 g5 U" f6 K

. [: ] O% u6 M( _
% h$ U3 L; W4 R% A
( r, c$ u" X9 l. Y, w& |4 d! p 2、? 改变填充的颜色为渐变填充,颜色为浅灰色到白色,方向为从上到下。: u- a t1 A# s( Q" ]/ f
( T2 H8 b/ O# E" G2 p0 Z P

3 i1 D% E1 G8 [: n2 o2 _0 t# W1 z) l
, |! p. B. G; |8 v, w: H. k
7 X" X" c1 O& o0 J( R/ @ 3、? 为矩形添加Inner Shadow阴影,参数设置如图:( A7 E9 l9 H. U" h7 P6 G
7 y! `# {0 ~7 m/ l3 C

. N. s+ V& e$ s7 W+ }: r
% N0 [# j7 p7 R' u+ y, h, j* f) Q H* O7 Z, c( A( i8 ^
4、? 绘制第二个小圆角矩形,高度大约为第一个矩形的一半,宽度大约为第一个的90%。* P5 W, y. }* |" F' S4 y9 X4 y
5、? 改变第二个矩形的圆角为80,填充类型为黑色到白色的线性渐变,方向为从下到上。
1 y& u) Q8 W) O2 U! N; |6 l7 v! x0 a9 k3 U9 P. ^

/ A, q3 S, f7 ~! E" u* Z
8 d E9 m1 X, a
* x4 }+ V" P) e r7 H' L 6、? 在属性面板改变此矩形的混合模式为Screen:
6 ^8 H. I( G3 C% a7 a. L1 R; g! c' x2 ^: W% ^

7 z1 Q, K$ o. x1 X6 x$ M, U
3 P j& O* U% K( c0 l( F5 B1 x9 H' Z% |" w1 u" d& Y
7、? 这样基本的效果就做好了,你还可以添加文字看看最终的效果。; ~$ u4 S0 I1 E5 F2 l. U. W; }
, u/ g" N4 l3 T- \! s6 k" b % o- m$ M# d& l* ^$ f
' e7 x% c L; Y! M7 t- f5 s6 b
& {! n0 w; v( K. ~1 V (二)Fireworks M程序代码分析! {6 d% p! A4 m0 ]$ r5 n, a+ |/ C
0 r) m" o5 V# \% d7 W4 {; W
现在我们打开Fireworks MX的历史面板(History)来看看,在Fireworks MX中历史面板记录了你的所有操作,它具有同类图像处理软件的基本功能,即多步Undo的操作。除此之外History面板的最重要功能还在于可以快速的创建命令,我们可以在History面板中将刚才制作的过程选中,不包括最后的文字输入步骤,如右图。( G% b, p7 h3 }/ r9 U8 _: S- F5 C, `
然后点击History面板下方的“复制到剪贴版”按钮:
$ z5 H( @' V6 } : Z6 i$ H" g+ J$ z3 q0 @. z
。 1 k3 w% v0 \& |% w) d8 b2 F
. g+ y6 X8 T7 C+ Z
在文本编辑器中粘贴剪贴版中的内容,我们可以看到以下程序代码:+ z4 Z: ~- [- @7 W* H: r
! t& H1 m# ~3 N [ o; h6 U) U $ m8 H7 h( @/ `) c+ g: j0 M' D
, J# u7 A, W: y* G: J5 m+ F
' g- O, ^- e( b! Y 我只显示了代码的前面语句,以便我们可以清楚地看到各个步骤Fireworks MX执行了什么语句。
3 e$ D; d. [! [' z 首先我们讲解一下fw.getDocumentDOM();,FireworksMX的扩展很大程度上依赖于Document对象模型(DOM),而获得当前文档的DOM就是使用fw.getDocumentDOM()函数,我们可以先不考虑这些深的原理,只要记住,每个执行的动作都需要先用fw.getDocumentDOM()获得文档的DOM,也就是都必须在方法的前面加上fw.getDocumentDOM()。
1 [, y, X5 \' e& } 下面我们将每一步都分解简化,来看看每一步执行的是什么代码。+ \0 t- _4 H+ @+ g4 S* ~
1、? 绘制新的矩形,并设置圆角数值:- v% Z! I" B9 m; n1 Q& n
fw.getDocumentDOM().addNewRectanglePrimitive({left:39, top:73, right:237, bottom:122}, 0.29999999999999999);* N9 }" S8 j& K) E3 S
我们将其中的实际数值用变量来替换,就变为:* a8 E: e* l6 h) N; d
fw.getDocumentDOM().addNewRectanglePrimitive({left:Left, top:Top, right:Right, bottom:Bottom}, Roundess);
$ \8 U! `' ~9 w) N) t 2、改变矩形填充类型为渐变填充:* m8 \" p0 x; ~2 H5 s
fw.getDocumentDOM().setFill({ category:\"fc_Linear\", ditherColors:[ \"#000000\", \"#000000\" ], edgeType:\"antialiased\", feather:0, gradient:{ name:\"cn_Custom\", nodes:[ { color:\"#cccccc\", isOpacityNode:false, position:0 }, { color:\"#ffffff\", isOpacityNode:false, position:0.99444442987442017 } ], opacityNodes:[ { color:\"#000000\", isOpacityNode:true, position:0 }, { color:\"#000000\", isOpacityNode:true, position:0.99444442987442017 } ] }, name:\"Linear Smooth\", pattern:null, shape:\"linear\", stampingMode:\"blend opaque\", textureBlend:0, webDitherTransparent:false });: u9 p( j* `! [& X
我们将其中的实际数值用变量替换后就变为:
( v5 ~- i* m6 B1 i, n! Rfw.getDocumentDOM().setFill({ category:'fc_Linear', ditherColors:[ '#000000', '#000000' ], edgeType:'antialiased', feather:0, gradient:{ name:'cn_Custom', nodes:[ { color:'#ffffff', isOpacityNode:false, position:0 }, { color:\"BColor\", isOpacityNode:false, position:1 } ], opacityNodes:[ { color:'#000000', isOpacityNode:true, position:0 }, { color:'#000000', isOpacityNode:true, position:1 } ] }, name:'Linear Smooth', pattern:null, shape:'linear', stampingMode:'blend opaque', textureBlend:0, webDitherTransparent:false });
% m: f! N6 q, M h0 [, i 3、改变填充方向:$ f" @8 R4 [+ N& @
fw.getDocumentDOM().setFillVector({x:123, y:73}, {x:123, y:123}, {x:173, y:73});( q! k: X2 b+ a' I) A
我们将其中的实际数值用变量替换后就变为:. ~0 N; U& m9 W- v0 _; A" g
fw.getDocumentDOM().setFillVector({x: Left,y: Bottom}, {x: Left, y: Top}, {x:Right, y:Bottom});! Y; u9 }3 [5 h1 j; U6 y% \4 N
4、添加Inner Shadow效果:
( j# y: ~& ^0 s7 B, o; S1 U! ]fw.getDocumentDOM().applyEffects({ category:'UNUSED', effects:[ { EffectIsVisible:true, EffectMoaID:\\\"{5600f702-774c-11d3-baad0000861f4d01}\\\", ShadowAngle:315, ShadowBlur:5, ShadowColor:'#000000a6', ShadowDistance:0, ShadowType:0, category:'Shadow and Glow', name:'Inner Shadow' } ], name:'UNUSED' }); Q! w, a2 I' P4 F
5、增加第二个矩形:
8 X8 r4 Y- m/ p% bfw.getDocumentDOM().addNewRectanglePrimitive({left:43, top:79, right:230, bottom:99}, 0.29999999999999999);
3 K& p' m' h6 A1 y" t6 c 将其中的实际数值用变量来替换,变为:. ]) D+ N8 t+ Y x G
fw.getDocumentDOM().addNewRectanglePrimitive({left: SLeft, top:STop, right:SRight, bottom:SBottom},SRound); \");
/ ]2 B; r7 A+ @# B1 d7 t9 Y 6、改变矩形渐变填充的颜色:因为第二个矩形的填充颜色就是黑色到白色,所以不需要用变量替换。
& ?9 S `, P4 q" S& G" Rfw.getDocumentDOM().setFill({ category:'fc_Linear', ditherColors:[ '#000000', '#000000' ], edgeType:'antialiased', feather:0, gradient:{ name:'cn_Custom', nodes:[ { color:'#000000', isOpacityNode:false, position:0 }, { color:'#ffffff', isOpacityNode:false, position:1 } ], opacityNodes:[ { color:'#000000', isOpacityNode:true, position:0 }, { color:'#000000', isOpacityNode:true, position:1 } ] }, name:'Linear Smooth', pattern:null, shape:'linear', stampingMode:'blend opaque', textureBlend:0, webDitherTransparent:false });0 I6 N) _+ a$ @
7、? 改变第二个矩形的填充方向:
5 B9 Z5 g: \* ~fw.getDocumentDOM().moveFillVectorHandleBy({x:53, y:2}, \"start\", false, false);
! v% i {; d! j1 g& Q- x8 k3 Q 将其中的实际数值用变量来替换,变为:
$ x! m& q( R4 \( f2 {fw.getDocumentDOM().setFillVector({x:SLeft,y:SBottom}, {x:SLeft, y:STop}, {x:SRight, y:SBottom});
K! j1 D# f; b- [. c7 p 8、? 改变第二个矩形的混合模式:
: E, I9 Z' i: t0 B& e y9 ?fw.getDocumentDOM().setBlendMode('screen');6 I4 y+ e, a$ |" r5 T
四、? 定义运用插件需要的变量参数 从以上的分析我们可以得出我们需要准备的几个变量,也就是需要从用户那里获得的变量。
- m9 ] J1 L) k/ x7 `
- M- v, Z4 c( S) P1 V2 W9 `, _" L?
+ Q: G& B$ P. E# h
( k; b- ~9 d2 o5 _ 第一个矩形8 }% H1 g" Q3 b2 f8 x$ }" s/ x
3 q- S% ^4 v: N0 K( L: s 第二个矩形& L5 H! {# ~. b7 q! l
4 X3 o3 @9 L4 v& e4 F/ w矩形宽矩形高矩形左边界位置矩形顶边界位置 矩形右边界位置矩形底边界位置矩形圆角数值按钮基础颜色1 o4 _( R. Z% J6 j9 Z, ~
WidthHeightLeftTop RightBottomRoundBcolor
, D( I: B- S; A! `# }1 D- J* MSwidthSheightSleftStop SrightSBottom Sround+ t) X- M% b- S! |. V/ k/ H' q
通过分析,我们可以知道,矩形的右边界就是矩形的左边界与矩形宽的和,也就是:
" B! x: s8 }8 V0 Q% z# |$ C7 o4 ?Right=Left+WidthSRight = SLeft+SWidth
: V7 H% S y, Y2 U- W9 K( Z$ W. z- z8 @ 矩形的底边界就是矩形顶边界和矩形高的和,也就是:5 F$ D; Q9 i* b% H; h
Botton=Top+Height? SBottom = STop+SHeight4 m* \/ x* ~+ w. h+ X; U! B
此外第二个矩形的参数都与第一个矩形相关,并可以通过相应的计算得出,而不需要单独要求用户输入。 我们可以设定第二个矩形的宽度是第一个的90%,也就是:SWidth = Width*0.9 高度是第一个的50%\"60%,也就是:SHeight = Height*0.5 我们设定左边界比第一个矩形偏20%,即:SLeft = Left+(Width/20) 顶边界同样偏20%,即:STop = Top+(Height/20) 第二个矩形的圆角数值我们可以设定为第一个的1.6倍,这个是个人的经验,也可以设定为你觉得合适的数值,即:SRound = Round*1.66 @) y' T& o0 E' d; C% O
五、? 进入Flash MX进行开发- G5 Y b0 b5 K; A/ W2 a+ s; S9 I
基本的准备工作做好后,我们就可以启动Flash MX软件进行开发了。由于这部分涉及到一些Flash Action,因此如果你有这方面的基础就更好了,如果不太了解也没关系,我们不会涉及太多的Action。
* `5 w- b( S9 c. `! p* x* }9 Z6 T (一)界面元素。首先绘制基本的界面,并插入六个需要的文字输入框,如下图:
, Z# j, a: g. S1 D
% W+ ^+ [3 m# T
2 `, w& M' ^/ c; L9 v/ b# p/ D% ? 文字输入框其实就是插入一个Input Text,在属性面板进行相应的设置,如下图:
; C: b2 m/ o0 ^3 z! d7 x2 j7 `% [/ ^, _
4 Z' f' T9 o" A/ N* C. V7 a
Text Style(文字类型):Input Text,允许用户输入自己的数值。 Variable(变量名):给你的变量起一个名称。 Maxinum Characters(最大允许字符数):3位即可。 当前的数字即为此变量的默认值。
1 j) ]+ M/ _7 }' M7 a9 p9 r$ v7 p
, Q3 f5 P; l/ V+ U7 r (二)为OK按钮添加相应的程序代码
1 g! U; G) ]& ]# i/ j- E5 n 1、先制作一个标准的OK按钮,并将其插入主场景。! L# Z* K) W @5 m! @$ e4 m
2、转到主场景,选取OK按钮,打开Action面板,并转到Expert Mode(专家模式)。由于我们需要在按下OK按钮时,执行我们的程序,因此为此按钮添加以下脚本:1 u4 }* ^4 V+ M( X& b1 R
on (release) { 执行语句 }
2 L5 [8 _( F; X. P1 H7 N 3、首先在最开始加入我们的变量定义,代码如下:
. c. m5 p+ H/ }6 g8 g ? // 用户输入变量. ? var Width = Number(_root.ButW); ? var Height = Number(_root.ButH); ? var Left = Number(_root.ButL); ? var Top = Number(_root.ButT); ? var Round = Number(_root.ButR/100); ? var BColor = (_root.ButC); ? var Right = Left+Width; ? var Bottom = Top+Height; //第二个矩形的参数 ? var SWidth = Width*0.9; ? var SHeight = Height*0.5; ? var SLeft = Left+(Width/20); ? var STop = Top+(Height/20); ? var SRound = Round*1.6; ? var SRight = SLeft+SWidth; ? var SBottom = STop+SHeight; 2 C; J; U) c; w# ]! |
4、下面我们需要将Fireworks API调用加入此函数。在Flash MX中,每个API函数都可以被Flash API所调用,它们之间是通过以下方法互相传递的,即使用MMExecute()函数。例如在Fireworks中的以下命令:
/ S* x% h, e' k" E1 gfw.getDocumentDOM().addNewRectanglePrimitive({left:Left, top:Top, right:Right, bottom:Bottom}, Roundess);/ J0 K2 y" P) _! n
调入Flash MX中后需要转换为:) ]- m1 R, R0 T1 f! y' A
MMExecute(\"fw.getDocumentDOM().addNewRectanglePrimitive({left:\"+left+\", top:\"+top+\", right:\"+right+\", bottom:\"+bottom+\"},\"+Round+\");\");* j" \5 a+ L9 O; g! c
需要注意的是,MMExecute取代了以前旧版本的FWJavaScript函数,不过FWJavascript仍旧可以使用,也就是说以下写法同样可以执行:& W1 ]6 J* H: Q$ f& u7 G
FWJavaScript(\"fw.getDocumentDOM().addNewRectanglePrimitive({left:\"+left+\", top:\"+top+\", right:\"+right+\", bottom:\"+bottom+\"},\"+Round+\"); \");% j T# M- w; }* K, e
不过我们推荐使用新的第一种写法。此时加入的脚本如下所示: ? //绘制第一个矩形 ? MMExecute (\"fw.getDocumentDOM().addNewRectanglePrimitive({left:\"+left+\", top:\"+top+\", right:\"+right+\", bottom:\"+bottom+\"},\"+Round+\"); \"); ? //填充第一个矩形渐变色 ? MMExecute (\"fw.getDocumentDOM().setFill({ category:'fc_Linear', ditherColors:[ '#000000', '#000000' ], edgeType:'antialiased', feather:0, gradient:{ name:'cn_Custom', nodes:[ { color:'#ffffff', isOpacityNode:false, position:0 }, { color:'\"+BColor+\"', isOpacityNode:false, position:1 } ], opacityNodes:[ { color:'#000000', isOpacityNode:true, position:0 }, { color:'#000000', isOpacityNode:true, position:1 } ] }, name:'Linear Smooth', pattern:null, shape:'linear', stampingMode:'blend opaque', textureBlend:0, webDitherTransparent:false });\"); ? //设置第一个矩形渐变色方向 ? MMExecute (\"fw.getDocumentDOM().setFillVector({x:\"+Left+\",y:\"+Bottom+\"}, {x:\"+Left+\", y:\"+Top+\"}, {x:\"+Right+\", y:\"+Bottom+\"});\"); ? //添加Inner Shadow效果 ? MMExecute (\"fw.getDocumentDOM().applyEffects({ category:'UNUSED', effects:[ { EffectIsVisible:true, EffectMoaID:\\\"{5600f702-774c-11d3-baad0000861f4d01}\\\", ShadowAngle:315, ShadowBlur:5, ShadowColor:'#000000a6', ShadowDistance:0, ShadowType:0, category:'Shadow and Glow', name:'Inner Shadow' } ], name:'UNUSED' });\"); ? //绘制第二个矩形 ? MMExecute (\"fw.getDocumentDOM().addNewRectanglePrimitive({left:\"+SLeft+\", top:\"+STop+\", right:\"+SRight+\", bottom:\"+SBottom+\"},\"+SRound+\"); \"); ? //填充第二个矩形 ? MMExecute (\"fw.getDocumentDOM().setFill({ category:'fc_Linear', ditherColors:[ '#000000', '#000000' ], edgeType:'antialiased', feather:0, gradient:{ name:'cn_Custom', nodes:[ { color:'#000000', isOpacityNode:false, position:0 }, { color:'#ffffff', isOpacityNode:false, position:1 } ], opacityNodes:[ { color:'#000000', isOpacityNode:true, position:0 }, { color:'#000000', isOpacityNode:true, position:1 } ] }, name:'Linear Smooth', pattern:null, shape:'linear', stampingMode:'blend opaque', textureBlend:0, webDitherTransparent:false });\"); ? //改变第二个矩形的填充方向 ? MMExecute(\"fw.getDocumentDOM().setFillVector({x:\"+SLeft+\",y:\"+SBottom+\"}, {x:\"+SLeft+\", y:\"+STop+\"}, {x:\"+SRight+\", y:\"+SBottom+\"});\"); ? //改变混合模式 ? MMExecute (\"fw.getDocumentDOM().setBlendMode('screen');\");/ f o9 X2 x! r
5、按钮的执行脚本基本已经输完了,最后我们还需要添加一个结束命令的语句,以便释放相应的变量并返回到用户的当前文档。Flash MX提供了新的MMEndCommand()函数,以取代旧版本的FWEndCommand()函数,当然FWEndCommand()仍旧得到支持。脚本代码如下:/ ?1 ?. B- _( n+ ?. C& B
// End command and release system resources ? MMEndCommand (true, \"\");
% k% ^$ v( p) N; n (三)为Cancel按钮添加相应的脚本 相对来说Cancel的脚本就很简单了,只需结束当前命令并返回到用户文档即可,代码如下: {2 ]% k0 M& F. z) v! A# S
on (release) { // End command and release system resources MMEndCommand (true, \"\");} 最终全部代码如下:
" X4 v( Y7 X, Q6 g; Z, @( jon (release) { // 定义用户输入变量 var Width = Number(_root.ButW); var Height = Number(_root.ButH); var Left = Number(_root.ButL); var Top = Number(_root.ButT); var Round = Number(_root.ButR/100); var BColor = (_root.ButC); var Right = Left+Width; var Bottom = Top+Height; //第二个矩形的参数 var SWidth = Width*0.9; var SHeight = Height*0.5; var SLeft = Left+(Width/20); var STop = Top+(Height/20); var SRound = Round*1.6; var SRight = SLeft+SWidth; var SBottom = STop+SHeight; //绘制矩形 FWJavaScript(\"fw.getDocumentDOM().addNewRectanglePrimitive({left:\"+left+\", top:\"+top+\",right:\"+right+\", bottom:\"+bottom+\"},\"+Round+\"); \"); //填充渐变色 FWJavaScript(\"fw.getDocumentDOM().setFill({ category:'fc_Linear', ditherColors:[ '#000000', '#000000' ], edgeType:'antialiased', feather:0, gradient:{ name:'cn_Custom', nodes:[ { color:'#ffffff', isOpacityNode:false, position:0 }, { color:'\"+BColor+\"', isOpacityNode:false, position:1 } ], opacityNodes:[ { color:'#000000', isOpacityNode:true, position:0 }, { color:'#000000', isOpacityNode:true, position:1 } ] }, name:'Linear Smooth', pattern:null, shape:'linear', stampingMode:'blend opaque', textureBlend:0, webDitherTransparent:false });\");FWJavaScript(\"fw.getDocumentDOM().setFillVector({x:\"+Left+\",y:\"+Bottom+\"}, {x:\"+Left+\", y:\"+Top+\"}, {x:\"+Right+\", y:\"+Bottom+\"});\"); //添加效果 FWJavaScript(\"fw.getDocumentDOM().applyEffects({ category:'UNUSED', effects:[ { EffectIsVisible:true, EffectMoaID:\\\"{5600f702-774c-11d3-baad0000861f4d01}\\\", ShadowAngle:315, ShadowBlur:5, ShadowColor:'#000000a6', ShadowDistance:0, ShadowType:0, category:'Shadow and Glow', name:'Inner Shadow' } ], name:'UNUSED' });\"); //绘制第二个矩形 FWJavaScript(\"fw.getDocumentDOM().addNewRectanglePrimitive({left:\"+SLeft+\", top:\"+STop+\",right:\"+SRight+\", bottom:\"+SBottom+\"},\"+SRound+\"); \"); //填充第二个矩形 FWJavaScript(\"fw.getDocumentDOM().setFill({ category:'fc_Linear', ditherColors:[ '#000000', '#000000' ], edgeType:'antialiased', feather:0, gradient:{ name:'cn_Custom', nodes:[ { color:'#000000', isOpacityNode:false, position:0 }, { color:'#ffffff', isOpacityNode:false, position:1 } ], opacityNodes:[ { color:'#000000', isOpacityNode:true, position:0 }, { color:'#000000', isOpacityNode:true, position:1 } ] }, name:'Linear Smooth', pattern:null, shape:'linear', stampingMode:'blend opaque', textureBlend:0, webDitherTransparent:false });\"); //改变第二个矩形的填充方向FWJavaScript(\"fw.getDocumentDOM().setFillVector({x:\"+SLeft+\",y:\"+SBottom+\"}, {x:\"+SLeft+\", y:\"+STop+\"}, {x:\"+SRight+\", y:\"+SBottom+\"});\"); //改变混合模式 FWJavaScript(\"fw.getDocumentDOM().setBlendMode('screen');\"); // End command and release system resources FWEndCommand(true, \"\");}
: w9 q& V$ b3 \$ w" c$ I. ?' o- B, G 六、? 输出到Fireworks MX测试并调试代码。5 B1 J) G; O5 x. d/ |
前面我们做的一切就好像在黑暗中摸索一样,我们其实不知道程序具体的执行起来是什么样的,现在我们可以实际测试一下,看看我们制做的插件是否可以运行。 执行Flash的Expert Movie输出我们制做的插件,将SWF文件保存到你的Fireworks MX程序的/ Configuration/Commands/目录下,相关设置如下所示:- L) S5 F+ g5 Z( X
$ S5 P X2 f# R) J

9 A+ c$ W, K5 p. b 7 N7 _4 }5 L- ]4 Q. G/ S3 y* O R
( R- d4 G4 y6 s0 v. \* J& K( y% Y5 }
现在转到Fireworks MX,你会在Commands命令下发现你刚才输出的命令,如果你一直按照我前面介绍的作下来,并且输入正确的话,在Fireworks MX中执行此命令,你会看到正确的结果,一个漂亮的Mac风格按钮。但是,事情往往不像我们想想得这样简单,经常由于这样那样的错误,或者是我们的疏忽,你的脚本中会包含一些错误,但往往你一下子无法确错误发生在哪里,也许编写插件经常令你苦恼的就在这里,幸好Macromedia为我们想到了这点,现在利用一个特殊的函数,我们可以在Fireworks MX中调试我们的脚本代码,以确定程序在哪一步出错误。Fireworks MX中提供了两个调试代码的函数,分别是:fw.enableFlashDebugging() 允许调试代码fw.disableFlashDebugging() 结束代码调试3 ?$ d! E. x/ ]+ n7 V$ L
转到Flash MX中,打开我们的代码窗口,在你感觉有问题的代码前后加入这两个语句,例如:. v/ W+ a6 }2 N$ b. b# F* L
MMExecute (\"fw.enableFlashDebugging();\");MMExecute(\"fw.getDocumentDOM().addNewRectanglePrimitive({left:\"+left+\", top:\"+top+\", right:\"+right+\", bottom:\"+bottom+\"},\"+Round+\"); \");MMExecute (\"fw.disableFlashDebugging();\");
# P. ?0 k3 R2 [5 b: |& i8 C7 G3 i 重新输出Movie,并转到Fireworks MX中执行,当程序执行到这一句时会将这句的结果显示出来,如下图所示:& `1 s' Q; n9 u; F0 J
3 D$ [( z' T( F4 ~; ?: @
: }# d9 u/ G2 I1 P * N6 T, ]. V4 r: W _. X
: w$ @/ {- V, J8 w) `
这个窗口显示了程序执行到此步时的结果,点确定后会显示结束调试的窗口,如下图:( w" \2 x$ Q- K# y
5 _& }3 |' ` G7 V

, K& U+ {% m7 t4 V5 r, ^" U / ^$ s7 k% I3 B" b. }2 @& d
7 I) v5 }% o i8 H# v1 N
这样我们可以很方便的找出错误在那里,方便我们的开发。9 x4 r7 @+ P4 r+ C. T! X; v% E
七、? 打包你的插件: R6 t1 F: L3 s2 \) p, m. E
当一切测试无误,你的插件就做好了。当然,你还需要将它与其他朋友分享。由于新版的Fireworks MX支持标准的MXP插件封装格式,因此这里我再简单介绍一下封装插件的方法。4 Q) w/ x' g/ _# q* U: l" a( d
安装完Fireworks MX后,在你的Commands命令下会找到Manage Extensions命令,它可以启动插件管理器。 (一)在Commands命令中出现的插件 封装插件首先需要你准备好两样东西:你的SWF文件,相应的MXI文件。SWF也就是你在Flash MX中开发的插件,MXI文件包含了关于此插件的说明和相关信息,此文件要求为标准的XML格式,主要内容如下:
0 |$ {' d d' n' v8 X+ [% X- L<Macromedia-extension name=\"MacButton\" version=\"1.0\" type=\"Command\"> ? <!-- List the required/compatible products --> ? <products> <product name=\"Fireworks\" version=\"6\" primary=\"true\" /> ? </products> ? <!-- Describe the author --> ? <author name=\"Mengjue\" /> ? <!-- Describe the extension --> ? <description> ? <![CDATA[This command can easy creative Mac style button.]]> ? </description> ? <!-- Describe where the extension shows in the UI of the product --> ? <ui-Access> ? <![CDATA[To use MacButton V1.0, choose Commands > Bitgenius > MacButton.]]> ? </ui-Access> ? <!-- Describe the files that comprise the extension --> ? <files> <file name=\"MacButton.swf\" destination=\"$Fireworks/configuration/commands/bitgenius/\" /> ? </files> ? <!-- Describe the changes to the configuration --> ? <configuration-changes> ? </configuration-changes></Macromedia-extension> . D$ a% C) d: S; B& {6 x
注意粗体部分的内容,你可以很容易看懂其中需要你填写的项目:插件名称、开发作者、插件说明、执行路径以及插件的安装目录,将它们修改为你自己希望的内容,并保存为MXI文件。准备好你的SWF和MXI文件,并放在同一个目录下,然后就可以打包了。
" C J- G% Z9 u 转到Fireworks MX,启动Extensions Manage插件管理器。执行File>Package Extension,选择你刚才写好的MXI文件,并为你最终的插件起一个名字,Extension Manage会将你的SWF文件和MXI文件打包为一个单独的MXP文件,非常简单。
I3 b+ G, h5 |- B! T 用以上方法打包的插件安装后会在Commands命令中出现。 (二)标准面板形式的插件 还有一种插件是标准的面板形式,例如新的Align插件,制作这种插件也很简单,仅仅需要修改MXI文件即可,例如我们将刚才的SWF文件,我们另起一个名字,并新建一个MXI文件,内容修改为以下内容,注意粗体部分的内容:5 z5 `. f6 L+ X% p
<Macromedia-extension name=\"MacButtonChanel\" version=\"1.0\" type=\"Command\"> <!-- List the required/compatible products --> <products> ? <product name=\"Fireworks\" version=\"6\" primary=\"true\" /> </products> <!-- Describe the author --> <author name=\"Mengjue\" /> <!-- Describe the extension --> <description> <![CDATA[This command can easy creative Mac style button.]]> </description> <!-- Describe where the extension shows in the UI of the product --> <ui-Access> <![CDATA[To use MacButton V1.0, choose Window > MacButtonChanel.]]> </ui-Access> <!-- Describe the files that comprise the extension --> <files> ? <file name=\"MacButtonChanel.swf\" destination=\"$Fireworks/configuration/command panels/bitgenius/\" /> </files> <!-- Describe the changes to the configuration --> <configuration-changes> </configuration-changes></Macromedia-extension>
5 n$ J' _5 x( O% N: Z# f7 k* q2 |9 M 重新打包并安装后,你会在Windows命令下发现新增了一个Bitgenius>MacButtonChanel命令,启动后即为标准的命令面板形势,同样也可以拖动并与其他面板成组。如下图所示:
f; d4 P/ q$ Z3 M: X, q5 t4 _% h1 g- o2 B0 @8 }
) J% j7 F: N# `2 J3 |' t

- k! ~ z" Q3 R5 }1 T6 ~ k ( T) s' F+ v- a# ]1 s& p* B
7 } d# A3 X7 q, A+ f
需要注意的是有些插件针对的是选择对象,也就是说你必须先选择一个或多个对象,然后才可以执行此命令,则这种插件最好打包成Command形式,并在插件中添加选择判断,当有选择对象时才执行此命令。而不要打包成面板形式插件。还有就是如果你希望开发的是一个面板形式的插件,一定要注意它的宽度,否则太宽的面板会影响其它面板的布局。% |- _' E5 o- W4 w6 ^7 O5 f( N5 o* a
此时你就可以把这个MXP文件与其他人分享了,当他们得到此插件文件后,可以在Fireworks MX中启动Extension Manage管理器,然后执行File>Install Extension,选择此MXP文件,插件就自动安装到原先设定的目录中。2 b" a+ r' i' D
八、? 结语' H) x# X$ ^8 E9 B
以上我只是简略介绍了Fireworks MX插件开发的一般步骤,需要说明的是,重要的不仅仅是如何开发,更是开发什么,只有好的想法才能产生好的插件。当然你可以把一些繁琐的操作制作成插件以方便今后的使用。比如针对这个插件,你还可以为它添加以下功能:6 p. U) }3 C, v& F3 @. Q
1、直接从颜色标中选取色彩的功能。 2、预先添加一个实例文字。 3、在此基础上还可以开发Mac风格的文字插件。具体如何实现,朋友们可以自己思考一下。
0 Y5 M3 J% \3 r+ V 由于Fireworks MX包含了大量的对象和方法,如果你希望更多地了解Fireworks MX的插件开发,一定要仔细看看Macromedia的Extending Fireworks MX文件,它是一个PDF版本,你可以在Macromedia网站下载。 本教程参考了Macromedia网站的\"。 本教程所介绍的插件MacButton已被Macromedia官方网站收录,朋友们可直接到Macromedia网站下载,关于MacButton地最新版本请关注我的网站。 |
|