EmoticonsEditText.java 2.8 KB
package com.xdy.home.widget.emoji;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.widget.EditText;


public class EmoticonsEditText extends EditText {

	private int mEmojiconSize;
	private int mEmojiconTextSize;
	private boolean mUseSystemDefault = false;

	public EmoticonsEditText(Context context) {
		super(context);
		mEmojiconSize = (int) getTextSize();
		mEmojiconTextSize = (int) getTextSize();
	}

	public EmoticonsEditText(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(attrs);
	}

	public EmoticonsEditText(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(attrs);
	}

	private void init(AttributeSet attrs) {
		TypedArray a = getContext().obtainStyledAttributes(attrs, com.rockerhieu.emojicon.R.styleable.Emojicon);
		mEmojiconSize = (int) a.getDimension(com.rockerhieu.emojicon.R.styleable.Emojicon_emojiconSize, getTextSize());
		mUseSystemDefault = a.getBoolean(com.rockerhieu.emojicon.R.styleable.Emojicon_emojiconUseSystemDefault, false);
		a.recycle();
		mEmojiconTextSize = (int) getTextSize();
		//setText(getText());
	}

	@Override
	public void setText(CharSequence text, BufferType type) {
		if (!TextUtils.isEmpty(text)) {
			super.setText(replace(text), type);
		} else {
			super.setText(text, type);
		}
	}
	
	private Pattern buildPattern() {
		StringBuilder patternString = new StringBuilder(EmojiconHandler.mEmoticons.size() * 3);
		patternString.append('(');
		for (int i = 0; i < EmojiconHandler.mEmoticons.size(); i++) {
			String s = EmojiconHandler.mEmoticons.get(i);
			patternString.append(Pattern.quote(s));
			patternString.append('|');
		}
		patternString.replace(patternString.length() - 1,
				patternString.length(), ")");
		return Pattern.compile(patternString.toString());
	}

	private CharSequence replace(CharSequence text) {
		try {
			SpannableStringBuilder builder = new SpannableStringBuilder(text);
			Pattern pattern = buildPattern();
			Matcher matcher = pattern.matcher(text);
			while (matcher.find()) {
				if (EmojiconHandler.mEmoticonsId.containsKey(matcher.group())) {
					int id = EmojiconHandler.mEmoticonsId.get(matcher.group());
					Bitmap bitmap = BitmapFactory.decodeResource(
							getResources(), id);
					if (bitmap != null) {
						ImageSpan span = new ImageSpan(getContext(), bitmap);
						builder.setSpan(span, matcher.start(), matcher.end(),
								Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
					}
				}
			}
			return builder;
		} catch (Exception e) {
			return text;
		}
	}

}