안 드 로 이 드 구현 간단 한 채 팅 방

7361 단어 android
최근 에는 이모 티 콘 을 보 내 고 프로필 사진 을 바 꿀 수 있 는 간단 한 채 팅 방 애플 리 케 이 션 을 썼 다.주요 기술 포 인 트 는 이모 티 콘 을 textview 등 Ui 컨트롤 에 어떻게 보 여 주 느 냐 하 는 것 이다.여 기 는 쓸데없는 말 이 많 지 않 습 니 다. 다음은 효과 도 입 니 다.
 
여기 서 텍스트 를 표정 으로 바 꾸 는 방법 을 설명 합 니 다. 먼저 생각 을 말씀 드 리 겠 습 니 다. 먼저 우리 의 그림 은 로 컬 자원 디 렉 터 리 drawable 에 저장 되 고 모든 자원 파일 은 R 류 로 관리 되 기 때문에 정규 표현 식 을 이용 하여 이미지 id 를 찾 아 ImageSpan 으로 포장 한 다음 에 ImageSpan 을 SpannableString 에 넣 고 마지막 으로 SpannableString 을 edittext 에 넣 을 수 있 습 니 다.다음은 원본 코드 입 니 다.
package com.coreandroid.util;

import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.content.Context;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.util.Log;

import com.coreandroid.chart.R;

public class ExpressionUtil {
	/**
	 *  spanableString      ,      ,        
	 * 
	 * @param context
	 * @param spannableString
	 * @param patten
	 * @param start
	 */
	public static void matchExpression(Context context,
			SpannableString spannableString, Pattern patten, int start)
			throws Exception {
		Matcher matcher = patten.matcher(spannableString);
		while (matcher.find()) {
			String key = matcher.group();
			if (matcher.start() < start) {
				continue;
			}
			Field field = R.drawable.class.getDeclaredField(key);
			int resId = field.getInt(null); //                    id
			if (resId != 0) {
				ImageSpan imageSpan = new ImageSpan(context, resId); //       id   bitmap,   ImageSpan   
				int end = matcher.start() + key.length(); //           ,             
				spannableString.setSpan(imageSpan, matcher.start(), end,
						Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //                 
				if (end < spannableString.length()) { //             ,   。。
					matchExpression(context, spannableString, patten, end);
				}
				break;
			}
		}
	}

	/**
	 *     SpanableString  ,        ,       
	 * 
	 * @param context
	 * @param str
	 * @return SpannableString
	 */
	public static SpannableString getExpressionString(Context context,
			String str, String zhengze) {
		SpannableString spannableString = new SpannableString(str);
		Pattern sinaPatten = Pattern.compile(zhengze); //                pattern
		try {
			matchExpression(context, spannableString, sinaPatten, 0);
		} catch (Exception e) {
			Log.e("dealExpression", e.getMessage());
		}
		return spannableString;
	}

}

다음은 채 팅 기록 목록 의 adapter 입 니 다. 여 기 는 모든 Item 의 구 조 를 동태 적 으로 바 꾸 어 자신 인지 타인 의 발언 인지 구분 합 니 다. 구체 적 인 소스 코드 는 다음 과 같 습 니 다.
package com.coreandroid.adapter;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import android.content.Context;
import android.text.SpannableString;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.coreandroid.chart.R;
import com.coreandroid.entity.MessageInfo;
import com.coreandroid.util.CommonUtils;
import com.coreandroid.util.ExpressionUtil;

public class ChartListAdapter extends BaseAdapter {

	private Context context;

	private LayoutInflater inflater;

	private List data;

	private DateFormat df;

	public ChartListAdapter(Context context, List data) {
		super();
		this.context = context;
		inflater = LayoutInflater.from(context);
		this.data = data;
		df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	}

	@Override
	public int getCount() {
		return data.size();
	}

	@Override
	public Object getItem(int position) {
		return data.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.chart_list_item, null);
			holder = new ViewHolder(convertView);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		holder.setData((MessageInfo) getItem(position));
		return convertView;
	}

	private class ViewHolder {
		private ImageView image;
		private TextView text;
		private TextView title;
		private RelativeLayout rl;

		public ViewHolder(View convertView) {
			image = (ImageView) convertView
					.findViewById(R.id.chart_list_item_headicon);
			text = (TextView) convertView
					.findViewById(R.id.chart_list_item_message);
			title = (TextView) convertView
					.findViewById(R.id.chart_list_item_title);
			rl = (RelativeLayout) convertView
					.findViewById(R.id.rl_chart_list_bottom);
		}

		public void setData(MessageInfo msg) {
			RelativeLayout.LayoutParams rl_tv_msg_left = (RelativeLayout.LayoutParams) text
					.getLayoutParams();
			RelativeLayout.LayoutParams rl_iv_headicon_left = (RelativeLayout.LayoutParams) image
					.getLayoutParams();
			RelativeLayout.LayoutParams rl_tv_title = (RelativeLayout.LayoutParams) title
					.getLayoutParams();
			RelativeLayout.LayoutParams rl_buttom = (RelativeLayout.LayoutParams) rl
					.getLayoutParams();
			if (!CommonUtils.getDeviceId().equalsIgnoreCase(msg.getUsermac())) {
				//      mac                      
				//        ,      ;       ,      
				rl_buttom.addRule(RelativeLayout.ALIGN_PARENT_TOP);

				rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
				rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
				rl_tv_title.addRule(RelativeLayout.BELOW,
						R.id.rl_chart_list_bottom);

				rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
				rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
				rl_tv_msg_left.addRule(RelativeLayout.RIGHT_OF,
						R.id.chart_list_item_headicon);
				text.setBackgroundResource(R.drawable.incoming);
				String titleStr = msg.getUsermac() + "-"
						+ df.format(new Date());
				title.setText(titleStr);
			} else {
				rl_buttom.addRule(RelativeLayout.ALIGN_PARENT_TOP);

				rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
				rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
				rl_tv_title.addRule(RelativeLayout.BELOW,
						R.id.rl_chart_list_bottom);

				rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
				rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
				rl_tv_msg_left.addRule(RelativeLayout.LEFT_OF,
						R.id.chart_list_item_headicon);
				text.setBackgroundResource(R.drawable.outgoing);
				String titleStr = df.format(new Date()) + "-"
						+ msg.getUsermac();
				title.setText(titleStr);
			}
			if (!TextUtils.isEmpty(msg.getHeadImage())) {
				image.setImageBitmap(CommonUtils.strConvertBitmap(msg
						.getHeadImage())); //     
			} else {
				image.setImageResource(R.drawable.im);
			}
			String str = msg.getMessage(); //       
			try {
				SpannableString spannableString = ExpressionUtil
						.getExpressionString(context, str, CommonUtils.PATTERN);
				text.setText(spannableString);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

 
자, 핵심 코드 는 이미 인터넷 에 접속 하 였 습 니 다. 관심 있 는 것 은 원본 코드 를 다운로드 하여 연구 할 수 있 습 니 다!
원본 주소:http://download.csdn.net/detail/yaoyeyzq/4970408

좋은 웹페이지 즐겨찾기