`
sooxin
  • 浏览: 250581 次
  • 性别: 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的边界都无法输出。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics