TextField对象
新的TextField对象是从Object对象继承而来,使得在Flash中动态建立文本的童话变成现实,而这一些你只要从MovieClip.createTextField开始(这条语句想必使用频率非常的高,所以我把格式写出来):
MovieClip.createTextField(Instance名称,深度,初始x轴位置,初始y轴位置,初始宽度,初始高度);
通过MovieClip的createTextField方法,你将可以动态的在程序运行期间建立文本区并可设置其属性和方法:
createTextField("txt",++dpt,80,100,100,200);
txt.wordwrap=true;
var i=30;
while (i--) txt.text+="rice...";
通过这行代码,我们在程序运行期动态建立一个Instance名称为txt的文本区并置于第1层深度,规定其初始位置在(80,100),高200宽100;这个“筐”做好以后,我们可以往里面放东西,但是我们在放之前,我们需要规定它的另一个属性wordwrap,这个属性的作用相当于规定了你的筐有没有封边,如果初始值为false,那么这个“筐”是失败的,只可以当作“席子”;随意我们规定了这个“筐”封边,并塞入30“斤”大米。试运行下结果。(如图1,阿,看起来到真像大米筐……)
(图1)
成功的第一步迈开了之后,让我们对上面丑陋的大米筐装修一下。
createEmptyMovieClip("mc",++dpt);
with (mc) {
createTextField("txt",++dpt,80,100,100,100);
txt.putRice=function(rice){if(rice){txt.text+=".";arguments.callee(--rice)}return;};
txt.border=1;
txt.multiline=1;
txt.background=1;
txt.wordWrap=1;
txt.putRice(254);
txt.putRice(36);
}
由于TextField是MovieClip的方法,所以我们出于学习而产生一个空的MovieClip来装这个文本区;程序运行后动态产生一个文本区,并有一个边框和白色的背景,最后用自定义方法putRice装载“大米”,由于Flash
MX的递归调用最多只可以支持256层(0-255),所以我们还不能一下子装载300斤,只能分两次装(254+36),最后形成的结果如下:(图2)
(图2,看起来好整齐的大米,其实多余的部分已经漏到地低下去了……)
嗯……这就结束了?我这个人Bad Mind,总想搞搞恶作剧,我让我做的textField米筐进行物理性破坏测试,让其高度(或宽)小于字体的最小高度后……发现Bug一个,textField失去了原有的位置和高、宽属性被挤到了屏幕的边缘,最搞笑的就是这个测试结果……让我们加入如下代码并观察(图3)
createTextField("txt",++dpt,80,100,100,3);
trace(txt._x);
trace(txt._y);
trace(txt._width);
trace(txt._height);
trace(txt.textwidth);
trace(txt.textheight);
txt.wordwrap=1;
var i=30;
while (i--) txt.text+="rice...";
(图3,倒……y可是100耶,宽也是100耶,没办法,把我的筐撑坏了……米撒了一地)
TextFiled的简单应用
刚做了个米筐例子,看起来文本区操作还有些用途,可是仅仅这样可不够……Flash MX中新的文本区还是有很大的用途的。
例如我们做一个在线用户输入姓名和密码的简单应用,输入如下代码:
createTextField("txtUser",++dpt,80,100,100,20);
createTextField("txtPass",++dpt,80,150,100,20);
txtUser.type=txtPass.type="input";
txtUser.border=txtUser.background=1;
txtUser.bordercolor=txtPass.bordercolor=0x776655;
txtPass.border=txtPass.background=1;
txtUser.autosize=txtPass.autosize="center";
txtUser.text=txtPass.text+=" ";
txtPass.password = 1;
txtUser.tabIndex=1;
txtPass.tabIndex=2;
txtUser.tabEnabled=txtPass.tabEnabled=1;
txtUser.tabChildren=txtPass;
啊……看起来乱七八糟,但是却十分好理解,Flash MX中允许用户自定义TextField的很多属性,而对其操作更是考虑周到;我们首先定义两个类型为输入文本的TextField
txtUser和txtPass,定了一基本的背景边框等样式属性后,我们用autosize属性让文本自动缩放,这样在用户输入的的时候十分的动感的,而第2个文本txtPass需要用户的内容为隐藏,所以把它的password属性设为true;接着给这两个文本初始化字符,让他们看起来不那么狭窄;最后用用到的是tabIndex,它是一个存储当前需要table键换焦点文本的数组,通过正整数来区分每个要切换的文本,而你如果你要是用到这个功能,文本区的tabEnabled必须是true,否则无效,而tabChildren属性是新加入的属性,我们可以设置/获取其内部的子文本对象。测试,你可以看到一个用户输入界面,这一切的制作过程是不需要你动任何鼠标操作的。(如图4)
(图4)
但是,这个tabIndex和selection有直接的冲突。当你设置了tabEnabled和tabIndex后,如果要使用selection.setFocus(txtUser);这样的看上去什么错误都没有的代码,将会产生一个内部优先级错误,将无法有效使用tab键来切换文本。
写到这里,通过很多例子我们再次证明了在Flash MX中可以完全脱离鼠标并能完成很多同样甚至更酷的效果,而此时,Flash MX的阳光射线才不过是上午10点半,更多的功能还等待我们去探索……