android聊天表情开发

本文介绍了一个简单的表情解析器实现方案,该方案通过正则表达式匹配文本中的表情符号,并将其转换为相应的图像显示。此外,还提供了一个用户界面用于选择表情并插入到输入框中。

转载请注明出处:http://blog.youkuaiyun.com/droyon/article/details/8526271

先来看看效果:

 

源代码下载地址

MyAppActivity.java

package com.android.myappforone;

import java.util.HashMap;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;
import android.text.Editable;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class MyAppActivity extends Activity{
	private static final String TAG = "MyApp";
	
	private TextView mTextView;
	private EditText mEditText;
	private Button mButton ;
	private SmilyParse sp;
	private Context mContext;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.show);
		mContext = MyAppActivity.this;
		sp = new SmilyParse(mContext);
		mTextView = (TextView)findViewById(R.id.show_smily);
		mEditText = (EditText)findViewById(R.id.inpute_smily);
		mButton  = (Button)findViewById(R.id.send);
		mButton.setOnClickListener(ocl);
	}
	
	View.OnClickListener ocl = new View.OnClickListener() {
		
		@Override
		public void onClick(View v) {
			String editTextString = mEditText.getEditableText().toString();
			CharSequence charSequence = sp.compileStringToDisply(editTextString);
			mTextView.append(charSequence);
		}
	};
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(Menu.NONE, 123456, 0, R.string.add_smily);
		return true;
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch(item.getItemId()){
		case 123456:
			showSmilyAlertDialog();
			break;
		}
		return true;
	}
	
	
	public void showSmilyAlertDialog(){
		final SimpleAdapter simpleAdapter = new SimpleAdapter(mContext, sp.getData(), R.layout.smiley_menu_item, 
				new String[]{"icon","name","text"}, new int[]{R.id.smiley_icon,R.id.smiley_name,R.id.smiley_text});
		SimpleAdapter.ViewBinder binder = new SimpleAdapter.ViewBinder() {
			
			@Override
			public boolean setViewValue(View view, Object data,
					String textRepresentation) {
				if(view instanceof ImageView){
					Drawable d = getResources().getDrawable(((Integer)data));
					((ImageView)view).setImageDrawable(d);
					return true;
				}
				return false;
			}
		};
		simpleAdapter.setViewBinder(binder);
		AlertDialog.Builder alb = new AlertDialog.Builder(mContext);
		alb.setTitle("Smily Icon");
		alb.setAdapter(simpleAdapter, new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				HashMap<String ,Object> map = (HashMap<String, Object>) simpleAdapter.getItem(which);
				String text = (String) map.get("text");
				CharSequence charSequence = sp.compileStringToDisply(text);
				Log.d(TAG,"insert charsequence"+charSequence);
				Editable editAble = mEditText.getEditableText();
				int start = mEditText.getSelectionStart();
				int end = mEditText.getSelectionEnd();
				Log.d(TAG,"insert start and end "+start+"--"+end+"editText length"+mEditText.length());
				if(start<0 || end >= mEditText.length()){
					editAble.append(charSequence);
				}else{
//					mEditText.append(charSequence, start, charSequence.length());
					editAble.insert(start, charSequence);
				}
//				dialog.dismiss();
			}
		});
		alb.create().show();
	}
}

SmilyParse.java

package com.android.myappforone;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class SmilyParse {
	private Context mContext;
	private Pattern mPattern;
	private String[] mResArrayName;
	private String[] mResArrayText;
	private Map<String ,Integer> mResToIcons;
	
	private List<Map<String,?>> data = new ArrayList<Map<String,?>>();
	
	public SmilyParse(Context context){
		mContext =context;
		mResArrayName = context.getResources().getStringArray(Smily.DEFAULT_SMILY_NAMES);
		mResArrayText = context.getResources().getStringArray(Smily.DEFAULT_SMILY_TEXT);
		mResToIcons = buileResToDrawableMap();
		mPattern = buildPattern();
		data = buileMap();
	}
	
	private HashMap<String,Integer> buileResToDrawableMap(){
		if(mResArrayText.length != Smily.DEFAULT_SMILY_ICONS.length){
			throw new IllegalStateException("length is Illegal");
		}
		HashMap<String,Integer> map = new HashMap<String,Integer>();
		for(int i=0;i<mResArrayText.length;i++){
			map.put(mResArrayText[i], Smily.DEFAULT_SMILY_ICONS[i]);
		}
		return map;
	}
	
	private Pattern buildPattern(){
		StringBuilder sb = new StringBuilder();
		sb.append('(');
		for(int i=0;i<mResArrayText.length;i++){
			sb.append(Pattern.quote(mResArrayText[i]));
			sb.append('|');
		}
		sb.replace(sb.length() -1, sb.length(), ")");
		return Pattern.compile(sb.toString());
	}
	
	private List<Map<String,?>> buileMap(){
		List<Map<String,?>>	listMap = new ArrayList<Map<String,?>>();
		for(int i=0;i<mResArrayName.length;i++){
			HashMap<String,Object> entry = new HashMap<String,Object>();
			entry.put("icon", Smily.DEFAULT_SMILY_ICONS[i]);
			entry.put("name", mResArrayName[i]);
			entry.put("text", mResArrayText[i]);
			listMap.add(entry);
		}
		return listMap;
	}
	
	static class Smily{
		public static final int DEFAULT_SMILY_TEXT = R.array.default_smiley_texts;
		public static final int DEFAULT_SMILY_NAMES = R.array.default_smiley_names;
		private static final int[] DEFAULT_SMILY_ICONS = {
			R.drawable.emo_im_happy,
            R.drawable.emo_im_sad,
            R.drawable.emo_im_winking,
            R.drawable.emo_im_tongue_sticking_out,
            R.drawable.emo_im_surprised,
            R.drawable.emo_im_kissing,
            R.drawable.emo_im_yelling,
            R.drawable.emo_im_cool,
            R.drawable.emo_im_money_mouth,
            R.drawable.emo_im_foot_in_mouth,
            R.drawable.emo_im_embarrassed,
            R.drawable.emo_im_angel,
            R.drawable.emo_im_undecided,
            R.drawable.emo_im_crying,
            R.drawable.emo_im_lips_are_sealed,
            R.drawable.emo_im_laughing,
            R.drawable.emo_im_wtf,
            R.drawable.emo_im_heart,
            R.drawable.emo_im_mad,
            R.drawable.emo_im_smirk,
            R.drawable.emo_im_pokerface
		};
	}
	
	public List<Map<String,?>> getData(){
		return data;
	}
	
	public CharSequence compileStringToDisply(String text){
		SpannableStringBuilder sb = new SpannableStringBuilder(text);
		
		Matcher m = mPattern.matcher(text);
		
		while(m.find()){
			int resId = mResToIcons.get(m.group());
			sb.setSpan(new ImageSpan(mContext,resId), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		}
		return sb;
	}
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hailushijie

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值