Commit 55e73a5e02709b14c2faa78d5c9019fb5c056374

Authored by 陈硕
1 parent 61429a1f

更新逻辑

app/build.gradle
@@ -45,4 +45,5 @@ dependencies { @@ -45,4 +45,5 @@ dependencies {
45 compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha9' 45 compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha9'
46 testCompile 'junit:junit:4.12' 46 testCompile 'junit:junit:4.12'
47 compile 'com.android.support:recyclerview-v7:23.0.0' 47 compile 'com.android.support:recyclerview-v7:23.0.0'
  48 + compile 'com.github.bumptech.glide:glide:3.7.0'
48 } 49 }
app/libs/libcnliveutil.jar
No preview for this file type
app/src/main/java/com/cnlive/im/CNLiveApplication.java
@@ -14,7 +14,7 @@ public class CNLiveApplication extends Application { @@ -14,7 +14,7 @@ public class CNLiveApplication extends Application {
14 @Override 14 @Override
15 public void onCreate() { 15 public void onCreate() {
16 super.onCreate(); 16 super.onCreate();
17 - Config.init(this, "60_j07o9s9b65", "dc1e76f87c7c2d83dcedb8a1204ec22fca3e156b21eb0d"); 17 + Config.init(this, "60_j07o9s9b65", "dc1e76f87c7c2d83dcedb8a1204ec22fca3e156b21eb0d",true);
18 } 18 }
19 } 19 }
20 20
app/src/main/java/com/cnlive/im/adapter/CommentAdapter.java
@@ -8,12 +8,14 @@ import android.view.ViewGroup; @@ -8,12 +8,14 @@ import android.view.ViewGroup;
8 import android.widget.ImageView; 8 import android.widget.ImageView;
9 import android.widget.TextView; 9 import android.widget.TextView;
10 10
  11 +import com.bumptech.glide.Glide;
11 import com.cnlive.im.R; 12 import com.cnlive.im.R;
12 import com.cnlive.libs.util.model.CommentItem; 13 import com.cnlive.libs.util.model.CommentItem;
13 14
14 import java.util.ArrayList; 15 import java.util.ArrayList;
15 import java.util.List; 16 import java.util.List;
16 17
  18 +
