很想和大家学习交流,把在下做的整个饭否客户端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>