打印

[AS3] ActionScript 3.0 自写类整理笔记(十五)——ChatRecord类

具体请关注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>";
        }
        
    }
    
}
本帖最近评分记录
  • enc0717 威望 +2 谢谢分享 2008-5-8 08:47
www.xiaos8.com

TOP

收藏!很有用的东东

TOP

不错啊

收藏了啊

TOP

不错!!
止于至善

TOP

呵呵。。可以改一下做个debug输出类啦。。

TOP

debug会不会显得太麻烦额。。。倒是把效果去掉,还真可以。。呵呵
扩展这个类写,构造函数中调用一下 super(false)
然后写一些特定好了的外部方法,还是可以,但觉得独立去写更好。。
www.xiaos8.com

TOP