17 /** 19 /**
18 * @author 陈硕 20 * @author 陈硕
19 * @time 2017/6/9 10:56 21 * @time 2017/6/9 10:56
@@ -60,6 +62,7 @@ public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentH @@ -60,6 +62,7 @@ public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentH
60 public void onBindViewHolder(CommentHolder holder, int position) { 62 public void onBindViewHolder(CommentHolder holder, int position) {
61 63
62 final CommentItem commentItem = mItems.get(position); 64 final CommentItem commentItem = mItems.get(position);
  65 + Glide.with(context).load(commentItem.getFacepath()).into(commentHolder.img_head);
63 commentHolder.nick_name.setText(commentItem.getUid()); 66 commentHolder.nick_name.setText(commentItem.getUid());
64 commentHolder.comment_message.setText(commentItem.getContent()); 67 commentHolder.comment_message.setText(commentItem.getContent());
65 commentHolder.comment_good_count.setText(commentItem.getPraise()); 68 commentHolder.comment_good_count.setText(commentItem.getPraise());
@@ -84,7 +87,7 @@ public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentH @@ -84,7 +87,7 @@ public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentH
84 this.onImageViewClick = onImageViewClick; 87 this.onImageViewClick = onImageViewClick;
85 } 88 }
86 89
87 - public interface OnImageViewClick { 90 + public interface OnImageViewClick {
88 void praiseComment(CommentItem commentItem); 91 void praiseComment(CommentItem commentItem);
89 } 92 }
90 93
@@ -94,6 +97,7 @@ public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentH @@ -94,6 +97,7 @@ public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentH
94 public final TextView comment_message; 97 public final TextView comment_message;
95 public final TextView comment_good_count; 98 public final TextView comment_good_count;
96 public final ImageView good_imv1; 99 public final ImageView good_imv1;
  100 + public final ImageView img_head;
97 101
98 public CommentHolder(View itemView) { 102 public CommentHolder(View itemView) {
99 super(itemView); 103 super(itemView);
@@ -101,6 +105,7 @@ public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentH @@ -101,6 +105,7 @@ public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentH
101 good_imv1 = (ImageView) itemView.findViewById(R.id.good_imv); 105 good_imv1 = (ImageView) itemView.findViewById(R.id.good_imv);
102 comment_message = (TextView) itemView.findViewById(R.id.comment_message); 106 comment_message = (TextView) itemView.findViewById(R.id.comment_message);
103 comment_good_count = (TextView) itemView.findViewById(R.id.comment_good_count); 107 comment_good_count = (TextView) itemView.findViewById(R.id.comment_good_count);
  108 + img_head = (ImageView) itemView.findViewById(R.id.img_head);
104 109
105 110
106 } 111 }
app/src/main/java/com/cnlive/im/ui/ChatRoomActivity.java
@@ -73,8 +73,8 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL @@ -73,8 +73,8 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL
73 user_name_string = intent.getStringExtra("user_name_string"); 73 user_name_string = intent.getStringExtra("user_name_string");
74 String user_id_string = intent.getStringExtra("user_id_string"); 74 String user_id_string = intent.getStringExtra("user_id_string");
75 if (user_name_string != null) 75 if (user_name_string != null)
76 - ChatUtil.login(new CNUserInfo(user_id_string, user_name_string, ""));  
77 - else ChatUtil.logOut(); 76 + ChatUtil.login(new CNUserInfo(user_id_string, user_name_string, ""), connectListener);
  77 + else ChatUtil.logOut(connectListener);
78 78
79 } 79 }
80 80
@@ -103,15 +103,16 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL @@ -103,15 +103,16 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL
103 /** 103 /**
104 * 发送消息监听 104 * 发送消息监听
105 */ 105 */
106 - private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() {  
107 106
  107 + private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() {
108 @Override 108 @Override
109 - public void onAttached(CNMessage cnMessage) {  
110 - Log.v(TAG, "SendMessageListener onAttached" + cnMessage.getTargetId() + cnMessage.getUserInfo().getUserName()); 109 + public void onAttached(Object o) {
  110 +
111 } 111 }
112 112
113 @Override 113 @Override
114 - public void onSuccess(final CNMessage cnMessage) { 114 + public void onSuccess(Object o) throws JSONException {
  115 + final CNMessage cnMessage = (CNMessage) o;
115 mHandler.post(new Runnable() { 116 mHandler.post(new Runnable() {
116 @Override 117 @Override
117 public void run() { 118 public void run() {
@@ -129,21 +130,55 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL @@ -129,21 +130,55 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL
129 130
130 } 131 }
131 }); 132 });
132 -  
133 } 133 }
134 134
135 @Override 135 @Override
136 - public void onError(CNMessage cnMessage, int i, final String s) {  
137 - Log.v(TAG, "SendMessageListener 失败 " + i + " s" + s);  
138 - mHandler.post(new Runnable() {  
139 - @Override  
140 - public void run() {  
141 - Toast.makeText(ChatRoomActivity.this, s, Toast.LENGTH_SHORT).show();  
142 - }  
143 - }); 136 + public void onError(Object o, int i, String s) {
  137 +
144 } 138 }
145 }; 139 };
146 140
  141 + /* private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() {
  142 +
  143 + @Override
  144 + public void onAttached(CNMessage cnMessage) {
  145 + Log.v(TAG, "SendMessageListener onAttached" + cnMessage.getTargetId() + cnMessage.getUserInfo().getUserName());
  146 + }
  147 +
  148 + @Override
  149 + public void onSuccess(final CNMessage cnMessage) {
  150 + mHandler.post(new Runnable() {
  151 + @Override
  152 + public void run() {
  153 + try {
  154 + if (((String) new JSONObject(cnMessage.getContent()).get("type")).equals("2"))
  155 + return;
  156 + } catch (JSONException e) {
  157 + e.printStackTrace();
  158 + }
  159 + if ((roomIdOne).equals(cnMessage.getTargetId())) {
  160 + groupChatOneListMy.add(new CNMessageInfo(cnMessage, true));
  161 + chatListAdapterOne.updateItems(groupChatOneListMy);
  162 + chatListAdapterOne.notifyDataSetChanged();
  163 + }
  164 +
  165 + }
  166 + });
  167 +
  168 + }
  169 +
  170 + @Override
  171 + public void onError(CNMessage cnMessage, int i, final String s) {
  172 + Log.v(TAG, "SendMessageListener 失败 " + i + " s" + s);
  173 + mHandler.post(new Runnable() {
  174 + @Override
  175 + public void run() {
  176 + Toast.makeText(ChatRoomActivity.this, s, Toast.LENGTH_SHORT).show();
  177 + }
  178 + });
  179 + }
  180 + };
  181 + */
