把头像设置成圆形的代码如下:
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 }