实例介绍
【实例简介】
【实例截图】
【核心代码】
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" >
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
[Bindable]
public var userListData:ArrayCollection = new ArrayCollection();
import Bll.Message;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.Label;
private var talk_so:SharedObject;
private var netConnection:NetConnection;
private var outNetStream:NetStream;
private var camera:Camera;
private var microphone:Microphone;
private var responder:Responder;
private var appServer:String="rtmp://192.168.0.249/test_video3";
private var username:String="";
private function init(evt:MouseEvent):void
{
var str:String=this.txt_username.text;
if ( str== "" || str=="输入你的名字" )
{
Alert.show("进入聊天室前请输入你的英文名字");
return;
}
netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
netConnection.connect(appServer);
netConnection.client=this;
}
private function initMedia():void
{
outNetStream = new NetStream(netConnection);
camera = Camera.getCamera();
if ( camera == null )
{
if ( Camera.names.length > 0 )
{
Alert.show( "摄像头被其他程序占用");
}
else
{
Alert.show( "系统没有检测到摄像头,建议您安装摄像头");
}
}
else
{
camera.setMode(120,90,15);
camera.setQuality(0,90);
//camera.addEventListener(StatusEvent.STATUS,statusCamera);
outNetStream.attachCamera(camera);
}
microphone=Microphone.getMicrophone();
if ( microphone==null )
{
if ( Microphone.names.length > 0 )
{
Alert.show( "麦克风被其他程序占用");
}
else
{
Alert.show( "系统没有检测到麦克风,建议您安装麦克风");
}
}
else
{
outNetStream.attachAudio(microphone);
}
if ( camera )
{
outNetStream.publish(txt_username.text,"live");
vd_myVideo.attachCamera(camera);
}
else
{
outNetStream.close();
outNetStream=null;
}
}
private function netStatusHandler(evt:NetStatusEvent):void
{
trace(evt.info.code);
var info:Object = evt.info;
switch(info.code)
{
case "NetConnection.Connect.Success":
this.txt_content.addEventListener(FlexEvent.VALUE_COMMIT,VALUE_COMMITHandler);
this.txt_message.addEventListener(KeyboardEvent.KEY_DOWN,sendKeyHandler);
initMedia();
startCommunicate();
talk_so = SharedObject.getRemote("talk",netConnection.uri,true);
talk_so.addEventListener(SyncEvent.SYNC,talkSoSyncHandler);
talk_so.connect(netConnection);
break;
case "NetConnection.Connect.Rejected":
Alert.show("fms连接被拒绝" info.code);
break;
case "NetConnection.Connect.Failed":
Alert.show("fms连接失败" evt.info.code);
break;
case "NetConnection.Connect.Closed":
Alert.show("fms连接已经关闭" evt.info.code);
break;
}
}
private function talkSoSyncHandler(evt:SyncEvent):void
{
txt_content.text="";
if ( talk_so.data.msgList!=null )
{
var tmp:ArrayCollection = new ArrayCollection();
convertArrayCollection(tmp,talk_so.data.msgList as ArrayCollection);
for(var i:int=0;i<tmp.length ;i )
{
var message:Object = tmp.getItemAt(i);
var time:Date= message.time;
var dd:String = time.getFullYear().toString()
"-" (time.getMonth() 1).toString()
"-" time.getDate().toString()
" "
time.getHours().toString()
":" time.getMinutes().toString()
":" time.getSeconds().toString();
var fullMsg:String=message.nickname "在" dd "说:" message.msg;
txt_content.text=txt_content.text "\n" fullMsg;
}
}
}
private function VALUE_COMMITHandler(evt:FlexEvent):void{
txt_content.verticalScrollPosition = txt_content.maxVerticalScrollPosition;
}
private function startCommunicate():void
{
username=txt_username.text;
responder=new Responder(communicateStataHandler);
netConnection.call("communicateServer",responder,username);
}
private function communicateStataHandler(str:String):void
{
//outMyVideo();
btn_start.enabled=false;
txt_nickname.text=txt_username.text;
btn_send.enabled=true;
}
private function outMyVideo():void
{
/* 发布视频 */
outNetStream = new NetStream(netConnection);
outNetStream.attachCamera(camera);
outNetStream.attachAudio(microphone);
outNetStream.publish(username,"live");
}
public function showServerMsg(msg:String):void
{
Alert.show(msg);
}
private function sendKeyHandler(evt:KeyboardEvent):void
{
if(evt.keyCode == 13)
{
this.sendTxt();
}
}
private function btnSenClickHandler(evt:MouseEvent):void
{
this.sendTxt();
}
private function sendTxt():void
{
if ( txt_message.text=="" || txt_message.text=="请输入发言内容" )
{
Alert.show("请输入发言内容");
return;
}
var arr:ArrayCollection = new ArrayCollection();
if ( talk_so.data.msgList==null )
{
arr = new ArrayCollection();
}
else
{
convertArrayCollection(arr,talk_so.data.msgList as ArrayCollection);
}
var obj:Message = new Message();
obj.nickname=txt_nickname.text;
obj.msg=txt_message.text;
obj.time = new Date();
arr.addItem(obj);
talk_so.setProperty("msgList",arr);
txt_message.text="";
}
private function convertArrayCollection(arrNew:ArrayCollection,arrOld:ArrayCollection):void
{
arrNew.removeAll();
for(var i:int=0;i<arrOld.length ;i )
{
arrNew.addItemAt(arrOld.getItemAt(i),i);
}
}
public function playOtherVideo(newUserList:Array):void
{
vb_otherVideo.removeAllChildren();
this.userListData.removeAll();
for(var i:int=0;i<newUserList.length;i )
{
if ( newUserList[i]!= txt_username.text )
{
var vd:VideoDisplay = new VideoDisplay();
var video:Video = new Video();
video.width=120;
video.height=90;
var inNetStream:NetStream= new NetStream(netConnection);
video.attachNetStream(inNetStream);
trace(newUserList[i]);
inNetStream.play(newUserList[i]);
var label:Label= new Label();
label.text=newUserList[i] "的画面";
vd.addChild(video);
vd.width=120;
vd.height=90;
vb_otherVideo.addChild(label);
vb_otherVideo.addChild(vd);
}
var obj:Object = new Object();
obj.label=newUserList[i];
obj.data = i;
this.userListData.addItem(obj);
}
}
/*
<mx:Style>
TextArea {
dropShadowEnabled: true;
}
</mx:Style>
是为了给控件显示阴影效果
camera = Camera.getCamera();
if ( camera == null )
{
if ( Camera.names.length > 0 )
{
Alert.show( "摄像头被其他程序占用");
}
else
{
Alert.show( "系统没有检测到摄像头,建议您安装摄像头");
}
}
是为了检测摄像头的使用情况
你也可以用事件监听camera.addEventListener(StatusEvent.STATUS,statusCamera);来确定摄像头的状态调度
this.txt_content.addEventListener(FlexEvent.VALUE_COMMIT,VALUE_COMMITHandler);
private function VALUE_COMMITHandler(evt:FlexEvent):void{
txt_content.verticalScrollPosition = txt_content.maxVerticalScrollPosition;
}
这段代码是为了实现TextArea控件的滚动条始终保持在最下面,以方便用户查看聊天信息
this.txt_message.addEventListener(KeyboardEvent.KEY_DOWN,sendKeyHandler);
private function sendKeyHandler(evt:KeyboardEvent):void
{
if(evt.keyCode == 13)
{
this.sendTxt();
}
}
这段代码是实现在TextInput控件中回车就发言的事件
代码可能写得比较乱,功能还不完善
计划下步做以下事情的开发:
一对一聊天,包括私聊
聊天记录的保存和查询(我计划用Adobe AIR中自带的Sqlite数据库来实现,据网络一文章说qq的聊天记录也是保存在Sqlite中,不知道是否为真?)
关于sqlite的相关文章可以看
http://www.cnblogs.com/aierong/archive/2009/01/22/flex_Sqlite_1.html
聊天白板功能
本文的部分代码编写过程中参考了qq网友(SakuraMomoko)blog中的文章,这此表示感谢!
*/
]]>
</mx:Script>
<mx:Style>
Application {
backgroundImage: Embed(source="assets/brushedmetal.jpg");
}
ToolTip {
backgroundColor: #000000;
color: #cc0033;
fontSize: 12;
fontWeight: bold;
}
TextArea {
dropShadowEnabled: true;
}
TextInput {
dropShadowEnabled: true;
}
List {
borderStyle: solid;
borderThickness: 5;
dropShadowEnabled: true;
fontWeight: bold;
cornerRadius: 20;
}
</mx:Style>
<mx:Label x="10" y="99" text="你的画面"/>
<mx:VideoDisplay x="10" y="127" width="120" height="90" id="vd_myVideo"/>
<mx:TextInput x="10" y="10" text="输入你的名字" id="txt_username" width="120" focusIn="txt_username.text=''" toolTip="进入聊天室前请输入你的英文名字"/>
<mx:Button x="10" y="42" label="进入聊天室" id="btn_start" width="120" click="init(event)"/>
<mx:VBox x="10" y="225" width="120" id="vb_otherVideo">
</mx:VBox>
<mx:TextArea showScrollTips="true" cornerRadius="5" editable="false" x="138" y="58" height="187" width="300" id="txt_content"/>
<mx:TextInput x="138" y="253" width="62" id="txt_nickname"/>
<mx:Label x="208" y="255" text="说"/>
<mx:TextInput x="238" y="253" width="136" id="txt_message" text="请输入发言内容" focusIn="txt_message.text=''" toolTip="请输入发言内容,回车即可发言" />
<mx:Button x="382" y="253" label="发言" id="btn_send" width="57" enabled="false" click="btnSenClickHandler(event)"/>
<mx:Label x="138" y="30" text="聊天区(成功登陆后,可以与其他人进行文章聊天)" width="301" id="lb"/>
<mx:List x="446" y="56" id="userList" dataProvider="{userListData}" height="189" width="98"></mx:List>
<mx:Label x="447" y="30" text="用户列表"/>
</mx:Application>
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论