147 //连接状态监听 182 //连接状态监听
148 private IChat.OnConnectStatusListener connectStatusListener = new IChat.OnConnectStatusListener() { 183 private IChat.OnConnectStatusListener connectStatusListener = new IChat.OnConnectStatusListener() {
149 @Override 184 @Override
@@ -152,16 +187,15 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL @@ -152,16 +187,15 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL
152 } 187 }
153 }; 188 };
154 189
155 - //接收消息监听 190 +
156 private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() { 191 private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() {
157 @Override 192 @Override
158 - public void processMessage(final CNMessage cnMessage) {  
159 - Log.v(TAG, "receiveMessageListener" + " " + cnMessage.getTargetId() + " " + cnMessage.getContent()); 193 + public void processMessage(final Object o) {
  194 + final CNMessage cnMessage = (CNMessage) o;
160 195
161 mHandler.post(new Runnable() { 196 mHandler.post(new Runnable() {
162 @Override 197 @Override
163 public void run() { 198 public void run() {
164 -  
165 try { 199 try {
166 JSONObject jsonObject = new JSONObject(cnMessage.getContent().toString()); 200 JSONObject jsonObject = new JSONObject(cnMessage.getContent().toString());
167 String type = (String) jsonObject.get("type"); 201 String type = (String) jsonObject.get("type");
@@ -183,12 +217,36 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL @@ -183,12 +217,36 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL
183 }; 217 };
184 218
185 219
  220 + //接收消息监听
  221 + /*private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() {
  222 + @Override
  223 + public void processMessage(final CNMessage cnMessage) {
  224 + Log.v(TAG, "receiveMessageListener" + " " + cnMessage.getTargetId() + " " + cnMessage.getContent());
186 225
  226 + mHandler.post(new Runnable() {
  227 + @Override
  228 + public void run() {
187 229
188 -  
189 -  
190 -  
191 - 230 + try {
  231 + JSONObject jsonObject = new JSONObject(cnMessage.getContent().toString());
  232 + String type = (String) jsonObject.get("type");
  233 + if ("2".equals(type)) {
  234 + Toast.makeText(ChatRoomActivity.this, cnMessage.getUserInfo().getUserName() + "加入聊天室", Toast.LENGTH_SHORT).show();
  235 + return;
  236 + }
  237 + } catch (JSONException e) {
  238 + e.printStackTrace();
  239 + }
  240 + {
  241 + groupChatOneListMy.add(new CNMessageInfo(cnMessage, false));
  242 + chatListAdapterOne.updateItems(groupChatOneListMy);
  243 + chatListAdapterOne.notifyDataSetChanged();
  244 + }
  245 + }
  246 + });
  247 + }
  248 + };
  249 +*/
192 250
193 251
194 //聊天室操作 252 //聊天室操作
@@ -332,7 +390,6 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL @@ -332,7 +390,6 @@ public class ChatRoomActivity extends AppCompatActivity implements View.OnClickL
332 Log.e(TAG, "ConnectListener errorCode : " + i + " : errorMessage : " + s); 390 Log.e(TAG, "ConnectListener errorCode : " + i + " : errorMessage : " + s);
333 391
334 392
335 -  
336 } 393 }
337 }; 394 };
338 395
app/src/main/java/com/cnlive/im/ui/CommentActivity.java
@@ -97,7 +97,7 @@ public class CommentActivity extends AppCompatActivity implements View.OnClickLi @@ -97,7 +97,7 @@ public class CommentActivity extends AppCompatActivity implements View.OnClickLi
97 @Override 97 @Override
98 public void onResponse(CommentPage commentPage) { 98 public void onResponse(CommentPage commentPage) {
99 if (commentPage.getData() != null) { 99 if (commentPage.getData() != null) {
100 -Log.v("commentPage",commentPage.getErrorMessage()+""); 100 + Log.v("commentPage", commentPage.getErrorMessage() + "");
101 List<CommentItem> comments = commentPage.getData().getComments(); 101 List<CommentItem> comments = commentPage.getData().getComments();
102 102
103 recyclerView.setAdapter(commentAdapter); 103 recyclerView.setAdapter(commentAdapter);
@@ -113,7 +113,7 @@ Log.v(&quot;commentPage&quot;,commentPage.getErrorMessage()+&quot;&quot;); @@ -113,7 +113,7 @@ Log.v(&quot;commentPage&quot;,commentPage.getErrorMessage()+&quot;&quot;);
113 commentUtil.programComment(programID, new CommentProgramCallback() { 113 commentUtil.programComment(programID, new CommentProgramCallback() {
114 @Override 114 @Override
115 public void onResponse(CommentProgram commentProgram) { 115 public void onResponse(CommentProgram commentProgram) {
116 - Log.v("commentProgram",commentProgram.getData().getComments().size()+""); 116 + Log.v("commentProgram", commentProgram.getData().getComments().size() + "");
117 117
118 } 118 }
119 }); 119 });
app/src/main/java/com/cnlive/im/ui/MainActivity.java
@@ -50,6 +50,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe @@ -50,6 +50,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
50 public void onSuccess(String s) { 50 public void onSuccess(String s) {
51 Intent intent = new Intent(MainActivity.this,LoGinActivity.class); 51 Intent intent = new Intent(MainActivity.this,LoGinActivity.class);
52 startActivity(intent); 52 startActivity(intent);
  53 + ChatUtil.removeConnectListener(connectListener);
53 54
54 } 55 }
55 56
app/src/main/java/com/cnlive/im/ui/PrivateChatActivity.java
@@ -139,7 +139,7 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli @@ -139,7 +139,7 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli
139 edit_layout.setVisibility(View.VISIBLE); 139 edit_layout.setVisibility(View.VISIBLE);
140 chatListView.setVisibility(View.VISIBLE); 140 chatListView.setVisibility(View.VISIBLE);
141 CNUserInfo cnName = new CNUserInfo(user_id_string, user_name_string, ""); 141 CNUserInfo cnName = new CNUserInfo(user_id_string, user_name_string, "");
142 - ChatUtil.login(cnName); 142 + ChatUtil.login(cnName,connectListener);
143 143
144 } 144 }
145 145
@@ -195,7 +195,58 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli @@ -195,7 +195,58 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli
195 /** 195 /**
196 * 发送消息监听 196 * 发送消息监听
197 */ 197 */
198 - private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() { 198 +
  199 + private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() {
  200 + @Override
  201 + public void onAttached(Object o) {
  202 +
  203 + }
  204 +
  205 + @Override
  206 + public void onSuccess(Object o) throws JSONException {
  207 + final CNMessage cnMessage = (CNMessage) o;
  208 +
  209 + if (View.VISIBLE == vistor_btn.getVisibility()) {
  210 + vistor_btn.setVisibility(View.GONE);
  211 + }
  212 + mHandler.post(new Runnable() {
  213 + @Override
  214 + public void run() {
  215 + JSONObject jsonObject = null;
  216 + try {
  217 + jsonObject = new JSONObject(cnMessage.getContent().toString());
  218 + String type = (String) jsonObject.get("type");
  219 + String message = (String) jsonObject.get("message");
  220 + Toast.makeText(PrivateChatActivity.this, "发送消息成功", Toast.LENGTH_SHORT).show();
  221 + if ("3".equals(type) && message.equals("你好我们可以进行私聊吗")) {
  222 + sendInfo = 2;
  223 + Toast.makeText(PrivateChatActivity.this, "申请已发送等待对方验证", Toast.LENGTH_SHORT).show();
  224 + } else if ("3".equals(type) && message.equals("拒绝")) {
  225 + sendInfo=5;
  226 + } else if ("3".equals(type) && message.equals("同意")) {
  227 + sendInfo=1;
  228 + } else if ("4".equals(type)) {
  229 + messageList.add(new ChatRoomActivity.CNMessageInfo(cnMessage, true));
  230 + chatListAdapter.updateItems(messageList);
  231 + chatListAdapter.notifyDataSetChanged();
  232 + }
  233 + } catch (JSONException e) {
  234 +
  235 +
  236 + }
  237 +
  238 + }
  239 + });
  240 + }
  241 +
  242 + @Override
  243 + public void onError(Object o, int i, String s) {
  244 +
  245 + }
  246 + };
  247 +
  248 +
  249 + /*private IChat.OnSendMessageListener sendMessageListener = new IChat.OnSendMessageListener() {
199 250
200 @Override 251 @Override
201 public void onAttached(CNMessage cnMessage) { 252 public void onAttached(CNMessage cnMessage) {
@@ -256,7 +307,7 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli @@ -256,7 +307,7 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli
256 }); 307 });
257 308
258 } 309 }
259 - }; 310 + };*/
260 311
261 //连接状态监听 312 //连接状态监听
262 private IChat.OnConnectStatusListener connectStatusListener = new IChat.OnConnectStatusListener() { 313 private IChat.OnConnectStatusListener connectStatusListener = new IChat.OnConnectStatusListener() {
@@ -268,7 +319,45 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli @@ -268,7 +319,45 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli
268 } 319 }
269 }; 320 };
270 //接收消息监听 321 //接收消息监听
271 - private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() { 322 + private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() {
  323 + @Override
  324 + public void processMessage(Object o) {
  325 + final CNMessage cnMessage = (CNMessage) o;
  326 + mHandler.post(new Runnable() {
  327 + @Override
  328 + public void run() {
  329 + Log.v("cnMessage", cnMessage.getTargetId() + "," + cnMessage.getUserInfo().getUserId());
  330 + JSONObject jsonObject = null;
  331 + try {
  332 + jsonObject = new JSONObject(cnMessage.getContent().toString());
  333 + String type = (String) jsonObject.get("type");
  334 + if ("3".equals(type) && "你好我们可以进行私聊吗".equals(jsonObject.get("message"))) {
  335 + vistor_btn.setVisibility(View.GONE);
  336 + agree_reject_lin.setVisibility(View.VISIBLE);
  337 + } else if ("3".equals(type) && "同意".equals(jsonObject.get("message"))) {
  338 + sendInfo = 1;
  339 + } else if ("3".equals(type) && "拒绝".equals(jsonObject.get("message"))) {
  340 + sendInfo = 4;
  341 + } else if ("4".equals(type)) {
  342 + Log.v(TAG, cnMessage.getContent().toString());
  343 + messageList.add(new ChatRoomActivity.CNMessageInfo(cnMessage, false));
  344 + chatListAdapter.updateItems(messageList);
  345 + chatListAdapter.notifyDataSetChanged();
  346 + }
  347 +
  348 + } catch (JSONException e) {
  349 + e.printStackTrace();
  350 + }
  351 +
  352 +
  353 + }
  354 + });
  355 +
  356 + }
  357 + };
  358 +
  359 +
  360 + /* private IChat.OnReceiveMessageListener receiveMessageListener = new IChat.OnReceiveMessageListener() {
272 @Override 361 @Override
273 public void processMessage(final CNMessage cnMessage) { 362 public void processMessage(final CNMessage cnMessage) {
274 363
@@ -304,7 +393,7 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli @@ -304,7 +393,7 @@ public class PrivateChatActivity extends AppCompatActivity implements View.OnCli
304 }); 393 });
305 394
306 } 395 }
307 - }; 396 + };*/
308 397
309 398
310 } 399 }
app/src/main/java/com/cnlive/im/view/CircleImageView.java 0 → 100644
  1 +package com.cnlive.im.view;
  2 +
  3 +import android.annotation.SuppressLint;
  4 +import android.content.Context;
  5 +import android.content.res.TypedArray;
  6 +import android.graphics.Bitmap;
  7 +import android.graphics.BitmapShader;
  8 +import android.graphics.Canvas;
  9 +import android.graphics.Color;
  10 +import android.graphics.Matrix;
  11 +import android.graphics.Paint;
  12 +import android.graphics.RectF;
  13 +import android.graphics.Shader;
  14 +import android.graphics.drawable.BitmapDrawable;
  15 +import android.graphics.drawable.ColorDrawable;
  16 +import android.graphics.drawable.Drawable;
  17 +import android.util.AttributeSet;
  18 +import android.widget.ImageView;
  19 +
  20 +import com.cnlive.im.R;
  21 +
  22 +
  23 +/**
  24 + * @author 陈硕
  25 + * @time 2016/11/7 10:27
  26 + * @desc ${TODD}
  27 + */
  28 +@SuppressLint("AppCompatCustomView")
  29 +public class CircleImageView extends ImageView {
  30 +
  31 +
  32 + private static final ImageView.ScaleType SCALE_TYPE = ImageView.ScaleType.CENTER_CROP;
  33 +
  34 + private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
  35 + private static final int COLORDRAWABLE_DIMENSION = 1;
  36 +
  37 + private static final int DEFAULT_BORDER_WIDTH = 0;
  38 + private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
  39 +
  40 + private final RectF mDrawableRect = new RectF();
  41 + private final RectF mBorderRect = new RectF();
  42 +
  43 + private final Matrix mShaderMatrix = new Matrix();
  44 + private final Paint mBitmapPaint = new Paint();
  45 + private final Paint mBorderPaint = new Paint();
  46 +
  47 + private int mBorderColor = DEFAULT_BORDER_COLOR;
  48 + private int mBorderWidth = DEFAULT_BORDER_WIDTH;
  49 +
  50 + private Bitmap mBitmap;
  51 + private BitmapShader mBitmapShader;
  52 + private int mBitmapWidth;
  53 + private int mBitmapHeight;
  54 +
  55 + private float mDrawableRadius;
  56 + private float mBorderRadius;
  57 +
  58 + private boolean mReady;
  59 + private boolean mSetupPending;
  60 +
  61 + public CircleImageView(Context context) {
  62 + super(context);
  63 + }
  64 +
  65 + public CircleImageView(Context context, AttributeSet attrs) {
  66 + this(context, attrs, 0);
  67 + }
  68 +
  69 + public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
  70 + super(context, attrs, defStyle);
  71 + super.setScaleType(SCALE_TYPE);
  72 +
  73 + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);
  74 +
  75 + mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
  76 + mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);
  77 +
  78 + a.recycle();
  79 +
  80 + mReady = true;
  81 +
  82 + if (mSetupPending) {
  83 + setup();
  84 + mSetupPending = false;
  85 + }
  86 + }
  87 +
  88 + @Override
  89 + public ScaleType getScaleType() {
  90 + return SCALE_TYPE;
  91 + }
  92 +
  93 + @Override
  94 + public void setScaleType(ScaleType scaleType) {
  95 + if (scaleType != SCALE_TYPE) {
  96 + throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
  97 + }
  98 + }
  99 +
  100 + @Override
  101 + protected void onDraw(Canvas canvas) {
  102 + if (getDrawable() == null) {
  103 + return;
  104 + }
  105 +
  106 + canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
  107 + canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
  108 + }
  109 +
  110 + @Override
  111 + protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  112 + super.onSizeChanged(w, h, oldw, oldh);
  113 + setup();
  114 + }
  115 +
  116 + public int getBorderColor() {
  117 + return mBorderColor;
  118 + }
  119 +
  120 + public void setBorderColor(int borderColor) {
  121 + if (borderColor == mBorderColor) {
  122 + return;
  123 + }
  124 +
  125 + mBorderColor = borderColor;
  126 + mBorderPaint.setColor(mBorderColor);
  127 + invalidate();
  128 + }
  129 +
  130 + public int getBorderWidth() {
  131 + return mBorderWidth;
  132 + }
  133 +
  134 + public void setBorderWidth(int borderWidth) {
  135 + if (borderWidth == mBorderWidth) {
  136 + return;
  137 + }
  138 +
  139 + mBorderWidth = borderWidth;
  140 + setup();
  141 + }
  142 +
  143 + @Override
  144 + public void setImageBitmap(Bitmap bm) {
  145 + super.setImageBitmap(bm);
  146 + mBitmap = bm;
  147 + setup();
  148 + }
  149 +
  150 + @Override
  151 + public void setImageDrawable(Drawable drawable) {
  152 + super.setImageDrawable(drawable);
  153 + mBitmap = getBitmapFromDrawable(drawable);
  154 + setup();
  155 + }
  156 +
  157 + @Override
  158 + public void setImageResource(int resId) {
  159 + super.setImageResource(resId);
  160 + mBitmap = getBitmapFromDrawable(getDrawable());
  161 + setup();
  162 + }
  163 +
  164 + private Bitmap getBitmapFromDrawable(Drawable drawable) {
  165 + if (drawable == null) {
  166 + return null;
  167 + }
  168 +
  169 + if (drawable instanceof BitmapDrawable) {
  170 + return ((BitmapDrawable) drawable).getBitmap();
  171 + }
  172 +
  173 + try {
  174 + Bitmap bitmap;
  175 +
  176 + if (drawable instanceof ColorDrawable) {
  177 + bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
  178 + } else {
  179 + bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
  180 + }
  181 +
  182 + Canvas canvas = new Canvas(bitmap);
  183 + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
  184 + drawable.draw(canvas);
  185 + return bitmap;
  186 + } catch (OutOfMemoryError e) {
  187 + return null;
  188 + }
  189 + }
  190 +
  191 + private void setup() {
  192 + if (!mReady) {
  193 + mSetupPending = true;
  194 + return;
  195 + }
  196 +
  197 + if (mBitmap == null) {
  198 + return;
  199 + }
  200 +
  201 + mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  202 +
  203 + mBitmapPaint.setAntiAlias(true);
  204 + mBitmapPaint.setShader(mBitmapShader);
  205 +
  206 + mBorderPaint.setStyle(Paint.Style.STROKE);
  207 + mBorderPaint.setAntiAlias(true);
  208 + mBorderPaint.setColor(mBorderColor);
  209 + mBorderPaint.setStrokeWidth(mBorderWidth);
  210 +
  211 + mBitmapHeight = mBitmap.getHeight();
  212 + mBitmapWidth = mBitmap.getWidth();
  213 +
  214 + mBorderRect.set(0, 0, getWidth(), getHeight());
  215 + mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);
  216 +
  217 + mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
  218 + mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);
  219 +
  220 + updateShaderMatrix();
  221 + invalidate();
  222 + }
  223 +
  224 + private void updateShaderMatrix() {
  225 + float scale;
  226 + float dx = 0;
  227 + float dy = 0;
  228 +
  229 + mShaderMatrix.set(null);
  230 +
  231 + if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
  232 + scale = mDrawableRect.height() / (float) mBitmapHeight;
  233 + dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
  234 + } else {
  235 + scale = mDrawableRect.width() / (float) mBitmapWidth;
  236 + dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
  237 + }
  238 +
  239 + mShaderMatrix.setScale(scale, scale);
  240 + mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);
  241 +
  242 + mBitmapShader.setLocalMatrix(mShaderMatrix);
  243 + }
  244 +
  245 +}
  246 +
  247 +
