废话少说,直接上效果图。
主要的文件有两个:emoji_ios7.txt和EmojiTransfer.java,前一个存储表情字符串,在andorid手机中打开可以看到,共907个。不过有些手机不支持。
后一个文件是表情字符和普通字符相互转化的工具类。
先上EmojiTransfer.java代码,emoji_ios7.txt在后面下载。
package com.example.dialog;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
public class EmojjTransfer {
private static EmojjTransfer instance;
private Context context;
// <e>xxx</e>(键),表情字符(值)格式
private Map<String, String> transposeMap;
// 表情字符(键)<e>xxx</e>(值)格式
private Map<String, String> emojiTransposeMap;
// 搜索表情字符的正则
private String emoji_pattern;
// 搜索特殊字符的正则
private String special_pattern;
public static EmojjTransfer getInstance(Context context) {
if (instance == null) {
instance = new EmojjTransfer(context);
}
return instance;
}
public EmojjTransfer(Context context) {
transposeMap = new HashMap<String, String>();
emojiTransposeMap = new HashMap<String, String>();
this.context=context;
createMaps();
createPattern();
}
// 将字符串中的表情字符转成<e>F00001E</e>格式的普通UTF8字符串
public String getStringWithoutEmoji(String content_with_emojj) {
String result = content_with_emojj;
if (!content_with_emojj.isEmpty()) {
ArrayList<String> list = new ArrayList<String>();
String transposedMelody = new String(content_with_emojj);
Pattern p = Pattern.compile(emoji_pattern);
Matcher m = p.matcher(transposedMelody);
while (m.find()) {
list.add(m.group());
}
for (int i = 0; i < list.size(); i++) {
String emojj_string = new String(list.get(i));
String format_string = new String(emojiTransposeMap.get(emojj_string));
transposedMelody=transposedMelody.replace(emojj_string, format_string);
}
result = transposedMelody;
}
return result;
}
public String getStringWithEmojj(String content_without_emojj) {
String result = content_without_emojj;
if (!content_without_emojj.isEmpty()) {
if (existsTag(content_without_emojj)) {
ArrayList<String> list = new ArrayList<String>();
String transposedMelody = new String(content_without_emojj);
Pattern p = Pattern.compile(special_pattern);
Matcher m = p.matcher(transposedMelody);
while (m.find()) {
list.add(m.group());
}
for (int i = 0; i < list.size(); i++) {
String format_string = list.get(i);
String emojj_string = transposeMap.get(format_string);
transposedMelody=transposedMelody.replace(format_string, emojj_string);
}
result = transposedMelody;
}
}
return result;
}
private void createPattern() {
special_pattern = "<e>((?!</?e>).)*</e>";
emoji_pattern="";
int size = emojiTransposeMap.size();
Iterator<?> mIterator = emojiTransposeMap.entrySet().iterator();
while (mIterator.hasNext()) {
if (emoji_pattern.length() > 0) {
emoji_pattern += "|";
}
Entry entry=(Entry) mIterator.next();
emoji_pattern += entry.getKey().toString();
}
}
private void createMaps() {
InputStream in;
int size;
int length;
String txt;
String[] emojjs;
try {
in = context.getAssets().open("emoji_ios7.txt");
size = in.available();
byte[] buffer = new byte[size];
in.read(buffer);
in.close();
txt = new String(buffer);
emojjs = txt.split("\n");
length = emojjs.length;
for (int i = 0; i < length; i++) {
String emojj_string = emojjs[i];
String format_string = "<e>"+hexStringToString(emojjs[i])+"</e>";
transposeMap.put(format_string, emojj_string);
emojiTransposeMap.put(emojj_string, format_string);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 将16进制字符串转换为string
* @param str
* @return
*/
private String hexStringToString(String str) {
char[] chars = "0123456789abcdef".toCharArray();
StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes();
int bit;
for (int i = 0; i < bs.length; i++) {
bit = (bs[i] & 0x0f0) >> 4;
sb.append(chars[bit]);
bit = bs[i] & 0x0f;
sb.append(chars[bit]);
}
return sb.toString();
}
/*
* private String stringToHexString(String content) { return null; }
*/
/**
* 判断是否存在格式字符串
*
* @param content
* @return
*/
private boolean existsTag(String content) {
boolean flag = false;
String tag1 = "<e>";
String tag2 = "</e>";
if (content.contains(tag1)) {
if (content.contains(tag2)) {
flag = true;
}
}
return flag;
}
}
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
public class EmojjTransfer {
private static EmojjTransfer instance;
private Context context;
// <e>xxx</e>(键),表情字符(值)格式
private Map<String, String> transposeMap;
// 表情字符(键)<e>xxx</e>(值)格式
private Map<String, String> emojiTransposeMap;
// 搜索表情字符的正则
private String emoji_pattern;
// 搜索特殊字符的正则
private String special_pattern;
public static EmojjTransfer getInstance(Context context) {
if (instance == null) {
instance = new EmojjTransfer(context);
}
return instance;
}
public EmojjTransfer(Context context) {
transposeMap = new HashMap<String, String>();
emojiTransposeMap = new HashMap<String, String>();
this.context=context;
createMaps();
createPattern();
}
// 将字符串中的表情字符转成<e>F00001E</e>格式的普通UTF8字符串
public String getStringWithoutEmoji(String content_with_emojj) {
String result = content_with_emojj;
if (!content_with_emojj.isEmpty()) {
ArrayList<String> list = new ArrayList<String>();
String transposedMelody = new String(content_with_emojj);
Pattern p = Pattern.compile(emoji_pattern);
Matcher m = p.matcher(transposedMelody);
while (m.find()) {
list.add(m.group());
}
for (int i = 0; i < list.size(); i++) {
String emojj_string = new String(list.get(i));
String format_string = new String(emojiTransposeMap.get(emojj_string));
transposedMelody=transposedMelody.replace(emojj_string, format_string);
}
result = transposedMelody;
}
return result;
}
public String getStringWithEmojj(String content_without_emojj) {
String result = content_without_emojj;
if (!content_without_emojj.isEmpty()) {
if (existsTag(content_without_emojj)) {
ArrayList<String> list = new ArrayList<String>();
String transposedMelody = new String(content_without_emojj);
Pattern p = Pattern.compile(special_pattern);
Matcher m = p.matcher(transposedMelody);
while (m.find()) {
list.add(m.group());
}
for (int i = 0; i < list.size(); i++) {
String format_string = list.get(i);
String emojj_string = transposeMap.get(format_string);
transposedMelody=transposedMelody.replace(format_string, emojj_string);
}
result = transposedMelody;
}
}
return result;
}
private void createPattern() {
special_pattern = "<e>((?!</?e>).)*</e>";
emoji_pattern="";
int size = emojiTransposeMap.size();
Iterator<?> mIterator = emojiTransposeMap.entrySet().iterator();
while (mIterator.hasNext()) {
if (emoji_pattern.length() > 0) {
emoji_pattern += "|";
}
Entry entry=(Entry) mIterator.next();
emoji_pattern += entry.getKey().toString();
}
}
private void createMaps() {
InputStream in;
int size;
int length;
String txt;
String[] emojjs;
try {
in = context.getAssets().open("emoji_ios7.txt");
size = in.available();
byte[] buffer = new byte[size];
in.read(buffer);
in.close();
txt = new String(buffer);
emojjs = txt.split("\n");
length = emojjs.length;
for (int i = 0; i < length; i++) {
String emojj_string = emojjs[i];
String format_string = "<e>"+hexStringToString(emojjs[i])+"</e>";
transposeMap.put(format_string, emojj_string);
emojiTransposeMap.put(emojj_string, format_string);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 将16进制字符串转换为string
* @param str
* @return
*/
private String hexStringToString(String str) {
char[] chars = "0123456789abcdef".toCharArray();
StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes();
int bit;
for (int i = 0; i < bs.length; i++) {
bit = (bs[i] & 0x0f0) >> 4;
sb.append(chars[bit]);
bit = bs[i] & 0x0f;
sb.append(chars[bit]);
}
return sb.toString();
}
/*
* private String stringToHexString(String content) { return null; }
*/
/**
* 判断是否存在格式字符串
*
* @param content
* @return
*/
private boolean existsTag(String content) {
boolean flag = false;
String tag1 = "<e>";
String tag2 = "</e>";
if (content.contains(tag1)) {
if (content.contains(tag2)) {
flag = true;
}
}
return flag;
}
}
显示表情字符用的是GridView,它的Adapter代码如下
package com.example.dialog;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class GridViewAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> List;
private ViewHolder holder;
private OnItemClickListener mOnItemClickListener;
public GridViewAdapter(Context context, ArrayList<String> List,OnItemClickListener mOnItemClickListener)
{
this.context=context;
this.List=List;
this.mOnItemClickListener=mOnItemClickListener;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return List.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final int pos=position;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(
R.layout.item, null);
holder.tv=(TextView)convertView.findViewById(R.id.emojj);
holder.tv.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context, ((TextView)v).getText().toString(), Toast.LENGTH_SHORT).show();
mOnItemClickListener.onItemClick(((TextView)v).getText().toString());
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv.setText(List.get(position));
return convertView;
}
public class ViewHolder
{
public TextView tv;
}
}
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class GridViewAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> List;
private ViewHolder holder;
private OnItemClickListener mOnItemClickListener;
public GridViewAdapter(Context context, ArrayList<String> List,OnItemClickListener mOnItemClickListener)
{
this.context=context;
this.List=List;
this.mOnItemClickListener=mOnItemClickListener;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return List.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final int pos=position;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(
R.layout.item, null);
holder.tv=(TextView)convertView.findViewById(R.id.emojj);
holder.tv.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context, ((TextView)v).getText().toString(), Toast.LENGTH_SHORT).show();
mOnItemClickListener.onItemClick(((TextView)v).getText().toString());
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv.setText(List.get(position));
return convertView;
}
public class ViewHolder
{
public TextView tv;
}
}
MainActivity.java代码
package com.example.dialog;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.TextView;
public class MainActivity extends Activity implements OnItemClickListener,OnClickListener{
private GridView gv;
private ArrayList<String> list;
private GridViewAdapter adapter;
private EditText et;
private TextView tv;
private Button btn_jx,btn_input;
private EmojjTransfer mEmojjTransfer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initVariables();
tv=(TextView)findViewById(R.id.textView1);
btn_jx=(Button)findViewById(R.id.button1);
btn_input=(Button)findViewById(R.id.button2);
btn_jx.setOnClickListener(this);
btn_input.setOnClickListener(this);
et=(EditText)findViewById(R.id.input);
gv = (GridView) findViewById(R.id.gridView1);
adapter=new GridViewAdapter(getBaseContext(),list,this);
gv.setAdapter(adapter);
mEmojjTransfer=EmojjTransfer.getInstance(this);
}
private void initVariables() {
try {
InputStream in=getAssets().open("emoji_ios7.txt");
int size=in.available();
byte[]buffer=new byte[size];
in.read(buffer);
in.close();
String txt=new String(buffer);
String[] emojjs=txt.split("\n");
list=new ArrayList<String>();
for(int i=0;i<70;i++)
{
list.add(emojjs[i]);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onClick(View v) {
String content;
switch(v.getId())
{
case R.id.button1:
content=mEmojjTransfer.getStringWithoutEmoji(et.getText().toString());
tv.setText(content);
break;
case R.id.button2:
content=mEmojjTransfer.getStringWithEmojj(tv.getText().toString());
et.append(content);
break;
}
}
@Override
public void onItemClick(String content) {
// TODO Auto-generated method stub
et.append(content);
}
}
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.TextView;
public class MainActivity extends Activity implements OnItemClickListener,OnClickListener{
private GridView gv;
private ArrayList<String> list;
private GridViewAdapter adapter;
private EditText et;
private TextView tv;
private Button btn_jx,btn_input;
private EmojjTransfer mEmojjTransfer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initVariables();
tv=(TextView)findViewById(R.id.textView1);
btn_jx=(Button)findViewById(R.id.button1);
btn_input=(Button)findViewById(R.id.button2);
btn_jx.setOnClickListener(this);
btn_input.setOnClickListener(this);
et=(EditText)findViewById(R.id.input);
gv = (GridView) findViewById(R.id.gridView1);
adapter=new GridViewAdapter(getBaseContext(),list,this);
gv.setAdapter(adapter);
mEmojjTransfer=EmojjTransfer.getInstance(this);
}
private void initVariables() {
try {
InputStream in=getAssets().open("emoji_ios7.txt");
int size=in.available();
byte[]buffer=new byte[size];
in.read(buffer);
in.close();
String txt=new String(buffer);
String[] emojjs=txt.split("\n");
list=new ArrayList<String>();
for(int i=0;i<70;i++)
{
list.add(emojjs[i]);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onClick(View v) {
String content;
switch(v.getId())
{
case R.id.button1:
content=mEmojjTransfer.getStringWithoutEmoji(et.getText().toString());
tv.setText(content);
break;
case R.id.button2:
content=mEmojjTransfer.getStringWithEmojj(tv.getText().toString());
et.append(content);
break;
}
}
@Override
public void onItemClick(String content) {
// TODO Auto-generated method stub
et.append(content);
}
}
还有一个回调接口
package com.example.dialog;
public interface OnItemClickListener {
public void onItemClick(String content);
}
public interface OnItemClickListener {
public void onItemClick(String content);
}