Textview\EditText添加表情

/**
 * 为Textview添加表情 
 */
public class ExpressionParser {
    private Context mContext;

    private Pattern mPattern;

    private HashMap<String, Integer> mDrawableMap;

    public static final int[] EXPRESSION_DRAWABLE = {
            R.drawable.ic_launcher, R.drawable.search

    };

    public static String mExpressionDesc[] = new String[] {
            "[梅西]", "[内马尔]"
    };

    public ExpressionParser(Context context) {
        mContext = context;
        mDrawableMap = buildSmileyToRes();
        mPattern = buildPattern();
    }

    private HashMap<String, Integer> buildSmileyToRes() {
        if (EXPRESSION_DRAWABLE.length != mExpressionDesc.length) {
            // 表情的数量需要和数组定义的长度一致!
            throw new IllegalStateException("ExpressionParser resource ID/text mismatch");
        }

        HashMap<String, Integer> map = new HashMap<String, Integer>(mExpressionDesc.length);
        for (int i = 0; i < mExpressionDesc.length; i++) {
            map.put(mExpressionDesc[i], EXPRESSION_DRAWABLE[i]);
        }

        return map;
    }

    // 构建正则表达式
    private Pattern buildPattern() {
        StringBuilder patternString = new StringBuilder(mExpressionDesc.length * 3);
        patternString.append('(');
        for (String s : mExpressionDesc) {
            patternString.append(Pattern.quote(s));
            patternString.append('|');
        }
        patternString.replace(patternString.length() - 1, patternString.length(), ")");

        return Pattern.compile(patternString.toString());
    }

    /**
     *  根据文本替换成图片
     *  exmp:
     *  textview:
     *      String message="asdf巴萨[梅西][内马尔]饿地方";
     *      text.setText (parser.replace (message));
     *  edittext:
     *       edit.setText (parser.replace (edit.getText ()+"[梅西]"));
     *
     **/

    public CharSequence replace(CharSequence text) {
        SpannableStringBuilder builder = new SpannableStringBuilder(text);
        Matcher matcher = mPattern.matcher(text);
        while (matcher.find()) {
            int resId = mDrawableMap.get(matcher.group());
            builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return builder;
    }

    public CharSequence replace(CharSequence text,int textSize) {
        SpannableStringBuilder builder = new SpannableStringBuilder(text);
        Matcher matcher = mPattern.matcher(text);
        while (matcher.find()) {
            int resId = mDrawableMap.get(matcher.group());

            Drawable drawable = mContext.getResources ().getDrawable(resId);
            drawable.setBounds(0, 0, textSize, textSize);//这里根据字体大小设置图片的大小
            ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);

            builder.setSpan(imageSpan, matcher.start(), matcher.end(),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return builder;
    }
}

猜你喜欢

转载自blog.csdn.net/a646796992/article/details/49663479
今日推荐