类似QQ在线离线好友界面

把头像设置成圆形的代码如下:

  1 package com.example.lesson6_11_id19;
  2
  3 import android.content.Context;
  4 import android.content.res.TypedArray;
  5 import android.graphics.Bitmap;
  6 import android.graphics.Canvas;
  7 import android.graphics.Color;
  8 import android.graphics.Paint;
  9 import android.graphics.PorterDuff;
 10 import android.graphics.PorterDuffXfermode;
 11 import android.graphics.RectF;
 12 import android.graphics.Xfermode;
 13 import android.graphics.drawable.Drawable;
 14 import android.graphics.drawable.NinePatchDrawable;
 15 import android.util.AttributeSet;
 16 import android.widget.ImageView;
 17
 18 public class CircleImageView extends ImageView {
 19     private static final Xfermode MASK_XFERMODE;
 20     private Bitmap mask;
 21     private Paint paint;
 22     private int mBorderWidth = 10;
 23     private int mBorderColor = Color.parseColor("#f2f2f2");
 24     private boolean useDefaultStyle = false;
 25
 26     static {
 27         PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;
 28         MASK_XFERMODE = new PorterDuffXfermode(localMode);
 29     }
 30
 31     public CircleImageView(Context context) {
 32         super(context);
 33     }
 34
 35     public CircleImageView(Context context, AttributeSet attrs) {
 36         this(context, attrs, 0);
 37     }
 38
 39     public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
 40         super(context, attrs, defStyle);
 41         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircularImage);
 42         mBorderColor = a.getColor(R.styleable.CircularImage_border_color, mBorderColor);
 43         final int def = (int) (2*context.getResources().getDisplayMetrics().density + 0.5f);
 44         mBorderWidth = a.getDimensionPixelOffset(R.styleable.CircularImage_border_width, def);
 45         a.recycle();
 46     }
 47
 48     private void useDefaultStyle(boolean useDefaultStyle) {
 49         this.useDefaultStyle = useDefaultStyle;
 50     }
 51
 52     @Override
 53     protected void onDraw(Canvas canvas) {
 54         if(useDefaultStyle) {
 55             super.onDraw(canvas);
 56             return ;
 57         }
 58         final Drawable localDraw = getDrawable();
 59         if(localDraw == null) {
 60             return ;
 61         }
 62         if(localDraw instanceof NinePatchDrawable) {
 63             return ;
 64         }
 65         if (this.paint == null) {
 66             final Paint localPaint = new Paint();
 67             localPaint.setFilterBitmap(false);
 68             localPaint.setAntiAlias(true);
 69             localPaint.setXfermode(MASK_XFERMODE);
 70             this.paint = localPaint;
 71         }
 72         final int width = getWidth();
 73         final int height = getHeight();
 74         /** ????layer */
 75         int layer = canvas.saveLayer(0.0F, 0.0F, width, height, null, 31);
 76         /** ????drawable???С */
 77         localDraw.setBounds(0, 0, width, height);
 78         /** ??drawable????bitmap(this.mask)???棨drawable??????bitmap????????? */
 79         localDraw.draw(canvas);
 80         if ((this.mask == null) || (this.mask.isRecycled())) {
 81             this.mask = createOvalBitmap(width, height);
 82         }
 83         /** ??bitmap????canvas???? */
 84         canvas.drawBitmap(this.mask, 0.0F, 0.0F, this.paint);
 85         /** ???????????layer?? */
 86         canvas.restoreToCount(layer);
 87         drawBorder(canvas, width, height);
 88     }
 89
 90     /**
 91      * ??????α??
 92      */
 93     private void drawBorder(Canvas canvas, final int width, final int height) {
 94         if(mBorderWidth == 0) {
 95             return ;
 96         }
 97         final Paint mBorderPaint = new Paint();
 98         mBorderPaint.setStyle(Paint.Style.STROKE);
 99         mBorderPaint.setAntiAlias(true);
100         mBorderPaint.setColor(mBorderColor);
101         mBorderPaint.setStrokeWidth(mBorderWidth);
102         canvas.drawCircle(width/2, height/2, (width-mBorderWidth)/2, mBorderPaint);
103         canvas = null;
104     }
105
106     public Bitmap createOvalBitmap(final int width, final int height) {
107         Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;
108         Bitmap localBitmap = Bitmap.createBitmap(width, height, localConfig);
109         Canvas localCanvas = new Canvas(localBitmap);
110         Paint localPaint = new Paint();
111         final int padding = (mBorderWidth - 3) > 0 ? mBorderWidth - 3 : 1;
112         /**
113          * ??????????С(???????????????border???????????????????????????????п?????????Ч??????????????????????
114          * ????????padding px)
115          */
116         RectF localRectF = new RectF(padding, padding, width - padding, height - padding);
117         localCanvas.drawOval(localRectF, localPaint);
118
119         return localBitmap;
120     }
121
122 }

