首先要明白几种长度单位:
1、磅:pt(point),这是一种绝对长度单位,为1/72英寸,等于0.3527mm
2、像素:px,这是一种相对长度单位,譬如,WONDOWS的用户所使用的分辨率一般是96像素/英寸。而MAC的用户所使用的分辨率一般是72像素/英寸。
以下讨论文本框TextField相关:
1、字号
也就是fontsize,flash中单位是磅(office中也时),可以使用textHeight和textWidth来获取文本的像素高度和宽度,由于各种字体自身的差别,不是相同字号的字体所需要的文本框高度都一致。譬如Arial字体就比宋体所需要的文本框高度高。
2、文本框高度
对于单行文本框,给定一个高度和一种字体,如何确定所需要的最大的字号呢?
有一个简便方法就是,新建一个autosize的文本框,设置其字号并判断其高度来得到最大字号。
3、leading行与行之间的垂直距离function getFontSizeByTxtHeight(h:Number, font:String):Number
{
//给定单行文本框高度h,字体font获取最大字号
var testtxt:TextField = new TextField();
testtxt.type = TextFieldType.INPUT;
testtxt.autoSize = TextFieldAutoSize.LEFT;
for (var size:Number=Math.round(h);size>0; size-=0.5)
{
var tf:TextFormat = new TextFormat();
tf.leading = 0;
tf.font = font;
tf.size = size;
testtxt.defaultTextFormat = tf;
testtxt.text = "test单行文本";
//trace(size, testtxt.height);
if (testtxt.height <= h)
{
break;
}
}
return size;
}
在flash 舞台中新建一个文本框,leading的默认值为2,单位也是磅
而new出来的文本框,leading默认值为0
4、锯齿消除方法
在舞台上可以看到有五种方式:
使用设备字体、位图文本、动画消除锯齿、可读性消除锯齿、自定义消除锯齿。
第一种会查找客户端中该对应字体并进行显示,如果客户端不存在相应的字体,则显示会出现预料外的情况。同时设置此字体的静态文本框会被认为是dynamic类型的textfield,而不是StaticText。
后四种方式需要嵌入字体。同时设置此字体的静态文本框会被认为是StaticText。
而TextField类对应的属性中有
embedFonts:是否使用嵌入字体,false时相当于使用设备字体
antiAliasType:抗锯齿类型flash.text.AntiAliasType.NORMAL、flash.text.AntiAliasType.ADVANCED
gridFitType:网格固定类型
thickness、sharpness对应自定义消除锯齿的粗细、清晰度
5、滚动相关
textfield有scrollV、scrollH、maxScrollV、maxScrollH、bottomScrollV属性来指示相关滚动。
V代表垂直方向,是以行为单位的,如果文本框内显示得下指定行数,则maxScrollV为1,一旦显示不小,maxScrollV就不为1了,所以可以侦听文字的change事件判断maxScrollV来判断是否需要滚动条。scrollV到bottomScrollV之间是当前您能看到的文本框中中的行号。
H代表水平方向,以像素为单位,从0开始,不同于V,同理检测maxScrollH是否为0。
6、事件相关
textfield有如下事件比较常用:
focusin、out:获得、失去焦点,用于判断当前用户是否focus in该文本框,譬如一旦focusin加个高亮边框阿,换个背景什么的
textinput、change:前者在文本输入到文本框之前调用,后者在文本框中的文本发生改变时调用。
scroll:不管你用什么方式导致scrollV、scrollH发生改变,譬如输入文本时的自动滚动阿,滚轮滚动文本阿(即便你手工设置scroll)都会导致scroll事件的发生
7、获取用户系统中可用的字体(利用此可以做一个字体浏览器)
利用flash.text.Font的方法enumerateFonts(enumerateDeviceFonts:Boolean = false)返回字体列表,如果为true包含有swf中的嵌入字体和用户电脑上的设备字体,如果为false则只有swf中的嵌入字体。
import flash.text.Font;
var allFonts:Array = Font.enumerateFonts(true);
allFonts.sortOn("fontName", Array.CASEINSENSITIVE);
var embeddedFonts:Array = Font.enumerateFonts(false);
embeddedFonts.sortOn("fontName", Array.CASEINSENSITIVE);