文章来之:http://hi.baidu.com/mr%5Fziqiang/blog/item/934de724121fdc348744f9d2.html
今天做表情聊天的整合,不料遭遇一个奇怪的问题。
使用TextField的getCharBoundaries()方法时,居然有的时候无法取得索引字符的边框。测试了很多次都是只能一部分,后面的取到的都是null。
代码如下:
var txt = new TextField();
txt.width = 200;
txt.selectable = false;
txt.multiline = true;
txt.wordWrap = true;
txt.autoSize = "left";
addChild (txt);
for (var i=0; i<10; i++)
{
txt.htmlText+="<font color='#00ff00'>这真是一个奇怪的问题啊</font>\n";
}
var indexArr=[];
var text=txt.text;
for (var index:int = 0; index < text.length; index++)
{
if (text.charAt(index) == "一")
{
indexArr.push (index);
}
}
for (var pos:int = 0; pos < indexArr.length; pos++)
{
var tempPos:Rectangle = txt.getCharBoundaries(indexArr[pos]);
trace(tempPos); //输出索引字符的边界矩形
}
联想到前段时间测试TextField时,如果字符在TextField的显示范围之外那么getCharBoundaries也是取到null。(也正是这个原因我没有使用TextField的自带的滚动功能而采用了mask方式。)于是尝试Trace 了一下文本的高度,没想到加一句Trace之后问题居然自动解决了。
加了Trace的代码:
var txt = new TextField();
txt.width = 200;
txt.selectable = false;
txt.multiline = true;
txt.wordWrap = true;
txt.autoSize = "left";
addChild (txt);
for (var i=0; i<10; i++)
{
txt.htmlText+="<font color='#00ff00'>这真是一个奇怪的问题啊</font>\n";
}
var indexArr=[];
var text=txt.text;
for (var index:int = 0; index < text.length; index++)
{
if (text.charAt(index) == "一")
{
indexArr.push (index);
}
}
trace(txt.height);
for (var pos:int = 0; pos < indexArr.length; pos++)
{
var tempPos:Rectangle = txt.getCharBoundaries(indexArr[pos]);
trace(tempPos); //输出索引字符的边界矩形
}
分析:
一般来说TextField有一个默认的高度100, 通过多次测试基本上输出为null的都是这个默认高度之外的字符。 我认为这个现象应该是TextField的一个小Bug,如果我们不用htmlText而使用text+=方式或者appendText方式添加,问题同样存在。
也就是说自动增加行数之后,如果我们不对文本的尺寸操作。(width和height 都是getter setter实现的,无论你设置或者取得都算是操作)那么TextField的内部应该还是保留着这个默认的高度,而getCharBoundaries也是傻乎乎的通过内部的这个默认高度去取得,一旦发现你需要的这个字符的边界在默认高度之外自然就返回null了。
对于这个问题打算反映到adobe一下。
解决方法:
上述的分析不一定正确,但是你通过操作文本的尺寸确实是可以这个问题。
上面的例子你如果不用trace(txt.height)而直接写txt.width;或者txt.height;也是没有问题。
补充:
刚刚通过一个例子再次证明了我的推测。
textField确实是有一个类似于_height 的私有变量,默认为100,无论我们通过text属性还是htmlText来添加文本,这个_height始终没有改变。
我们可以理解为adobe在写text的setter方法时忘了了一个语句:_height=_textHeight;而恰恰getCharBoundaries在求边界的时候需要以这个_height作为条件。
如何证明这一推测:
还是上面的第一个例子:
在txt.width=200 后面添加一句txt.height=40; 结果为
(x=38, y=2, w=12, h=15)
(x=38, y=17, w=12, h=15)
(x=38, y=32, w=12, h=15)
null
null
null
null
null
null
null
在txt.width=200 后面添加一句txt.height=80; 结果为
(x=38, y=2, w=12, h=15)
(x=38, y=17, w=12, h=15)
(x=38, y=32, w=12, h=15)
(x=38, y=47, w=12, h=15)
(x=38, y=62, w=12, h=15)
(x=38, y=77, w=12, h=15)
null
null
null
null
测试结论:
你会发现一个现象,所有大于height的边界都无法输出。
分享到:
相关推荐
初中语文文摘历史谜一样的东方精神
小学英语英语故事名人故事谜一样的莎士比亚
世界上最昂贵私人住宅谜一样的赫氏堡.docx
Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思Java谜思...
用MFC写的小游戏:9谜和15谜问题,可以按最短路径来移动
《蓝田之谜》全文.pdf
C#开发游戏程序设计大作业室内解谜qwq游戏源代码C#开发游戏程序设计大作业室内解谜qwq游戏源代码C#开发游戏程序设计大作业室内解谜qwq游戏源代码C#开发游戏程序设计大作业室内解谜qwq游戏源代码。C#开发游戏程序设计...
java 制作小游戏 猜字谜 随机产生数字 然后猜 会提示 猜大 猜小
猜字谜
应用了人工智能中非常经典的A*算法解决了同样很经典的15谜问题,该算法比深度和广度优先算法都快了很多
【《动物迁徙之谜》阅读答案】 动物迁徙之谜.docx
谜画之塔2:暗夜飞行简体中文典藏版-ChinaAVG+谜画之塔1 简体中文汉化+补丁 下载
教师招聘、教师资格证面试小学语文《月球之谜》试讲稿.pdf
小学数学数学故事招贤谜阵
谜踪之国谜踪之国[2011-01-25日最新版本].txt
T字之谜的图解
【《,科学家揭开变色龙变色之谜》阅读附答案】科学家揭开变色龙.docx
利用 WinHex、Wireshark 等工具,逆向分析“潜逃之谜.pcap”文件,根据 案件描述找到案件调查线索,理解并掌握基于 Wireshark 的网络数据流分析方法。
《动物游戏之谜》.ppt
这是一个JAVA猜字谜的小程序,内涵源代码,项目文件,直接放到Ec里就可以运行,但是没有界面,只能在控制台操作,希望能帮助到你们