把下面的xml创建到values下,再把child_xml的ImageView改成java上面java代码所对应的包名:

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
4     <declare-styleable name="CircularImage">
5         <attr name="border_width" format="dimension" />
6         <attr name="border_color" format="color" />
7     </declare-styleable>
8
9 </resources>

下面的就是功能代码:

activity_xml:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:background="#c7edcc"
 6     tools:context="com.example.lesson6_11_id19.MainActivity" >
 7
 8     <ExpandableListView
 9         android:id="@+id/elv"
10         android:layout_width="match_parent"
11         android:layout_height="match_parent" >
12     </ExpandableListView>
13 </RelativeLayout>

item_group.xml:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:padding="10dp"
 5     android:background="#c7edcc" >
 6
 7     <TextView
 8         android:id="@+id/tv_groupName"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:text="组名"
12         android:textSize="20sp"/>
13
14     <TextView
15         android:id="@+id/tv_numble"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:layout_alignParentRight="true"
19         android:text="1/10"
20         android:textSize="20dp"/>
21
22 </RelativeLayout>

item_child.xml:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="wrap_content"
 4     android:orientation="horizontal"
 5     android:background="#c7edcc">
 6
 7     <com.example.lesson6_11_id19.CircleImageView
 8         android:id="@+id/iv_pic"
 9         android:layout_width="80dp"
10         android:layout_height="80dp"
11         android:padding="5dp"
12         />
13
14     <LinearLayout
15         android:layout_width="match_parent"
16         android:layout_height="match_parent"
17         android:orientation="vertical"
18         android:padding="5dp">
19
20         <TextView
21             android:id="@+id/tv_name"
22             android:layout_width="wrap_content"
23             android:layout_height="0dp"
24             android:layout_weight="1"
25             android:text="昵称"
26             android:gravity="center"/>
27
28         <TextView
29             android:id="@+id/tv_online"
30             android:layout_width="wrap_content"
31             android:layout_height="0dp"
32             android:layout_weight="1"
33             android:gravity="center"
34             android:text="在线"/>
35
36     </LinearLayout>
37
38 </LinearLayout>

java代码:

 1 package com.example.lesson6_11_id19;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import com.example.lesson6_11_id19.UserGroup.User;
 7
 8 import android.app.Activity;
 9 import android.os.Bundle;
