向android程序中加入ios的表情字符

废话少说,直接上效果图。

主要的文件有两个: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;
}
}


显示表情字符用的是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;
}


}

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


}

还有一个回调接口
package com.example.dialog;


public interface OnItemClickListener {


public void onItemClick(String content);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值