2010 年 04 月 22 日 17:58:44 (L4CD.NET) / /
这两个月一直让Flash的BUG搞得要死不活的...
这里提一个FP10.1的BUG..
而且也是跟中文有关系...
一切原由是因为这里
扩展TextField,合理计算中文字符长度在private function input(e:TextEvent):void的函数里
使用了selectionBeginIndex和selectionEndIndex
获取用户在操作前的选择位置.. 以便进行文本替换...
这个方法一直用得好好的
从fp9到fp10
从activex到plugin
但最近开始..时常有用户反应输入时出现问题..
后来发现出现问题的用户都升级到了10.1版本的播放器..
排查后发现..问题就出在selectionBeginIndex和selectionEndIndex这两个属性
在FP10.1下..
"输入中文"时
selectionBeginIndex的索引是操作后的索引...而不是操作前的索引
FP10.1下的"输入英文"或"粘贴中文"均纷纷表示无这样的情况..
FP10和FP9也表示与自己无关...
详情看DEMO
查看文章剩余部份
2009 年 06 月 16 日 00:21:15 (L4CD.NET) / /
由于在储存与显示中文字符的时候..
每个中文字符都占用两个英文字符的位置(显示以宋体为准,特殊字符除外)..
所以我们经常在留言~标题~名称等应用上~需要对中文字符长度进行处理并限制...
最近在做一个许愿的项目..也遇到了这样的问题...
以前的方法是侦听Event.CHANGE事件在每次内容修改的时候对内容进行裁剪...
这种做法有二缺点:
1.内容会先显示出来..然后再剪掉..视觉上会"闪"一下
2.如果我焦点在中间~那输入后会剪掉尾部的内容
今天重点整理了一下~从TextEvent.TEXT_INPUT事件入手..在内容到显示前先对内容运行处理..
视觉和功能上都可以满足需求..
先看看效果:
//Copyright © 2009. Http://L4cd.Net All Rights Reserved.
package net.L4cd.display
{
import flash.events.Event;
import flash.events.TextEvent;
import flash.text.TextField;
import flash.utils.ByteArray;
/**
* 扩展TextField类,中文以2字符长度计算
*
* @author L4cd.Net
* @playerversion Flash player 9
* @langversion 3.0
* @version 2009-06-16
*/
public class TextFieldExt extends TextField
{
private var _maxChars:int = -1;
public function TextFieldExt()
{
super();
}
override public function get maxChars():int
{
return _maxChars;
}
override public function set maxChars(value:int):void
{
_maxChars = value;
if(maxChars<0)
{
removeEventListener(TextEvent.TEXT_INPUT,input);
}else
{
addEventListener(TextEvent.TEXT_INPUT,input);
text = getTextByCharLength(text,maxChars);
}
}
override public function get length():int
{
return getCharLength(text);
}
private function input(e:TextEvent):void
{
//拦截并阻止textinput事件,手动处理内容输入
var textField:TextField = e.currentTarget as TextField;
var temp:String = getTextByCharLength(e.text,maxChars - getCharLength(text) + getCharLength(selectedText));
var index:int = selectionBeginIndex;
replaceText(selectionBeginIndex,selectionEndIndex,temp);
setSelection(index+temp.length,index+temp.length);
dispatchEvent(new Event(Event.CHANGE,true));
e.preventDefault();
}
/**
* 获取字符长度,一个中文算2长度
* @param txt
* @return 返回长度值
*/
private function getCharLength(txt:String):int
{
var byte:ByteArray = new ByteArray();
byte.writeMultiByte(txt,"gb2312");
byte.position = 0;
return byte.bytesAvailable;
}
/**
* 截取指定长度的文本内容,一个中文算2长度
* @param txt 需要截取的文本
* @param length 需要截取的长度
* @return 截取后的内容
*/
private function getTextByCharLength(txt:String,length:int):String
{
if(length<1)return "";
var byte:ByteArray = new ByteArray();
byte.writeMultiByte(txt,"gb2312");
byte.position = 0;
return byte.readMultiByte(Math.min(length,byte.bytesAvailable),"gb2312");
}
}
}
2009 年 05 月 21 日 00:05:48 (L4CD.NET) / /
在Flash IDE下..我们直接使用
txt.html = "这里显示一张库里的图片<img src='库id'/>";
即可把库里的图像显示到文本框内
查看文章剩余部份
2009 年 04 月 27 日 17:19:08 (L4CD.NET) / /
在TextField中有一个replaceText的函数..
可以让我们方便的替换/插入字符..
可当我们使用像textField.replaceText(2,2,"<i>html content</i>");时
"<i>html content</i>"并不会当作是htmlText插入...而是当作是纯文本插入..
查看文章剩余部份
2008 年 11 月 09 日 00:14:52 (L4CD.NET) / /
这个问题见到很多朋友问过..
TextField没有buttonMode的方法..
不过由于TextField支持html的A标签..所以我们可以用最简单的方法来模拟~
var txt:TextField = new TextField();
txt.x = 10;
txt.y = 10;
txt.autoSize = "left";
txt.selectable = false;
txt.htmlText = "<a href='event:#'>显示手形的TextField</a>";
addChild(txt)
另外我们在A标签的href里使用event:#,把原来的跳转页面的动作转移给了TextEvent的LINK事件..就算点击了也不会弹出页面..
另外..如果只是因为TextField所在的parent设置了buttonMode..
可是当用户鼠标移动到TextField上时还是不移动手型..
像这样的情况..
一般只需要设置TextField的mouseEnable或该parent的mouseChildren为false即可..
当然实际情况得看你的TextField或其它子对象是否需要鼠标交互...