10 import android.widget.ExpandableListView;
11
12 public class MainActivity extends Activity {
13     ExpandableListView elv;
14     List<UserGroup> mlist = new ArrayList<UserGroup>();
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.activity_main);
19         elv = (ExpandableListView) findViewById(R.id.elv);
20         initData();
21         elv.setAdapter(new MyAdapter(this, mlist));
22         elv.setGroupIndicator(null);
23     }
24     private void initData() {
25         List<User> list_1 = new ArrayList<UserGroup.User>();
26         list_1.add(new User(R.drawable.zhaoliying, "赵丽颖", true));
27         list_1.add(new User(R.drawable.gaoyuanyuan, "高圆圆", true));
28         list_1.add(new User(R.drawable.songhuiqiao, "宋慧乔", false));
29         list_1.add(new User(R.drawable.yangmi, "赵丽颖", true));
30         UserGroup user_1 = new UserGroup("女神", list_1);
31         List<User> list_2 = new ArrayList<UserGroup.User>();
32         list_2.add(new User(R.drawable.fanbingbign, "范冰冰", true));
33         list_2.add(new User(R.drawable.libingbing, "李冰冰", false));
34         list_2.add(new User(R.drawable.linxinru, "林心如", false));
35         list_2.add(new User(R.drawable.liutao, "刘涛", true));
36         UserGroup user_2 = new UserGroup("美女明星", list_2);
37         List<User> list_3 = new ArrayList<UserGroup.User>();
38         list_3.add(new User(R.drawable.liushishi, "刘诗诗", true));
39         list_3.add(new User(R.drawable.liuyifei, "刘亦菲", true));
40         list_3.add(new User(R.drawable.songhuiqiao, "宋慧乔", false));
41         list_3.add(new User(R.drawable.zhaoliying, "赵丽颖", true));
42         UserGroup user_3 = new UserGroup("女神", list_3);
43         List<User> list_4 = new ArrayList<UserGroup.User>();
44         list_4.add(new User(R.drawable.zhaoliying, "赵丽颖", false));
45         list_4.add(new User(R.drawable.gaoyuanyuan, "高圆圆", true));
46         list_4.add(new User(R.drawable.songhuiqiao, "宋慧乔", false));
47         list_4.add(new User(R.drawable.zhaoliying, "赵丽颖", true));
48         UserGroup user_4 = new UserGroup("女神", list_4);
49         mlist.add(user_1);
50         mlist.add(user_2);
51         mlist.add(user_3);
52         mlist.add(user_4);
53     }
54 }
  1 package com.example.lesson6_11_id19;
  2
  3 import java.util.List;
  4
  5 import com.example.lesson6_11_id19.UserGroup.User;
  6
  7 import android.content.Context;
  8 import android.view.View;
  9 import android.view.ViewGroup;
 10 import android.widget.BaseExpandableListAdapter;
 11 import android.widget.ImageView;
 12 import android.widget.TextView;
 13
 14 public class MyAdapter extends BaseExpandableListAdapter{
 15     private Context mContext;
 16     private List<UserGroup> mlist;
 17
 18
 19
 20     public MyAdapter(Context context, List<UserGroup> list) {
 21         this.mContext = context;
 22         this.mlist = list;
 23     }
 24
 25     @Override
 26     public int getGroupCount() {
 27         return mlist.size();
 28     }
 29
 30     @Override
 31     public int getChildrenCount(int groupPosition) {
 32         return mlist.get(groupPosition).users.size();
 33     }
 34
 35     @Override
 36     public UserGroup getGroup(int groupPosition) {
 37         return mlist.get(groupPosition);
 38     }
 39
 40     @Override
 41     public User getChild(int groupPosition, int childPosition) {
 42         return mlist.get(groupPosition).users.get(childPosition);
 43     }
 44
 45     @Override
 46     public long getGroupId(int groupPosition) {
 47         return groupPosition;
 48     }
 49
 50     @Override
 51     public long getChildId(int groupPosition, int childPosition) {
 52         return childPosition;
 53     }
 54
 55     @Override
 56     public boolean hasStableIds() {
 57         return true;
 58     }
 59
 60     @Override
 61     public View getGroupView(int groupPosition, boolean isExpanded,
 62             View convertView, ViewGroup parent) {
 63         GroupHolder holder;
 64         if (convertView == null) {
 65             convertView = View.inflate(mContext, R.layout.item_group, null);
 66             holder = new GroupHolder(convertView);
 67             convertView.setTag(holder);
 68         }else {
 69             holder = (GroupHolder) convertView.getTag();
 70         }
 71         UserGroup userGroup = getGroup(groupPosition);
 72         holder.tv_groupName.setText(userGroup.getGroupName());
 73         holder.tv_numble.setText(userGroup.getOnline());
 74         return convertView;
 75     }
 76
 77     @Override
 78     public View getChildView(int groupPosition, int childPosition,
 79             boolean isLastChild, View convertView, ViewGroup parent) {
 80         ChildHolder holder;
 81         if (convertView == null) {
 82             convertView = View.inflate(mContext, R.layout.item_child, null);
 83             holder = new ChildHolder(convertView);
 84             convertView.setTag(holder);
 85         }else {
 86             holder = (ChildHolder) convertView.getTag();
 87         }
 88         User user = getChild(groupPosition, childPosition);
 89         holder.iv_pic.setImageResource(user.getImgId());
 90         holder.tv_name.setText(user.getNickName());
 91         holder.tv_online.setText(user.isOnline()?"[在线]":"[离线]");
 92         return convertView;
 93     }
 94
 95     @Override
 96     public boolean isChildSelectable(int groupPosition, int childPosition) {
 97         return true;
 98     }
 99     class GroupHolder{
100         TextView tv_groupName,tv_numble;
101         public GroupHolder(View convertView) {
102             tv_groupName = (TextView) convertView.findViewById(R.id.tv_groupName);
103             tv_numble = (TextView) convertView.findViewById(R.id.tv_numble);
104         }
105
106     }
107
108     class  ChildHolder{
109         ImageView iv_pic;
110         TextView tv_name;
111         TextView tv_online;
112         public ChildHolder(View convertView) {
113             iv_pic = (ImageView) convertView.findViewById(R.id.iv_pic);
114             tv_name = (TextView) convertView.findViewById(R.id.tv_name);
115             tv_online = (TextView) convertView.findViewById(R.id.tv_online);
116         }
117
118     }
119 }
 1 package com.example.lesson6_11_id19;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 public class UserGroup {
 7     String groupName;
 8     List<User> users = new ArrayList<User>();
 9
10
11     public String getGroupName() {
12         return groupName;
13     }
14
15
16     public void setGroupName(String groupName) {
17         this.groupName = groupName;
18     }
19
20
21     public List<User> getUsers() {
22         return users;
23     }
24
25
26     public void setUsers(List<User> users) {
27         this.users = users;
28     }
29
30
31     public UserGroup(String groupName, List<User> users) {
32         super();
33         this.groupName = groupName;
34         this.users = users;
35     }
36     // 获取在线的人数
37     public String getOnline(){
38         int online = 0;
39         for (int i = 0; i < users.size(); i++) {
40             if (users.get(i).isOnline) {
41                 online++;
42             }
43         }
44         return online+"/"+users.size();
45
46     }
47
48     // 定义一个User类
49     static class User{
50         int imgId;
51         String nickName;
52         boolean isOnline;
53
54         public User(int imgId, String nickName, boolean isOnline) {
55             super();
56             this.imgId = imgId;
57             this.nickName = nickName;
58             this.isOnline = isOnline;
59         }
60
61         public int getImgId() {
62             return imgId;
63         }
64
65         public void setImgId(int imgId) {
66             this.imgId = imgId;
67         }
68
69         public String getNickName() {
70             return nickName;
71         }
72
73         public void setNickName(String nickName) {
74             this.nickName = nickName;
75         }
76
77         public boolean isOnline() {
78             return isOnline;
79         }
80
81         public void setOnline(boolean isOnline) {
82             this.isOnline = isOnline;
83         }
84
85     }
86 }

