Android开发自定义表情

308 阅读1分钟
Android开发自定义表情

聊天中自定义表情,评论中自定义表情。用户要发表东西,一般都需要加上表情

一、思路:

用谷歌的字符编码做表情

二、效果图:

在这里插入图片描述

三、关键代码:
public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        EmojiCompat.init(new BundledEmojiCompatConfig(this)
                .setReplaceAll(true));
    }
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText et_comment = findViewById(R.id.et_comment);
        MyBanner mybanner_emoji = findViewById(R.id.mybanner_emoji);

        mybanner_emoji.setDatas(getPagerList(this, EmojiDatas.listList, new OnEmojiClickListener() {
            @Override
            public void onClick(int emoji) {
                if (emoji == -1){
                    KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
                    et_comment.onKeyDown(KeyEvent.KEYCODE_DEL, event);
                } else {
                    et_comment.append(EmojiUtil.Character2Chars(emoji));
                }

            }
        }),2,0,R.drawable.point_background_3,false);
    }

    public   List<View> getPagerList(Context mContext, List<List<Integer>> mEmojis, final OnEmojiClickListener mEmojiClickListener) {
        List<View> pagers = null;
        //String[] eachPageEmojis = null;
        if (null != mEmojis && mEmojis.size() > 0) {
            pagers = new ArrayList<>();
            int pageCount = mEmojis.size();//共8页表情
            for (int i = 0; i < pageCount; i++) {
                GridView gridView = new GridView(mContext);
                gridView.setNumColumns(7);
                gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
                gridView.setHorizontalSpacing(dp2px(mContext,10));
                gridView.setVerticalSpacing(dp2px(mContext,15));
                gridView.setAdapter(new EmojiGvAdapter(mContext, mEmojis.get(i)));
                //点击表情监听
                gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        //获取选中的表情字符
                        int emoji = (int) parent.getAdapter().getItem(position);
                        if (null != mEmojiClickListener) {
                            mEmojiClickListener.onClick(emoji);
                        }
                    }
                });
                pagers.add(gridView);
            }
        }
        return pagers;
    }

    /**
     * dp转px
     *
     * @param dpValue dp值
     * @return px值
     */
    public  int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}
public class EmojiGvAdapter extends BaseAdapter {
    private Context mContext;
    private List<Integer> mEmojis;

    public EmojiGvAdapter(Context context, List<Integer> eachPageEmojis) {
        this.mContext = context;
        this.mEmojis = eachPageEmojis;
    }

    @Override
    public int getCount() {
        return null == mEmojis ? 0 : mEmojis.size();
    }

    @Override
    public Integer getItem(int position) {
        return null == mEmojis ? 0 : mEmojis.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (null == convertView) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_emoji, parent, false);
            holder.emojiTv = (TextView) convertView.findViewById(R.id.tv_emoji);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        if (getItem(position) == -1){
            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) holder.emojiTv.getLayoutParams();
            lp.width = dp2px(mContext,28);
            lp.height = dp2px(mContext,28);
            lp.leftMargin = dp2px(mContext,8);
            lp.topMargin = dp2px(mContext,2);
            holder.emojiTv.setLayoutParams(lp);
            holder.emojiTv.setBackgroundResource(R.mipmap.rc_icon_emoji_delete);
        } else {
            FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.WRAP_CONTENT);
            holder.emojiTv.setLayoutParams(lp);
            holder.emojiTv.setText(EmojiUtil.Character2Chars(getItem(position)));
        }

        return convertView;
    }

    private static class ViewHolder {
        private TextView emojiTv;
    }

    /**
     * dp转px
     *
     * @param dpValue dp值
     * @return px值
     */
    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

}
四、项目demo源码结构图:

在这里插入图片描述

有问题或者需要完整源码demo的可以看简介联系我,也可以私信我,我每天都看私信的