package com.fone.livechannel.ui.room;
import java.io.FileInputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.DynamicDrawableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.view.WindowManager;
import com.fone.livechannel.AppAplication;
import com.fone.livechannel.R;
import com.fone.livechannel.ui.room.websocket.WSConstant;
import com.fone.livechannel.utils.L;
public class EmojiUtils {
private static String TAG = "EmojiUtils";
public EmojiUtils() {
}
public static SpannableString getEmojiString(Context context, String msg,
String regex, String bySpeaker) {
SpannableString spannableString = new SpannableString(msg);
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); // 通过传入的正则表达式来生成一个pattern
try {
dealEmoji(context, spannableString, pattern, 0, bySpeaker, msg);
} catch (Exception e) {
L.e(TAG, TAG, e.getMessage());
}
return spannableString;
}
private static void dealEmoji(Context context,
SpannableString spannableString, Pattern pattern, int start, String bySpeaker, String msg)
throws Exception {
String code = null;
Matcher matcher = pattern.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
Bitmap bm = null;
if (matcher.start() < start) {
continue;
}
if (key != null && key.contains(WSConstant.ADD_ICON)) {
code = key.substring(0, key.lastIndexOf(WSConstant.ADD_ICON));
}
if (code.startsWith("B_1")) {
bm = BitmapFactory.decodeResource(context.getResources(),
R.drawable.chat_gift_free_acquire);
} else if (code.startsWith("B_2")) {
bm = BitmapFactory.decodeResource(context.getResources(),
R.drawable.icon_vip);
} else {
bm = BitmapFactory.decodeFile(RoomUtil.IMAGE_BASE_PATH + code);
}
if (bm == null) {
FileInputStream inStream = context.openFileInput(code);// 只需传文件名
bm = BitmapFactory.decodeStream(inStream);
}
if (bm == null) {
break;
}
int size;
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
int screenWidth = wm.getDefaultDisplay().getWidth();
if (code.startsWith("Q_")) {
size = screenWidth / 20;
} else if (code.startsWith("G_")) {
size = screenWidth / 12;
} else if (code.startsWith("B")) {
size = screenWidth / 22;
} else {
size = bm.getWidth() * 2;
}
Drawable drawable = new BitmapDrawable(bm);
drawable.setBounds(0, 0, size, size);
ImageSpan imageSpan = null;
if (code.startsWith("B_2")) {
imageSpan = new ImageSpan(drawable,
DynamicDrawableSpan.ALIGN_BASELINE); // ?通过图片资源id来得到bitmap,用一个ImageSpan来包装
} else {
imageSpan = new ImageSpan(drawable,
DynamicDrawableSpan.ALIGN_BOTTOM); // ?通过图片资源id来得到bitmap,用一个ImageSpan来包装
}
int end = matcher.start() + key.length(); // 计算该图片名字的长度,也就是要替换的字符串的长度
spannableString.setSpan(imageSpan, matcher.start(), end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 将该图片替换字符串中规定的位置中
int bySpeakerStart = msg.indexOf(bySpeaker);
int bySpeakerEnd = bySpeakerStart + bySpeaker.length();
int colorid = AppAplication.getGlobalContext().getResources().getColor(R.color.room_tab_text_click_color);
if (bySpeakerEnd != 0){
spannableString.setSpan(new ForegroundColorSpan(colorid), bySpeakerStart, bySpeakerEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (end < spannableString.length()) { // 如果整个字符串还未验证完,则继续
dealEmoji(context, spannableString, pattern, end, bySpeaker, msg);
}
break;
}
}
}
转载于:https://www.cnblogs.com/ywq-come/p/5926616.html