时间: 2024-08-25 05:40:19

类似QQ在线离线好友界面的相关文章

QQ好友在线/离线,怎么测试?

即时通讯是目前internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,那么今天主要针对QQ好友在线状态/QQ群友在线状态功能出发,一起思考其中的实现原理以及我们如何去测试此功能? 当大家在使用QQ的时候,是否和我一样有如下疑问: 在好友列表中为什么可以实时的看到qq好友的在线.离线等状态? 在QQ群的群友列表中能看到当前群友的在线.离线等状态,是如何实现的? 作为测试工程师究竟该如何去测试里面用到的技术? 我带着这些问题,去搜集了一些资料进行了解.学习和总结后,现分享给大家. 关

QQ群友在线/离线,如何测试?

上篇文章『QQ好友在线/离线,如何测试?』针对即时通讯的"状态"进行了分析和总结,主要说到了QQ好友在线/离线实现方案,测试过程中需要注意的测试点. 针对好友状态实时性的要求需要使用不同的方式,如果实时性要求高可以采用推送的方式,那么QQ好友针对在线/离线要求较高,可以采用推送的方式进行同步.大家在做通讯工具方便的项目时,如果实时性要求不高的话,可以采用轮询拉取的方式同步.备注:轮询方式和推送方式在上篇已经介绍到,在这里就不过多描述. QQ群友的状态又是按照什么方式进行同步状态的呢?

