TextField 相关的文章

Flash Player 10.1的BUG~

这两个月一直让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
查看文章剩余部份
分类: BUG , 标签: , ,

扩展TextField,合理计算中文字符长度

由于在储存与显示中文字符的时候..
每个中文字符都占用两个英文字符的位置(显示以宋体为准,特殊字符除外)..

所以我们经常在留言~标题~名称等应用上~需要对中文字符长度进行处理并限制...

最近在做一个许愿的项目..也遇到了这样的问题...
以前的方法是侦听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");
		}
	}
}
分类: ACTIONSCRIPT , 标签: , ,

AS工程下,使用TextField的IMG标签显示Embed的图片

在Flash IDE下..我们直接使用
txt.html = "这里显示一张库里的图片<img src='库id'/>";
即可把库里的图像显示到文本框内
查看文章剩余部份
分类: ACTIONSCRIPT , 标签: , ,

TextField.replaceHtmlText

在TextField中有一个replaceText的函数..
可以让我们方便的替换/插入字符..
可当我们使用像textField.replaceText(2,2,"<i>html content</i>");时
"<i>html content</i>"并不会当作是htmlText插入...而是当作是纯文本插入..
查看文章剩余部份
分类: ACTIONSCRIPT , 标签: ,

让鼠标移动于TextField上方时显示为手型

这个问题见到很多朋友问过..
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或其它子对象是否需要鼠标交互...
分类: ACTIONSCRIPT , 标签: ,