客户端——文档.doc_第1页
客户端——文档.doc_第2页
客户端——文档.doc_第3页
客户端——文档.doc_第4页
客户端——文档.doc_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

客户端的界面/* * 欢迎界面public class WelcomeActivity extends Activity private SharePreferenceUtil util;private Handler mHandler;public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);/去掉状态栏setContentView(R.layout.main);util = new SharePreferenceUtil(this, Constants.SAVE_USER);if (util.getisFirst() createShut();/ 创建快捷方式moveSound();initView();public void initView() if (util.getIsStart() / 如果正在后台运行goFriendListActivity(); else / 如果是首次运行mHandler = new Handler();mHandler.postDelayed(new Runnable() public void run() / TODO Auto-generated method stubgoLoginActivity();, 1000); * 进入登陆界面public void goLoginActivity() Intent intent = new Intent();intent.setClass(this, LoginActivity.class);startActivity(intent);finish(); * 进入好友列表界面public void goFriendListActivity() Intent i = new Intent(this, FriendListActivity.class);startActivity(i);util.setIsStart(false);finish(); * 创建桌面快捷方式public void createShut() / 创建添加快捷方式的IntentIntent addIntent = new Intent(com.android.launcher.action.INSTALL_SHORTCUT);String title = getResources().getString(R.string.app_name);/ 加载快捷方式的图标Parcelable icon = Intent.ShortcutIconResource.fromContext(WelcomeActivity.this, R.drawable.icon);/ 创建点击快捷方式后操作Intent,该处当点击创建的快捷方式后,再次启动该程序Intent myIntent = new Intent(WelcomeActivity.this,WelcomeActivity.class);/ 设置快捷方式的标题addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);/ 设置快捷方式的图标addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);/ 设置快捷方式对应的IntentaddIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, myIntent);/ 发送广播添加快捷方式sendBroadcast(addIntent);util.setIsFirst(false); * 复制原生资源文件“来消息声音”到应用目录下,public void moveSound() InputStream is = getResources().openRawResource(R.raw.msg);File file = new File(getFilesDir(), msg.mp3);try OutputStream os = new FileOutputStream(file);int len = -1;byte buffer = new byte1024;while (len = is.read(buffer) != -1) os.write(buffer, 0, len);/System.out.println(声音复制完毕); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();、public class RegisterActivity extends MyActivity implements OnClickListener private Button mBtnRegister;private Button mRegBack;private EditText mEmailEt, mNameEt, mPasswdEt, mPasswdEt2;private MyApplication application;protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.register);application = (MyApplication) this.getApplicationContext();initView();public void initView() mBtnRegister = (Button) findViewById(R.id.register_btn);mRegBack = (Button) findViewById(R.id.reg_back_btn);mBtnRegister.setOnClickListener(this);mRegBack.setOnClickListener(this);mEmailEt = (EditText) findViewById(R.id.reg_email);mNameEt = (EditText) findViewById(R.id.reg_name);mPasswdEt = (EditText) findViewById(R.id.reg_password);mPasswdEt2 = (EditText) findViewById(R.id.reg_password2);private Dialog mDialog = null;private void showRequestDialog() if (mDialog != null) mDialog.dismiss();mDialog = null;mDialog = DialogFactory.creatRequestDialog(this, 正在注册中.);mDialog.show();Overridepublic void onBackPressed() / 捕获返回键toast(RegisterActivity.this);public void onClick(View v) / TODO Auto-generated method stubswitch (v.getId() case R.id.register_btn:/ showRequestDialog();estimate();break;case R.id.reg_back_btn:toast(RegisterActivity.this);break;default:break;private void toast(Context context) new AlertDialog.Builder(context).setTitle(QQ注册).setMessage(亲!您真的不注册了吗?).setPositiveButton(确定, new DialogInterface.OnClickListener() public void onClick(DialogInterface dialog, int which) finish();).setNegativeButton(取消, null).create().show();private void estimate() String email = mEmailEt.getText().toString();String name = mNameEt.getText().toString();String passwd = mPasswdEt.getText().toString();String passwd2 = mPasswdEt2.getText().toString();if (email.equals() | name.equals() | passwd.equals()| passwd2.equals() DialogFactory.ToastDialog(RegisterActivity.this, QQ注册,亲!带*项是不能为空的哦); else if (passwd.equals(passwd2) showRequestDialog();/ 提交注册信息if (application.isClientStart() / 如果已连接上服务器Client client = application.getClient();/Client client = GetMsgService.client;ClientOutputThread out = client.getClientOutputThread();TranObject o = new TranObject(TranObjectType.REGISTER);User u = new User();u.setEmail(email);u.setName(name);u.setPassword(Encode.getEncode(MD5, passwd);o.setObject(u);out.setMsg(o); else if (mDialog.isShowing()mDialog.dismiss();DialogFactory.ToastDialog(this, QQ注册, 亲!服务器暂未开放哦); else DialogFactory.ToastDialog(RegisterActivity.this, QQ注册,亲!您两次输入的密码不同哦);Overridepublic void getMessage(TranObject msg) / TODO Auto-generated method stubswitch (msg.getType() case REGISTER:User u = (User) msg.getObject();int id = u.getId();if (id 0) if (mDialog != null) mDialog.dismiss();mDialog = null;DialogFactory.ToastDialog(RegisterActivity.this, QQ注册,亲!请牢记您的登录QQ哦: + id); else if (mDialog != null) mDialog.dismiss();mDialog = null;DialogFactory.ToastDialog(RegisterActivity.this, QQ注册,亲!很抱歉!QQ号暂时缺货哦);break;default:break;、package com.way.chat.activity;public class RecentChatEntity private int id;private int img;private int count;private String name;private String time;private String msg;public RecentChatEntity() / TODO Auto-generated constructor stubpublic RecentChatEntity(int id, int img, int count, String name,String time, String msg) super();this.id = id;this.img = img;this.count = count; = name;this.time = time;this.msg = msg;public int getId() return id;public void setId(int id) this.id = id;public int getImg() return img;public void setImg(int img) this.img = img;public int getCount() return count;public void setCount(int count) this.count = count;public String getName() return name;public void setName(String name) = name;public String getTime() return time;public void setTime(String time) this.time = time;public String getMsg() return msg;public void setMsg(String msg) this.msg = msg;public boolean equals(Object object) if (object = null)/ 如果是空对象,肯定是不同的return false;if (object = this)/ 如果是同一个对象,肯定是相同的return true;if (object instanceof RecentChatEntity) / 如果id相同,我们就认为是同一个对象,因为id是唯一的,对于我这个小项目来说RecentChatEntity entity = (RecentChatEntity) object;if (entity.id = this.id)return true;return false;Overridepublic String toString() return RecentChatEntity id= + id + , img= + img + , count=+ count + , name= + name + , time= + time + , msg= + msg+ ;、public class RecentChatAdapter extends BaseAdapter private Context context;private LinkedList list;private MyApplication application;private LayoutInflater inflater;private int imgs = R.drawable.icon, R.drawable.f1, R.drawable.f2,R.drawable.f3, R.drawable.f4, R.drawable.f5, R.drawable.f6,R.drawable.f7, R.drawable.f8, R.drawable.f9 ;public RecentChatAdapter(Context context, LinkedList list) / TODO Auto-generated constructor stubthis.context = context;application = (MyApplication) context.getApplicationContext();this.list = list;inflater = LayoutInflater.from(context);Overridepublic int getCount() / TODO Auto-generated method stubreturn list.size();Overridepublic Object getItem(int position) / TODO Auto-generated method stubreturn list.get(position);Overridepublic long getItemId(int position) / TODO Auto-generated method stubreturn position;/ 通过对象移除public void remove(RecentChatEntity entity) list.remove(entity);Overridepublic View getView(int position, View convertView, ViewGroup parent) / TODO Auto-generated method stubViewHolder holder;if (convertView = null) convertView = inflater.inflate(R.layout.recent_chat_item, null);holder = new ViewHolder();holder.icon = (ImageView) convertView.findViewById(R.id.recent_userhead); = (TextView) convertView.findViewById(R.id.recent_name);holder.date = (TextView) convertView.findViewById(R.id.recent_time);holder.msg = (TextView) convertView.findViewById(R.id.recent_msg);holder.count = (TextView) convertView.findViewById(R.id.recent_new_num);convertView.setTag(holder); else holder = (ViewHolder) convertView.getTag();final RecentChatEntity entity = list.get(position);holder.icon.setImageResource(imgsentity.getImg();.setText(entity.getName();.setTextColor(Color.BLACK);holder.date.setText(entity.getTime();holder.date.setTextColor(Color.BLACK);holder.msg.setText(entity.getMsg();holder.msg.setTextColor(Color.BLACK);if (entity.getCount() 0) holder.count.setText(entity.getCount() + );holder.count.setTextColor(Color.BLACK); else holder.count.setVisibility(View.INVISIBLE);/ 如果没有消息,就隐藏此view/ 点击事件convertView.setOnClickListener(new OnClickListener() Overridepublic void onClick(View v) / 下面是切换到聊天界面处理User u = new User();u.setName(entity.getName();u.setId(entity.getId();u.setImg(entity.getImg();Intent intent = new Intent(context, ChatActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra(user, u);context.startActivity(intent);/ Toast.makeText(Tab2.this, 开始聊天, 0).show();application.setRecentNum(0););return convertView;static class ViewHolder public ImageView icon;public TextView name;public TextView date;public TextView msg;public TextView count;、 * 自定义的ViewPager适配器 * * author way * */public class MyPagerAdapter extends PagerAdapter private List mListViews;public MyPagerAdapter(List mListViews) / TODO Auto-generated constructor stubthis.mListViews = mListViews;Overridepublic void destroyItem(View arg0, int arg1, Object arg2) (ViewPager) arg0).removeView(mListViews.get(arg1);Overridepublic void finishUpdate(View arg0) Overridepublic int getCount() return mListViews.size();Overridepublic Object instantiateItem(View arg0, int arg1) (ViewPager) arg0).addView(mListViews.get(arg1), 0);return mListViews.get(arg1);Overridepublic boolean isViewFromObject(View arg0, Object arg1) return arg0 = (arg1);Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) Overridepublic Parcelable saveState() return null;Overridepublic void startUpdate(View arg0) 、 * 重写一个ListView,主要是添加一个下拉事件 * * author way * */public class MyListView extends ExpandableListView implements OnScrollListener private static final String TAG = listview;private final static int RELEASE_To_REFRESH = 0; / 松开刷新状态private final static int PULL_To_REFRESH = 1;/ 拉动刷新状态private final static int REFRESHING = 2;/ 正在刷新状态private final static int DONE = 3;/ 已经加载完毕状态private final static int LOADING = 4;/ 正在加载数据状态private final static int RATIO = 3;/ 实际的padding的距离与界面上偏移距离的比例private LayoutInflater inflater;private LinearLayout headView;/ ListView头部的Viewprivate TextView tipsTextview;/ 提示信息“下拉刷新”的TextViewprivate TextView lastUpdatedTextView;/ 上次更新时间的TextViewprivate ImageView arrowImageView;/ 箭头的图片private ProgressBar progressBar;/ 刷新进度private RotateAnimation animation;/ 箭头向下动画private RotateAnimation reverseAnimation;/ 逆向箭头动画private boolean isRecored;/ 用于保证startY的值在一个完整的touch事件中只被记录一次private int headContentWidth;/ 头部View内容的宽度private int headContentHeight;/ 头部view内容的高度private int startY;/ 向下触屏事件时的手指起始y轴位置private int firstItemIndex;/ ListView第一项的索引private int state;/ 刷新状态private boolean isBack;/ 是否反弹private OnRefreshListener refreshListener;/ 给外面预留的刷新的接口private boolean isRefreshable;/ 是否刷新的标志位/* * 第一个构造器 * * param context * 上下文对象 */public MyListView(Context context) super(context);init(context);/* * 第二个构造器 * * param context * 上下文对象 * param attrs * 属性 */public MyListView(Context context, AttributeSet attrs) super(context, attrs);init(context);public MyListView(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle);init(context);/* * 初始化数据 * * param context * 上下文对象 */private void init(Context context) / setCacheColorHint(context.getResources().getColor(R.color.transparent);inflater = LayoutInflater.from(context);headView = (LinearLayout) inflater.inflate(R.layout.head, null);/ 获取ListView头部的viewarrowImageView = (ImageView) headView.findViewById(R.id.head_arrowImageView);/ 从头部的View获取箭头图片arrowImageView.setMinimumWidth(70);arrowImageView.setMinimumHeight(50);progressBar = (ProgressBar) headView.findViewById(R.id.head_progressBar);/ 获取刷新进度条tipsTextview = (TextView) headView.findViewById(R.id.head_tipsTextView);/ 提示信息的TextViewlastUpdatedTextView = (TextView) headView.findViewById(R.id.head_lastUpdatedTextView);/ 最后刷新时间的TextViewlastUpdatedTextView.setText(最近更新: + MyDate.getDate();/ 初始化第一次刷新时间measureView(headView);/ 自己写的一个方法,没有很理解headContentHeight = headView.getMeasuredHeight();/ 得到headView的原始高度headContentWidth = headView.getMeasuredWidth();headView.setPadding(0, -1 * headContentHeight, 0, 0);/ 设置内容的内部偏移量headView.invalidate();/ Log.v(size, width: + headContentWidth + height:/ + headContentHeight);addHeaderView(headView, null, false);/ 加到ListView的头部view,ListView组件提供了两个很实用的功能,那就是可以在顶部和底部添加自定义的视图setOnScrollListener(this);/ 箭头向下动画animation = new RotateAnimation(0, -180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);animation.setInterpolator(new LinearInterpolator();animation.setDuration(250);animation.setFillAfter(true);/ 逆向箭头动画reverseAnimation = new RotateAnimation(-180, 0,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);reverseAnimation.setInterpolator(new LinearInterpolator();reverseAnimation.setDuration(200);reverseAnimation.setFillAfter(true);state = DONE;/ 第一次加载默认完成的状态isRefreshable = false;/ 刷新标志位默认为false/* * 滑动时被调用 */public void onScroll(AbsListView view, int firstVisiableItem,int visibleItemCount, int totalItemCount) firstItemIndex = firstVisiableItem;/ ListView第一个索引值为ListView数据中第一个可见项/* * 滑动状态改变时被调用 */public void onScrollStateChanged(AbsListView view, int scrollState) /* * 触摸事件 */public boolean onTouchEvent(MotionEvent event) if (isRefreshable) / 如果刷新标志为trueswitch (event.getAction() case MotionEvent.ACTION_DOWN:/ 向下if (firstItemIndex = 0 & !isRecored) isRecored = true;startY = (int) event.getY();/ Log.v(TAG, 在down时候记录当前位置);break;case MotionEvent.ACTION_UP:/ 向上if (state != REFRESHING & state != LOADING) if (state = DONE) / 什么都不做if (state = PULL_To_REFRESH) / 下拉刷新state = DONE;changeHeaderViewByState();/ 更新头部view/ Log.v(TAG, 由下拉刷新状态,到done状态);if (state = RELEASE_To_REFRESH) / 释放刷新state = REFRESHING;changeHeaderVie

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论