很想和大家学习交流,把在下做的整个饭否客户端MXML源码源代码发出来。欢迎诸位前辈指教。
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();" width="600" height="680" currentState="login" borderStyle="none">
<!--驱动行为-->
<mx:Script>
<![CDATA[
import flash.net.*;
import flash.xml.*;
import flash.events.Event;
import flash.events.ProgressEvent;
import mx.states.*;
import mx.controls.Image;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
private const mainTitle:String="饭否";
private const TAB:String=" ";
private const BR:String=String.fromCharCode(13);
private const FRIENDS:Number=0;
private const USER:Number=1;
private var mXML:XML=new XML();
private var userInfoList:XMLList=new XMLList();
private var urlR:URLRequest=new URLRequest();
private var loginName:String=new String();
private var loginPass:String=new String();
private var loginId:String=new String();
private var screenName:String=new String();
private var msgType:Number=new Number();//记录当前阅读的消息种类(朋友OR用户)
private var msgId:String=new String();//记录当前阅读的消息id
private var userProfileImg:String=new String();//记录用户头像
private function init():void{
//urlL.addEventListener(IOErrorEvent.IO_ERROR,ioErr);
msgType=FRIENDS;//初始化首次阅读消息种类
urlR.method="post";
}
private function ioErr(e:Event):void{
Alert.show("网络传输错误","错误信息",4,null,errOk);
}
private function errOk(e:Event):void{
reLogin();
}
private function showResponse(e:Event):void{
/*debug.text =("-------Response:-------"+BR);
debug.text+=("loginId:"+loginId+BR);
debug.text+=("loginName:"+loginName+BR);
debug.text+=("loginPass:"+loginPass.substr(0,2)+"*"+BR);
debug.text+=("URL:"+urlR.url+BR);
debug.text+=("Method:"+urlR.method+BR);
debug.text+=("Response Data:"+BR+e.currentTarget.data+BR);*/
}
/*注册新用户*/
private function regUser():void{
urlR.url="http://fanfou.com/register/Y9Pn-ZEOjd1S";
navigateToURL(urlR);
}
/*用户登陆信息记录*/
private function login(logName:String,logPass:String):void{
btnLog.enabled=false;
btnLog.label="登陆中..."
loginName=logName;
loginPass=logPass;
urlR.setLoginCredentials(loginName,loginPass);
getUserInfo();
}
private function reLogin():void{
btnLog.enabled=true;
btnLog.label="登陆"
yzFail.text="";
currentState="login";
}
/*验证、获取用户信息*/
private function getUserInfo():void{
urlR.url="http://api.fanfou.com/users/show.xml";
var urlL:URLLoader=new URLLoader();
urlL.load(urlR);
urlL.addEventListener(IOErrorEvent.IO_ERROR,ioErr);
urlL.addEventListener(Event.COMPLETE,getUserInfoOk);
}
private function getUserInfoOk(e:Event):void{
if(e.currentTarget.data=="验证失败"){
reLogin();
yzFail.text="验证失败,重新输入帐户密码";
}else{
var tmpXML:XML=XML(e.target.data);
screenName=tmpXML.screen_name;
loginId=tmpXML.id.toString();
currentState="main";
mainPane.title=(mainTitle+"("+screenName+")");
userProfileImg=tmpXML.profile_image_url.toString()
profileImg.load(userProfileImg);
userStatus.text=tmpXML.status.text;
userInfo.text=screenName+TAB+tmpXML.friends_count+"个好友"+TAB+tmpXML.followers_count+"个关注者"+TAB+tmpXML.favourites_count+"个分享"+TAB+tmpXML.statuses_count+"个消息";
switch(msgType){
case USER:
getUserMsg();
break;
case FRIENDS:
default:
getFriendsMsg();
break;
}
showResponse(e);
}
}
/*获取好友与自己的发言*/
private function getFriendsMsg():void{
msgType=FRIENDS;
tBtn.enabled=false;
urlR.url="http://api.fanfou.com/statuses/friends_timeline.xml?id="+loginId;
var urlL:URLLoader=new URLLoader();
urlL.load(urlR);
urlL.addEventListener(IOErrorEvent.IO_ERROR,ioErr);
urlL.addEventListener(Event.COMPLETE,showFriendsMsg);
}
private function showFriendsMsg(e:Event):void{
showResponse(e);
mXML=XML(e.target.data);
tBtn.enabled=true;
fMsgDat.removeAll();
for(var i:Number=0;i<mXML.status.length();i++){
var O:Object=new Object();
O.screen_name=mXML.status[i].user.screen_name;
O.profileImg=mXML.status[i].user.profile_image_url;
O.text=mXML.status[i].text;
O.created_at=mXML.status[i].created_at;
fMsgDat.addItem(O);
}
dataGird1.dataProvider=fMsgDat;
}
/*获取用户的发言*/
private function getUserMsg():void{
msgType=USER;
tBtn.enabled=false;
urlR.url="http://api.fanfou.com/statuses/user_timeline.xml?id="+loginId;
var urlL:URLLoader=new URLLoader();
urlL.load(urlR);
urlL.addEventListener(IOErrorEvent.IO_ERROR,ioErr);
urlL.addEventListener(Event.COMPLETE,showUserMsg);
}
private function showUserMsg(e:Event):void{
showResponse(e);
mXML=XML(e.target.data);
tBtn.enabled=true;
dataGird2.dataProvider=mXML.status;
}
/*获取指定消息*/
/*发送信息*/
private function sendMsg(msg:String):void{
var urlV:URLVariables=new URLVariables();
var urlL:URLLoader=new URLLoader();
btnSendMsg.enabled=false;
btnSendMsg.label="Sending...";
urlR.url="http://api.fanfou.com/statuses/update.xml";
urlV.status=msg;
urlR.data=urlV;
urlL.load(urlR);
urlL.addEventListener(IOErrorEvent.IO_ERROR,ioErr);
urlL.addEventListener(Event.COMPLETE,sendMsgOk);
}
private function sendMsgOk(e:Event):Boolean{
urlR.data=null;
btnSendMsg.enabled=true;
btnSendMsg.label="发送";
inputBox.text="";
getUserInfo();
freshWords();
showResponse(e);
return true;
}
/*删除某篇发言*/
private function destroyMsg(id:String):void{
btnDelMsg.label="删除中...";
btnDelMsg.enabled=false;
urlR.url="http://api.fanfou.com/statuses/destroy.xml?id="+id;
var urlL:URLLoader=new URLLoader();
urlL.load(urlR);
urlL.addEventListener(IOErrorEvent.IO_ERROR,ioErr);
urlL.addEventListener(Event.COMPLETE,destroyMsgOk);
}
private function destroyMsgOk(e:Event):Boolean{
btnDelMsg.label="删除本条";
btnDelMsg.enabled=true;
showResponse(e);
closeMsg();
getUserInfo();
return true;
}
/*允许输入字数*/
private function freshWords():void{
var num:Number=(140-inputBox.text.length);
num=num>0?num:0;
allowWords.text="可以输入"+(num.toString())+"字";
}
/*点击朋友或用户信息*/
private function tBtnClick():void{
switch(tBtn.selectedIndex){
case 0:
getFriendsMsg();
break;
case 1:
getUserMsg();
break;
}
}
/*显示信息全文*/
private function showMsg():void{
switch(tBtn.selectedIndex){
case 0:
msgExplorer.title="我和我的好友做过:";
msgContent.text=dataGird1.selectedItem.text;
msgInfo.text="于"+dataGird1.selectedItem.created_at+"记录:";
msgImg.load(dataGird1.selectedItem.profileImg);
btnDelMsg.visible=false;
break;
case 1:
msgExplorer.title="我曾做过:";
msgContent.text=dataGird2.selectedItem.text;
msgInfo.text="于"+dataGird2.selectedItem.created_at+"记录:";
msgImg.load(userProfileImg);
msgId=dataGird2.selectedItem.id.toString();
btnDelMsg.visible=true;
break;
}
msgExplorer.visible=true;
}
/*关闭信息显示*/
private function closeMsg():void{
msgExplorer.visible=false;
}
]]>
</mx:Script>
<!--动画行为-->
<mx:transitions>
<mx:Transition fromState="*" toState="login">
<mx:Dissolve alphaFrom="0.0" alphaTo="1.0" duration="500" target="{mainPane}"/>
</mx:Transition>
<mx:Transition id="myTransition" fromState="login" toState="main">
<mx:Parallel>
<mx:Move duration="500" target="{mainPane}"/>
<mx:Resize duration="500" target="{mainPane}"/>
<mx:Dissolve alphaFrom="0.0" alphaTo="1.0" duration="500" target="{mainPane}"/>
</mx:Parallel>
</mx:Transition>
</mx:transitions>
<mx:Fade alphaFrom="1.0" alphaTo="0.0" duration="400" id="effHide"/>
<mx:Dissolve alphaFrom="0.0" alphaTo="1.0" duration="500" id="effShow"/>
<!--数据-->
<mx:ArrayCollection id="fMsgDat" />
<!--表现-->
<mx:Style source="global.css" />
<mx:states>
<mx:State name="login">
<mx:AddChild relativeTo="{mainPane}" position="lastChild">
<mx:TextInput x="62" y="26" id="username" enter="userpass.setFocus();"/>
</mx:AddChild>
<mx:AddChild relativeTo="{mainPane}" position="lastChild">
<mx:Label x="15" y="28" text="Email"/>
</mx:AddChild>
<mx:AddChild relativeTo="{mainPane}" position="lastChild">
<mx:Label x="14" y="56" text="密 码"/>
</mx:AddChild>
<mx:AddChild relativeTo="{mainPane}" position="lastChild">
<mx:TextInput x="62" y="54" displayAsPassword="true" id="userpass" enter="login(username.text,userpass.text);"/>
</mx:AddChild>
<mx:RemoveChild target="{btnSendMsg}"/>
<mx:AddChild relativeTo="{mainPane}" position="lastChild">
<mx:Button y="86" label="登陆" id="btnLog" click="login(username.text,userpass.text);" horizontalCenter="0"/>
</mx:AddChild>
<mx:RemoveChild target="{inputBox}"/>
<mx:RemoveChild target="{allowWords}"/>
<mx:RemoveChild target="{label1}"/>
<mx:SetProperty target="{mainPane}" name="width" value="274"/>
<mx:SetProperty target="{mainPane}" name="height" value="236"/>
<mx:AddChild relativeTo="{mainPane}" position="lastChild">
<mx:Label x="48" y="120" id="yzFail"/>
</mx:AddChild>
<mx:RemoveChild target="{profileImg}"/>
<mx:RemoveChild target="{userStatus}"/>
<mx:SetProperty target="{mainPane}" name="x"/>
<mx:SetProperty target="{mainPane}" name="y"/>
<mx:SetStyle target="{mainPane}" name="horizontalCenter" value="0"/>
<mx:AddChild relativeTo="{mainPane}" position="lastChild">
<mx:Button label="还没有饭否帐号?立即注册" horizontalCenter="0" bottom="30" click="regUser();"/>
</mx:AddChild>
<mx:SetProperty name="width" value="298"/>
<mx:SetProperty name="height" value="308"/>
<mx:SetStyle target="{mainPane}" name="top" value="10"/>
</mx:State>
<mx:State name="main">
<mx:AddChild relativeTo="{mainPane}" position="lastChild">
<mx:TabBar id="tBtn" x="10" dataProvider="viewstack1" selectedIndex="0" itemClick="tBtnClick();" width="246" height="23.333332" top="218">
</mx:TabBar>
</mx:AddChild>
<mx:AddChild relativeTo="{mainPane}" position="lastChild">
<mx:ViewStack id="viewstack1" right="10" left="10" bottom="5" top="240">
<mx:Canvas label="我和好友在做什么?" width="336" height="323" id="canvas1">
<mx:DataGrid x="0" width="330" id="dataGird1" editable="false" itemClick="showMsg();" bottom="0" top="0">
<mx:columns>
<mx:DataGridColumn headerText="昵称" dataField="screen_name" width="60"/>
<mx:DataGridColumn headerText="曾做过:" dataField="text"/>
<mx:DataGridColumn headerText="时间" dataField="created_at" width="50"/>
</mx:columns>
</mx:DataGrid>
</mx:Canvas>
<mx:Canvas label="我做过什么?" width="400" height="100%" id="canvas2">
<mx:DataGrid x="0" width="330" id="dataGird2" editable="false" itemClick="showMsg();" top="0" bottom="0">
<mx:columns>
<mx:DataGridColumn headerText="我做过:" dataField="text"/>
<mx:DataGridColumn headerText="时间" dataField="created_at" width="50"/>
</mx:columns>
</mx:DataGrid>
</mx:Canvas>
</mx:ViewStack>
</mx:AddChild>
<mx:AddChild position="lastChild">
<mx:ApplicationControlBar id="acBar" right="0" left="0" top="0" addedEffect="{effShow}" hideEffect="{effHide}" showEffect="{effShow}">
<mx:Text id="userInfo" text="userInfo"/>
<mx:Button label="重新登陆" click="reLogin();"/>
</mx:ApplicationControlBar>
</mx:AddChild>
<mx:SetProperty name="width" value="650"/>
<mx:SetProperty target="{mainPane}" name="x"/>
<mx:SetProperty target="{mainPane}" name="y"/>
<mx:SetStyle target="{mainPane}" name="top" value="50"/>
<mx:SetProperty name="height" value="680"/>
<mx:AddChild position="lastChild">
<mx:TitleWindow width="370" height="287" layout="absolute" showCloseButton="true" id="msgExplorer" title="消息显示" addedToStage="msgExplorer.visible=false" showEffect="{effShow}" hideEffect="{effHide}" close="closeMsg();" y="113" right="10">
<mx:Text text="Text" id="msgContent" left="10" top="66" right="10" bottom="35"/>
<mx:Button label="删除本条" horizontalCenter="0" id="btnDelMsg" click="destroyMsg(msgId);" addedToStage="btnDelMsg.visible=false" bottom="10"/>
<mx:Image width="48" height="48" left="10" top="10" id="msgImg" scaleContent="true"/>
<mx:Text text="Text" height="48" right="12" top="10" left="66" id="msgInfo"/>
</mx:TitleWindow>
</mx:AddChild>
<mx:SetStyle target="{mainPane}" name="left" value="10"/>
<mx:SetProperty target="{mainPane}" name="height"/>
<mx:SetStyle target="{mainPane}" name="bottom" value="20"/>
<mx:SetStyle target="{image1}" name="verticalCenter" value="-50"/>
</mx:State>
</mx:states>
<mx:Image source="@Embed('res/rightPic.png')" autoLoad="true" right="10" id="image1" verticalCenter="-50"/>
<mx:Panel x="10" y="10" width="370" height="580" layout="absolute" id="mainPane" title="{mainTitle}">
<mx:Button y="183" label="发送" click="sendMsg(inputBox.text);" id="btnSendMsg" horizontalCenter="0"/>
<mx:TextArea y="106" width="330" height="69" id="inputBox" change="freshWords();" horizontalCenter="0"/>
<mx:Label y="78" text="我在做什么?" fontWeight="bold" id="label1" left="10"/>
<mx:Label y="78" text="可以输入140字" id="allowWords" right="10"/>
<mx:Image x="10" y="10" id="profileImg" autoLoad="true" scaleContent="true" width="48" height="48"/>
<mx:TextArea width="274" height="60" right="10" top="10" id="userStatus"/>
</mx:Panel>
</mx:WindowedApplication>