ajax如何实现类似qq的在线聊天插件

ajax实现的无刷新在线聊天插件,效果极类似QQ聊天界面--在原来的基础上改造过的,网上还没有像这样实现的. 前段时间做了一个论坛,是phpwind源码的-5.0,后来从网上下了一个在线聊天插件,感觉不是很完善,就进行了改造.现在,我的论坛不在了(现在的网站是http://www.shou163.com/,欢迎设为首页),但是源码还留在硬盘上,想想应该能出来给大家共享,这样好的东西不能被埋没了,^-^ 实现的代码如下: 模板文件 index.htm 插入如下一段(注意先备份哦) <!-- 随便找

基于Qt的类似QQ好友列表抽屉效果的实现

前段时间在忙毕业设计,所以一直没有更新博客.今天答辩完以后,将对我的毕业设计进行模块展示,供Qt初学者进行参考. 毕业设计题目:Linux系统下基于Qt的局域网即时通信系统设计与实现 其中我有一个类似于QQ的好友列表,然后对好友可以进行分组管理,毕设中具体效果图如下: 网上查寻到的设计思路: 1.采用QToolBox的方式,虽然看起来有点样子,但是并不是我们所熟悉的好友列表,比如:http://blog.csdn.net/qianguozheng/article/details/6719074

[C# 网络编程系列]专题九:实现类似QQ的即时通信程序

转自:http://www.cnblogs.com/zhili/archive/2012/09/23/2666987.html 引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在本专题中将利用前面专题介绍的知识来实现一个类似QQ的聊天程序. 一.即时通信系统 在我们的生活中经常使用即时通信的软件,我们经常接触到的有:QQ.阿里旺旺.MSN等等.这些

详解C# 网络编程系列:实现类似QQ的即时通信程序

引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在本专题中将利用前面专题介绍的知识来实现一个类似QQ的聊天程序.  一.即时通信系统 在我们的生活中经常使用即时通信的软件,我们经常接触到的有:QQ.阿里旺旺.MSN等等.这些都是属于即时通信(Instant Messenger,IM)软件,IM是指所有能够即时发送和接收互联网消息的软件. 在前面专题

QQ在线客服设置

QQ在线客服设置 1.客户在添加QQ在线客服后,需要让用户在线不需要添加为好友就能在线对话,一般默认设置下会显示"您需要添加对方为好友+才能给对方发送会话消息",具体解决方法如下: ①.登陆腾讯官方网站:http://wp.qq.com/ 或者 http://shang.qq.com/v3/widget.html 进入QQ推广==>推广工具,点击立即免费开通.已开通的用户进入到第二步. ②.登陆之后,点"设置",按下图所示,全部打勾.这个必须设置,不设置,不能

iOS tableViewCell 在cell赋值、网络加载照片位置偏移大小错乱,做一个类似qq列表的tableview

需求: 类似QQ列表的头像加载刷新,判断在线离线状态改变头像,以及彩色头像灰色处理,下载图片+获取在线状态需要连网--再改变头像 问题:由于cell的复用以及下拉刷新数据每次加载10条数据,会出现头像赋值不正确,位置偏移大小不同的变化 原因:由于cell的重复调用,加载数据方法已经赋值方法也在重复的调用,所以头像加载 在线状态判断好后,网络延迟, (个人开始yy:启动时的cell和赋值结束的cell可能不是同一个) 修改:当cell开始调用的时候,给当前的cell赋tag值,加载结束判断是不是自

C#实现类似QQ的隐藏浮动窗体、消息闪动

功能简介 当语音客服系统登录成功进入主界面时,本聊天工具将会自动隐藏在左下角位置,当鼠标移动到左下角时,自动弹出,当鼠标移开聊天窗体时,自动隐藏.如果想让聊天窗体固定在桌面,只要拖动一下聊天窗口,让它不停留在边界位置就可以了.隐藏和悬浮方式类型QQ. 1. 系统主界面 当点击最小化按钮时, 在电脑右下角会显示任务图标,点击任务图标,将会在左下角位置弹出. 主界面各部分介绍: a) 消息列表:该区域的功能主要是显示消息记录. b) 发送消息:输入要发送的消息进行发送,默认群聊,输入消息后,按回车键