`
sooxin
  • 浏览: 257626 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

谜一样的TextField

阅读更多

文章来之: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的边界都无法输出。

分享到:
评论

相关推荐

    初中语文文摘历史谜一样的东方精神

    初中语文文摘历史谜一样的东方精神

    小游戏:9谜和15谜问题

    【标题】:“小游戏:9谜和15谜问题” 这个标题指的是两个经典的逻辑谜题,9谜(也称为8皇后问题的变体)和15谜(通常被称为十五拼图)。这两个游戏都涉及到在特定的网格布局上移动棋子或数字,目标是达到一个特定的...

    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谜思Java谜思...

    C#开发游戏程序设计大作业室内解谜qwq游戏源代码.zip

    C#开发游戏程序设计大作业室内解谜qwq游戏源代码C#开发游戏程序设计大作业室内解谜qwq游戏源代码C#开发游戏程序设计大作业室内解谜qwq游戏源代码C#开发游戏程序设计大作业室内解谜qwq游戏源代码。C#开发游戏程序设计...

    炎龙骑士团2黄金城之谜.exe

    《炎龙骑士团 2:黄金城之谜》是一款由汉堂国际资讯出版的战略角色扮演游戏,于 1995 年 7 月发行。该游戏是《炎龙骑士团》系列的第二部作品,也是该系列中最受欢迎的作品之一。 游戏的故事背景设定在一个虚构的世界...

    小学英语英语故事名人故事谜一样的莎士比亚

    他的教育经历也是个谜,有人认为他在6岁时开始上文法学校,但缺乏确凿证据,且没有大学记录,这引发了一些人质疑他是否为作品的真正作者。 3. 早年教育:莎士比亚的教育情况不详,可能在斯特拉福的文法学校接受基础...

    《蓝田之谜》全文.pdf

    《蓝田之谜》全文.pdf 《蓝田之谜》全文.pdf 是一篇详细的研究报告,分析蓝田股份的财务报表,探讨其偿债能力、农副水产品销售收入等方面的分析结果。报告使用了国际通用的分析方法,分析了蓝田股份的招股说明书到...

    15谜(15-puzzle)问题的求解

    15谜问题,又称为15滑块游戏或15拼图,是一个经典的逻辑和智力挑战,玩家需要通过滑动15个数字方块到一个4x4的网格上,使得数字顺序从1到15排列,空白格通常位于右下角。这个谜题在信息技术和人工智能领域具有重要的...

    java猜字谜游戏

    在本文中,我们将深入探讨如何使用Java编程语言来制作一个简单的猜数字游戏,也就是我们所说的“猜字谜”。这个游戏的基本概念是程序会随机生成一个数字,玩家需要猜测这个数字,然后程序会根据玩家的猜测给出反馈,...

    猜字谜.zip

    标题中的“猜字谜.zip”表明这是一个包含了JAVA编程语言实现的猜字谜游戏的压缩文件。这个小游戏可能是一个命令行应用程序,因为描述中提到没有图形用户界面(GUI),所有的交互都将在控制台进行。 首先,我们需要...

    Unity2D解谜类游戏实例项目CottonPuzzle完整代码实现(可直接运行)

    在该项目中通过unity实现了一个2D解谜类游戏的所有基本功能,包括背包系统、场景切换、解谜类小游戏、数据存储等。通过该项目可以对一个游戏项目的架构有一个更为清晰的认识,同时在本项目中也使用了许多unity自带的...

    Visual Basic 猜字谜

    《Visual Basic 猜字谜》是一款利用Visual Basic编程语言设计的小游戏,旨在帮助学生以趣味的方式学习和掌握编程基础知识。Visual Basic是Microsoft公司推出的一种面向对象的编程环境,尤其适合初学者上手。这款猜字...

    硅谷创新之谜

    硅谷创新之谜 硅谷,这一位于美国加利福尼亚州北部的狭长地带,成为了全球创新与科技发展的象征。其成功的原因是多方面的,包含了独特的地理位置、优秀的教育机构、活跃的风险投资环境、政府政策的支持,以及独特的...

    T字之谜的图解

    从给定的信息来看,我们似乎在探讨一个名为“T字之谜”的主题,这可能是一种图形谜题或逻辑游戏,其核心在于通过一系列编码、图案和轮廓来揭示谜底或解决谜题。虽然直接从提供的内容中提取具体的IT知识点较为困难,...

    《动物游戏之谜》.ppt

    《动物游戏之谜》科普知识点总结 一、动物游戏之谜的科普知识点 1. 动物游戏的定义:动物游戏是指动物在非生存需要的情况下,为了娱乐、学习、社会互动等目的所进行的行为。 2. 动物游戏的类型:包括单独游戏、...

    教师招聘、教师资格证面试小学语文《月球之谜》试讲稿.pdf

    教师招聘、教师资格证面试小学语文《月球之谜》试讲稿.pdf

    世界上最昂贵私人住宅谜一样的赫氏堡.docx

    【赫氏堡简介】 赫氏堡,位于美国加利福尼亚州圣西缅,是世界上最昂贵的私人住宅之一,由报业大亨威廉·鲁道夫·赫斯特在1919年开始建造。这座宏大的建筑群占地约27万英亩,宛如一座小型王国,展现了20世纪初期的...

    小学数学数学故事招贤谜阵

    首先,我们要理解郑成功的招贤谜阵所设置的元素:清水一碗、宝剑一把、熄灭的蜡烛一支,以及火刀、火石和火绒。这些物品看似平常,但它们组合在一起却构成了一个考验智慧的问题。 宝剑代表武力,清水则象征纯洁和...

    【《动物迁徙之谜》阅读答案】 动物迁徙之谜.docx

    《动物迁徙之谜》是一篇关于动物迁徙行为及其导航机制的科普文章。迁徙是许多动物为了生存和繁衍而进行的长途旅行。文章通过举例,详细描绘了不同动物如绿海龟、火烈鸟以及昆虫们的迁徙壮举。 绿海龟长途跋涉至...

Global site tag (gtag.js) - Google Analytics