android IM聊天室emoji系统表情的实现

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对应位置

            }
        });

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z_Try

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值