app/src/main/res/layout/commet_item.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent" 3 android:layout_width="match_parent"
4 - android:layout_height="30dp"  
5 - >  
6 - <TextView  
7 - android:id="@+id/nick_name"  
8 - android:text="游客"  
9 - android:layout_width="wrap_content"  
10 - android:layout_height="wrap_content"  
11 - android:layout_marginRight="10dp"/>  
12 -  
13 - <TextView  
14 - android:layout_toRightOf="@+id/nick_name"  
15 - android:layout_toLeftOf="@+id/good_imv"  
16 - android:layout_marginLeft="5dp"  
17 - android:layout_marginRight="5dp"  
18 - android:id="@+id/comment_message"  
19 - android:text="我爱大中国"  
20 - android:layout_width="wrap_content"  
21 - android:layout_height="wrap_content" />  
22 -  
23 - <ImageView android:id="@+id/good_imv"  
24 - android:layout_width="24dp"  
25 - android:layout_height="24dp"  
26 - android:src="@drawable/vod_detail_good"  
27 - android:layout_toLeftOf="@+id/comment_good_count"  
28 - android:layout_marginLeft="5dp"  
29 - android:layout_centerVertical="true"  
30 - android:clickable="true"  
31 - />  
32 -  
33 -  
34 -  
35 - <TextView  
36 - android:id="@+id/comment_good_count"  
37 - android:text="10"  
38 - android:layout_centerVertical="true"  
39 - android:layout_width="wrap_content"  
40 - android:layout_height="wrap_content"  
41 - android:layout_alignParentRight="true"  
42 - android:layout_marginLeft="10dp"  
43 - android:layout_marginRight="10dp"/>  
44 -  
45 -  
46 -</RelativeLayout>  
47 \ No newline at end of file 4 \ No newline at end of file
  5 + android:layout_height="wrap_content"
  6 + android:orientation="vertical"
  7 + >
  8 +
  9 + <RelativeLayout
  10 + android:layout_width="match_parent"
  11 + android:layout_height="wrap_content">
  12 +
  13 + <com.cnlive.im.view.CircleImageView
  14 + android:id="@+id/img_head"
  15 + android:layout_width="30dp"
  16 + android:layout_height="30dp"
  17 + android:layout_centerVertical="true"
  18 + android:layout_marginLeft="5dp"
  19 + android:src="@mipmap/ic_launcher" />
  20 +
  21 +
  22 + <TextView
  23 + android:id="@+id/nick_name"
  24 + android:layout_width="wrap_content"
  25 + android:layout_height="wrap_content"
  26 + android:layout_centerVertical="true"
  27 + android:layout_toRightOf="@+id/img_head"
  28 + android:layout_marginLeft="10dp"
  29 + android:text="游客" />
  30 +
  31 +
  32 + <ImageView
  33 + android:id="@+id/good_imv"
  34 + android:layout_width="24dp"
  35 + android:layout_height="24dp"
  36 + android:layout_centerVertical="true"
  37 + android:layout_marginLeft="5dp"
  38 + android:layout_toLeftOf="@+id/comment_good_count"
  39 + android:clickable="true"
  40 + android:src="@drawable/vod_detail_good" />
  41 +
  42 +
  43 + <TextView
  44 + android:id="@+id/comment_good_count"
  45 + android:layout_width="wrap_content"
  46 + android:layout_height="wrap_content"
  47 + android:layout_alignParentRight="true"
  48 + android:layout_centerVertical="true"
  49 + android:layout_marginLeft="10dp"
  50 + android:layout_marginRight="10dp"
  51 + android:text="10" />
  52 +
  53 + </RelativeLayout>
  54 +
  55 +
  56 + <TextView
  57 + android:id="@+id/comment_message"
  58 + android:layout_width="wrap_content"
  59 + android:layout_height="wrap_content"
  60 + android:layout_marginTop="5dp"
  61 + android:paddingTop="5dp"
  62 + android:layout_marginLeft="10dp"
  63 + android:layout_marginRight="10dp"
  64 + android:text="我爱大中国" />
  65 +
  66 +
  67 + <View
  68 + android:layout_width="match_parent"
  69 + android:layout_height="1px"
  70 + android:layout_marginTop="5dp"
  71 + android:background="#dcdcdc" />
  72 +
  73 +
  74 +
  75 +</LinearLayout>
48 \ No newline at end of file 76 \ No newline at end of file
app/src/main/res/values/attrs.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <declare-styleable name="CircleImageView">
  4 + <attr name="border_width" format="dimension" />
  5 + <attr name="border_color" format="color" />
  6 + </declare-styleable>
  7 +</resources>
0 \ No newline at end of file 8 \ No newline at end of file