具体请关注
http://www.xiaos8.com/?cat=19
原文章出至
http://www.xiaos8.com/article.asp?id=131
老规矩先来一个例子
http://www.xiaos8.com/uploads/flash/ChatRecord.swf
一个很简单的聊天记录显示类,你可以聚合这个类实现功能更强大的聊天记录显示类
类讲解:
index.bat.containers.ChatRecord类:
代码:public class ChatRecord extends TextField
用来显示聊天记录
构造函数:
public function ChatRecord(isDefaultStyle:Boolean = true)
参数表示是否使用默认外观
addRecord方法:
public function addRecord(_format:String,parameter:Object):void
添加记录
第一个参数是表示使用指定格式
第二个是参数集,其中可以含有self,you,content,system,4个变量
setFormat方法:
public function setFormat(mark:String,_format:Object):void
设定格式
第一个参数表示该格式的标记字符
第二个表示格式,举例:{text:"$self对$you说:$content",head:"【说话】"}
clear方法:
public function clear():void
清除类中引用,一旦调用则表示类无法在继续使用
isAuto属性:
public var isAuto:Boolean = true
设定是否自动滚动滚动条
颜色属性:
public var contentColor:String = "ffffff";//内容颜色
public var selfColor:String = "66ccff";//说话者颜色
public var youColor:String = "66ccff";//听者颜色
public var systemColor:String = "ff0000";//系统颜色
public var asideColor:String = "ffffff";//旁白颜色
public var headColor:String = "ff0000";//头部颜色
各种字符串的颜色设定
事件:
使用setFormat设置格式后,通过addRecord添加进来的self和you通通都会自动加上event事件,当用户点击由$self和$you演变过来的字符串,将触发TextEvent.LINK事件,并且访问事件的text属性,可以返回所点击的字符串,具体请看例子!
举例:(就是上面展示flash的源码)
复制内容到剪贴板
代码:
import index.bat.containers.ChatRecord;
var record:ChatRecord = new ChatRecord;
record.width = stage.stageWidth;
record.height = stage.stageHeight;
addChild(record);
//语言格式
record.setFormat("chat",{text:"$self对$you说:$content",head:"【说话】"});
record.setFormat("scope",{text:"$self说:$content",head:"【区域】"});
record.setFormat("login",{text:"$self进来了",head:"【系统通知】"});
record.setFormat("alert",{text:"$system",head:"【系统提示】"});
record.setFormat("warn",{text:"$system",head:""});
record.setFormat("laugh",{text:"$self看着$you哈哈大笑!",head:"【动作】"});
record.setFormat("article",{text:"今天风和日丽,$self和$you一起到郊外玩。",head:"【叙述】"});
//添加记录
record.addRecord("alert",{system:"正在连接服务器……"});
record.addRecord("alert",{system:"连接成功!"});
record.addRecord("login",{self:"小S"});
record.addRecord("chat",{content:"测试",self:"sunbright",you:"大家"});
record.addRecord("scope",{content:"大家好啊!",self:"小S"});
record.addRecord("warn",{system:"你掉线了!"});
record.addRecord("laugh",{self:"sunbright",you:"小S"});
record.addRecord("article",{self:"sunbright",you:"小S"});
record.addRecord("chat",{content:"小S,你好啊",self:"sunbright",you:"小S"});
record.addRecord("chat",{content:"$you,你好啊",self:"小S",you:"sunbright"});
record.addRecord("scope",{content:"测试结果还是很不错的!",self:"sunbright"});
//侦听LINK事件,以便获取当前点击的字符串
record.addEventListener(TextEvent.LINK,linkFun);
function linkFun(e:TextEvent){
te.text = "当前选中 " + e.text;
}如果你觉得在写addRecord的时候,一大堆这些东西比较麻烦,你也可以采用有针对性的写个方法,比如:
复制内容到剪贴板
代码:
chat("试试","sunbright","大家");
function chat(_content:String,_self:String,_you:String):void{
record.addRecord("chat",{content:_content,self:_self,you:_you});
}或者你想实现更大的功能,比如保存记录等等
你可以是先实现数据层的记录保存,然后与该类进行聚合的方式写一个容器类,来实现自己想要的东西
下面是类源代码:
复制内容到剪贴板
代码:
/**
* 指令编辑讲解:
* $self :表示自己
* $you :表示对方
* $content:表示内容
* $system :表示系统
*/
package index.bat.containers{
import flash.text.TextField;
import flash.text.TextFormat;
import flash.filters.DropShadowFilter;
public class ChatRecord extends TextField{
private var formatObj:Object = new Object;
//自动滚屏
public var isAuto:Boolean = true;
//颜色设置
public var contentColor:String = "ffffff";//内容颜色
public var selfColor:String = "66ccff";//说话者颜色
public var youColor:String = "66ccff";//听者颜色
public var systemColor:String = "ff0000";//系统颜色
public var asideColor:String = "ffffff";//旁白颜色
public var headColor:String = "ff0000";//头部颜色
public function ChatRecord(isDefaultStyle:Boolean = true){
if(isDefaultStyle){
var textStyle:TextFormat = new TextFormat("宋体");
textStyle.leading = 3;
defaultTextFormat = textStyle;
width = 300;
height = 160;
wordWrap = multiline = true;
filters = [new DropShadowFilter(0,0,0,1,2,2,100)];
textStyle = null;
}
htmlText = "";
}
//添加记录,参数项:content,system,self,you
public function addRecord(_format:String,parameter:Object):void{
if(formatObj[_format]){
var formatObj:Object = formatObj[_format];
var formatStr:String = formatObj.text;
formatStr = color(headColor,formatObj.head) + formatStr;
if(formatStr.indexOf("$content") != -1) formatStr = formatStr.replace(/\$content/g,color(contentColor,parameter.content));
if(formatStr.indexOf("$system") != -1) formatStr = formatStr.replace(/\$system/g,color(systemColor,parameter.system));
if(formatStr.indexOf("$self") != -1) formatStr = formatStr.replace(/\$self/g,color(selfColor,event(parameter.self)));
if(formatStr.indexOf("$you") != -1) formatStr = formatStr.replace(/\$you/g,color(youColor,event(parameter.you)));
formatStr = last(formatStr);
htmlText += formatStr;
formatObj = null;
if(isAuto) scrollV = maxScrollV;
}else{
throw new Error("找不到 " + _format + " 格式!");
}
}
//添加格式,Object格式:{text:"$self对$you说:$content",head:"【说话】"}
public function setFormat(mark:String,_format:Object):void{
formatObj[mark] = _format;
}
//清除类中引用
public function clear():void{
formatObj = null;
}
//颜色代码生成
private function color(_color:String,str:String):String{
return "<font color=\"#" + _color + "\">" + str + "</font>";
}
//事件代码生成
private function event(_event:String):String{
return "<a href=\"event:" + _event + "\">" + _event + "</a>"
}
//最终完成代码
private function last(str:String):String{
return "<p>" + color(asideColor,str) + "</p>";
}
}
}