1.首先需要获取系统表情图标与对应的编码
https://unicode-table.com/en/sets/faces/
2.需要在values文件夹下创建arrays.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="smiley_array">
<item>/0x1F60A/</item>
<item>/0x1F60C/</item>
<item>/0x1F601/</item>
<item>/0x1F605/</item>
<item>/0x1F602/</item>
<item>/0x1F642/</item>
<item>/0x1F62C/</item>
<item>/0x1F606/</item>
<item>/0x1F923/</item>
<item>/0x1F60B/</item>
</string-array>
</resources>
3.写一个表情图标管理类,这边为了方便管理,图标通过编码映射显示
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;
import android.util.Log;
import com.just4fun.tga.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SmileyParser {
private static SmileyParser sInstance;
public static SmileyParser getInstance() {
return sInstance;
}
public static void init(Context context) {
sInstance = new SmileyParser(context);
}
public static List<String> listEmojiStirng=new ArrayList<>();
private final Context mContext;
private final String[] mSmileyTexts;
private final Pattern mPattern;
private final HashMap<String, Integer> mSmileyToRes;
private SmileyParser(Context context) {
mContext = context;
mSmileyTexts = mContext.getResources().getStringArray(
DEFAULT_SMILEY_TEXTS);
mSmileyToRes = buildSmileyToRes();
mPattern = buildPattern();
listEmojiStirng.add("/0x1F60A/");
listEmojiStirng.add("/0x1F60C/");
listEmojiStirng.add("/0x1F601/");
listEmojiStirng.add("/0x1F605/");
listEmojiStirng.add("/0x1F602/");
listEmojiStirng.add("/0x1F642/");
listEmojiStirng.add("/0x1F62C/");
listEmojiStirng.add("/0x1F606/");
listEmojiStirng.add("/0x1F923/");
listEmojiStirng.add("/0x1F60B/")
}
public static class Smileys {
// 表情图片集合
public static final int[] sIconIds = {
R.mipmap.a0, R.mipmap.a1, R.mipmap.a2, R.mipmap.a3, R.mipmap.a4,
R.mipmap.a5, R.mipmap.a6, R.mipmap.a7, R.mipmap.a8, R.mipmap.a9,
R.mipmap.a10
};
// 将图片映射为 文字
public static int a0 = 0;
public static int a1 = 1;
public static int a2 = 2;
public static int a3 = 3;
public static int a4 = 4;
public static int a5 = 5;
public static int a6 = 6;
public static int a7 = 7;
public static int a8 = 8;
public static int a9 = 9;
public static int a10 = 10
// 得到图片表情 根据id
public static int getSmileyResource(int which) {
return sIconIds[which];
}
}
public static final int[] DEFAULT_SMILEY_RES_IDS = {
Smileys.getSmileyResource(Smileys.a0),
Smileys.getSmileyResource(Smileys.a1),
Smileys.getSmileyResource(Smileys.a2),
Smileys.getSmileyResource(Smileys.a3),
Smileys.getSmileyResource(Smileys.a4),
Smileys.getSmileyResource(Smileys.a5),
Smileys.getSmileyResource(Smileys.a6),
Smileys.getSmileyResource(Smileys.a7),
Smileys.getSmileyResource(Smileys.a8),
Smileys.getSmileyResource(Smileys.a9),
Smileys.getSmileyResource(Smileys.a10)
};
public static final int DEFAULT_SMILEY_TEXTS = R.array.smiley_array;
private HashMap<String, Integer> buildSmileyToRes() {
if (DEFAULT_SMILEY_RES_IDS.length != mSmileyTexts.length) {
throw new IllegalStateException("Smiley resource ID/text mismatch");
}
HashMap<String, Integer> smileyToRes = new HashMap<String, Integer>(
mSmileyTexts.length);
for (int i = 0; i < mSmileyTexts.length; i++) {
smileyToRes.put(mSmileyTexts[i], DEFAULT_SMILEY_RES_IDS[i]);
}
return smileyToRes;
}
// 构建正则表达式
private Pattern buildPattern() {
StringBuilder patternString = new StringBuilder(mSmileyTexts.length * 3);
patternString.append('(');
for (String s : mSmileyTexts) {
patternString.append(Pattern.quote(s));
patternString.append('|');
}
patternString.replace(patternString.length() - 1, patternString
.length(), ")");
return Pattern.compile(patternString.toString());
}
// 根据文本替换成图片
public CharSequence strToSmiley(CharSequence text) {
SpannableStringBuilder builder = new SpannableStringBuilder(text);
Matcher matcher = mPattern.matcher(text);
while (matcher.find()) {
int resId = mSmileyToRes.get(matcher.group());
Drawable drawable = mContext.getResources().getDrawable(resId);
drawable.setBounds(0, 0, 55, 55);//这里设置图片的大小
ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);
builder.setSpan(imageSpan, matcher.start(),
matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return builder;
}
}
4.写一个显示图标的适配器EmojiAdapter,我这里使用的gridview
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class EmojiAdapter extends BaseAdapter {
private final Context mContext;
private int[] mData=new int[]{};
public EmojiAdapter(Context context, int[] data) {
this.mContext = context;
this.mData = data;
}
@Override
public int getCount() {
return mData.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = View.inflate(mContext, R.layout.emoji_grid_layout, null);
viewHolder = new ViewHolder();
viewHolder.img_emoji = convertView.findViewById(R.id.img_emoji);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.img_emoji.setImageResource(mData[position]);
return convertView;
}
public class ViewHolder {
private ImageView img_emoji;
}
}
5.设置gridview关联EmojiAdapter,以及EmojiAdapter点击选择emoji
EmojiAdapter emojiAdapter = new EmojiAdapter(ChatRoomActivity.this, SmileyParser.Smileys.sIconIds);
grid_chat.setAdapter(emojiAdapter);
grid_chat.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String s = SmileyParser.listEmojiStirng.get(position);//先获取emoji相对的编码
CharSequence replace = smileyParser.strToSmiley(s);//编码转换成图标
ed_msg.getText().insert(ed_msg.getSelectionStart(),replace);//将转换的图标插入EditText对应位置
}
});