首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

利用android SmileyParser种实现文本表情功能

2012-07-03 
利用android SmileyParser类实现文本表情功能前段时间做新浪微博,遇到个表情微博处理问题,查了些资料,做了

利用android SmileyParser类实现文本表情功能

前段时间做新浪微博,遇到个表情微博处理问题,查了些资料,做了个demo:

上图:
利用android SmileyParser种实现文本表情功能
要实现这个效果要分为三步:

1.准备表情图片,并新建一个在values文件加下建数组资源文件: arrays.xml

<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
??? xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
? <string-array name="default_smiley_texts">
??? <item >"[爱你]"</item>
???? <item >[机器人]</item>
??? <item >[拜拜]</item>
??? <item >"[抱抱]"</item>
??? <item >"[悲剧]"</item>
??? <item >"[悲伤]"</item>
??? <item >"[便便]"</item>
??? <item >"[鄙视]"</item>
??? <item >"[闭嘴]"</item>
??? <item >"[不要]"</item>
??? <item >"[馋嘴]"</item>
? </string-array>
? <string-array name="default_smiley_names">
??? <item >"爱你"</item>
??? <item >"机器人"</item>
??? <item>"拜拜"</item>
??? <item >"抱抱"</item>
??? <item >"悲剧"</item>
??? <item >"悲伤"</item>
??? <item >"便便"</item>
??? <item>"鄙视"</item>
??? <item >"闭嘴"</item>
??? <item>"不要"</item>
??? <item >"馋嘴"</item>
? </string-array>
</resources>

2.到网上google一下SmileyParser 得到SmileyParser类(http://www.oschina.net/code/explore/android-2.2-froyo/com/android/mms/util/SmileyParser.java)根据需求修改下表情图片与特殊字符对应关系。

下面是我demo中使用的类:

package com.my;


import android.content.Context;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;

//import com.android.mms.R;


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

/**
?* A class for annotating a CharSequence with spans to convert textual emoticons
?* to graphical ones.
?*/
public class SmileyParser {
??? // Singleton stuff

??? private static SmileyParser sInstance;
??? public static SmileyParser getInstance() { return sInstance; }
??? public static void init(Context context) {
??????? sInstance = new SmileyParser(context);
??? }

??? 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();
??? }
???
??? static class Smileys {
??? ?//表情图片集合
??????? private static final int[] sIconIds = {
??????????? R.drawable.aini,
??????????? R.drawable.aoteman,
??????????? R.drawable.baibai,
??????????? R.drawable.baobao,
??????????? R.drawable.beiju,
??????????? R.drawable.beishang,
??????????? R.drawable.bianbian,
??????????? R.drawable.bishi,
??????????? R.drawable.bizui,
??????????? R.drawable.buyao,
??????????? R.drawable.chanzui,????
??????? };
??????? //将图片映射为 文字
??????? public static int aini = 0;
??????? public static int aoteman = 1;
??????? public static int baibai = 2;
??????? public static int baobao = 3;
??????? public static int beiju = 4;
??????? public static int beishang = 5;
??????? public static int bianbian = 6;
??????? public static int bishi = 7;
??????? public static int bizui = 8;
??????? public static int buyao = 9;
??????? public static int chanzui = 10;
?
?
??????? //得到图片表情 根据id
??????? public static int getSmileyResource(int which) {
??????????? return sIconIds[which];
??????? }
??? }

??? // NOTE: if you change anything about this array, you must make the corresponding change

??? // to the string arrays: default_smiley_texts and default_smiley_names in res/values/arrays.xml

??? public static final int[] DEFAULT_SMILEY_RES_IDS = {
??????? Smileys.getSmileyResource(Smileys.aini), // 0
??????? Smileys.getSmileyResource(Smileys.aoteman), // 1
??????? Smileys.getSmileyResource(Smileys.baibai), // 2
??????? Smileys.getSmileyResource(Smileys.baobao), // 3
??????? Smileys.getSmileyResource(Smileys.beiju), // 4
??????? Smileys.getSmileyResource(Smileys.beishang), // 5
??????? Smileys.getSmileyResource(Smileys.bianbian), // 6
??????? Smileys.getSmileyResource(Smileys.bishi), // 7
??????? Smileys.getSmileyResource(Smileys.bizui), // 8
??????? Smileys.getSmileyResource(Smileys.buyao), // 9
??????? Smileys.getSmileyResource(Smileys.chanzui), // 10


??? };

??? public static final int DEFAULT_SMILEY_TEXTS = R.array.default_smiley_texts;
??? public static final int DEFAULT_SMILEY_NAMES = R.array.default_smiley_names;

??? /**
???? * Builds the hashtable we use for mapping the string version
???? * of a smiley (e.g. ":-)") to a resource ID for the icon version.
???? */
??? private HashMap<String, Integer> buildSmileyToRes() {
??????? if (DEFAULT_SMILEY_RES_IDS.length != mSmileyTexts.length) {
??????????? // Throw an exception if someone updated DEFAULT_SMILEY_RES_IDS

??????????? // and failed to update arrays.xml

??????????? 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;
??? }

???
??? /**
???? * Builds the regular expression we use to find smileys in {@link #addSmileySpans}.
???? */
??? //构建正则表达式
??? private Pattern buildPattern() {
??????? // Set the StringBuilder capacity with the assumption that the average

??????? // smiley is 3 characters long.

??????? StringBuilder patternString = new StringBuilder(mSmileyTexts.length * 3);

??????? // Build a regex that looks like (:-)|:-(|...), but escaping the smilies

??????? // properly so they will be interpreted literally by the regex matcher.

??????? patternString.append('(');
??????? for (String s : mSmileyTexts) {
??????????? patternString.append(Pattern.quote(s));
??????????? patternString.append('|');
??????? }
??????? // Replace the extra '|' with a ')'

??????? patternString.replace(patternString.length() - 1, patternString.length(), ")");

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


??? /**
???? * Adds ImageSpans to a CharSequence that replace textual emoticons such
???? * as :-) with a graphical version.
???? *
???? * @param text A CharSequence possibly containing emoticons
???? * @return A CharSequence annotated with ImageSpans covering any
???? * recognized emoticons.
???? */
??? //根据文本替换成图片
??? public CharSequence addSmileySpans(CharSequence text) {
??????? SpannableStringBuilder builder = new SpannableStringBuilder(text);
??????? Matcher matcher = mPattern.matcher(text);
??????? while (matcher.find()) {
??????????? int resId = mSmileyToRes.get(matcher.group());
??????????? builder.setSpan(new ImageSpan(mContext, resId),
??????????????????????????? matcher.start(), matcher.end(),
??????????????????????????? Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
??????? }
??????? return builder;
??? }
}

?

3.SmileyParser类处理完之后就是使用了

?@Override
?public void onCreate(Bundle savedInstanceState) {
??super.onCreate(savedInstanceState);
??setContentView(R.layout.main);

??TextView tvShow = (TextView) findViewById(R.id.tvShow);
??TextView tvSource = (TextView) findViewById(R.id.tvSource);
??------------------------SmileyParser类的使用
??//构建处理对象
??SmileyParser.init(this);??
??SmileyParser parser = SmileyParser.getInstance();
??String text = "[鄙视]"+"+"+ "[爱你]"+"+"+"[便便]"+"+"+"[馋嘴]";
??tvSource.setText("原文:"+text);
??//通过 调用 SmileyParser类的 addSmileySpans()方法处理 文本
??tvShow.setText(parser.addSmileySpans("SmileyParser类处理后:"+text));
?}

?

热点排行