向EditText或TextView中添加笑脸

   


     /*

     * 匹配出字符串中的表情

     * */

     public static SpannableString getExpressionString(Context context, String str) {  

        SpannableString spannableString = new SpannableString(str);

        // 正则表达式匹配字符串里是否含有表情,如: 我好[开心]啊

        String zhengze = "\\[[^\\]]+\\]";

        // 通过传入的正则表达式来生成一个pattern

        Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE);

        Matcher matcher = sinaPatten.matcher(spannableString);

        while (matcher.find()) {

            String key = matcher.group();

            // 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归

            if (matcher.start() < 0) {

                continue;

            }

            int resId = EmojiUtils.getEmojiMapByNameKey().get(key) == null ? -1: EmojiUtils.getEmojiMapByNameKey().get(key);

            if (resId == -1) {

                continue;

            }

            Drawable drawable = context.getResources().getDrawable(resId);

            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());

            ImageSpan imageSpan = new ImageSpan(drawable,ImageSpan.ALIGN_BOTTOM);

            // 计算该图片名字的长度,也就是要替换的字符串的长度

            int end = matcher.start() + key.length();

            // 将该图片替换字符串中规定的位置中

            spannableString.setSpan(imageSpan, matcher.start(), end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        }

        return spannableString;

     }  

    

     /*

      * 将表情插入EditText

      * */

     public static SpannableString getInsertSmailString(Context context,int[] img,int pos){

         Drawable drawable = context.getResources().getDrawable(img[pos]);  

         drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  

         //需要处理的文本,[smile]是需要被替代的文本  

         ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);  

         SpannableString spannable = new SpannableString(EmojiUtils.getEmojiMapByIDKey().get(img[pos]));  

         //要让图片替代指定的文字就要用ImageSpan  

         //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end)  

         //最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12  

         spannable.setSpan(span, 0 , EmojiUtils.getEmojiMapByIDKey().get(img[pos]).length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    

         

         return spannable;

     }

    

    /*

     * Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,这是在 setSpan 时需要指定的 flag,它的意义我试了很久也没试出来,睡个觉,今天早上才突然有点想法,试之,果然。

     * 它是用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果。分别有 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、

     * Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、

     * Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)。

     * */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值