日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

android 仿QQ聊天,帶表情,可翻頁,帶翻頁拖動(dòng)

系統(tǒng) 2360 0

如題,這是公司項(xiàng)目的一個(gè)功能模塊,先上個(gè)效果圖:

android 仿QQ聊天,帶表情,可翻頁,帶翻頁拖動(dòng)緩沖

其次大致說說原理:

1,首先判斷輸入的字符,是否包 含表情的文 字,比如 這個(gè)表情對(duì)應(yīng)的文件名為emoji_1.png,它對(duì)應(yīng)的文字描述 : [可愛] ,如果我們?cè)谳敵龅氖禽敵鲞@么一句話:老婆,我想你了 。 那么我們對(duì)應(yīng)的根本文字就是: 老婆,我想你了[可愛]


2,具體的轉(zhuǎn)換過程就是用正則表達(dá)式比配文字中是否含有[xxx]這類的文字,如果有,那么我們就根據(jù)拿到的[xxx]找到它對(duì)應(yīng)的資源文件id,當(dāng)然這其中有一個(gè)關(guān)系表,看你怎么處理這個(gè)關(guān)系了。最后將其用SpannableString替換成文字,表面上顯示有圖片,其實(shí)TextView里的text依然是: 老婆,我想你了[可愛] 。這個(gè)過程明白么?


下面貼上DEMO工程的結(jié)構(gòu):

android 仿QQ聊天,帶表情,可翻頁,帶翻頁拖動(dòng)緩沖

再貼上幾個(gè)重要的類:

    package com.example.facedemo;

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

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.util.Log;

/**
 * 
 ****************************************** 
 * @author 廖乃波
 * @文件名稱 : FaceConversionUtil.java
 * @創(chuàng)建時(shí)間 : 2013-1-27 下午02:34:09
 * @文件描述 : 表情轉(zhuǎn)換工具
 ****************************************** 
 */
public class FaceConversionUtil {

	/** 每一頁表情的個(gè)數(shù) */
	private int pageSize = 20;

	private static FaceConversionUtil mFaceConversionUtil;

	/** 保存于內(nèi)存中的表情HashMap */
	private HashMap<String, String> emojiMap = new HashMap<String, String>();

	/** 保存于內(nèi)存中的表情集合 */
	private List<ChatEmoji> emojis = new ArrayList<ChatEmoji>();

	/** 表情分頁的結(jié)果集合 */
	public List<List<ChatEmoji>> emojiLists = new ArrayList<List<ChatEmoji>>();

	private FaceConversionUtil() {

	}

	public static FaceConversionUtil getInstace() {
		if (mFaceConversionUtil == null) {
			mFaceConversionUtil = new FaceConversionUtil();
		}
		return mFaceConversionUtil;
	}

	/**
	 * 得到一個(gè)SpanableString對(duì)象,通過傳入的字符串,并進(jìn)行正則判斷
	 * 
	 * @param context
	 * @param str
	 * @return
	 */
	public SpannableString getExpressionString(Context context, String str) {
		SpannableString spannableString = new SpannableString(str);
		// 正則表達(dá)式比配字符串里是否含有表情,如: 我好[開心]啊
		String zhengze = "\\[[^\\]]+\\]";
		// 通過傳入的正則表達(dá)式來生成一個(gè)pattern
		Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE);
		try {
			dealExpression(context, spannableString, sinaPatten, 0);
		} catch (Exception e) {
			Log.e("dealExpression", e.getMessage());
		}
		return spannableString;
	}

	/**
	 * 添加表情
	 * 
	 * @param context
	 * @param imgId
	 * @param spannableString
	 * @return
	 */
	public SpannableString addFace(Context context, int imgId,
			String spannableString) {
		if (TextUtils.isEmpty(spannableString)) {
			return null;
		}
		Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
				imgId);
		bitmap = Bitmap.createScaledBitmap(bitmap, 35, 35, true);
		ImageSpan imageSpan = new ImageSpan(context, bitmap);
		SpannableString spannable = new SpannableString(spannableString);
		spannable.setSpan(imageSpan, 0, spannableString.length(),
				Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		return spannable;
	}

	/**
	 * 對(duì)spanableString進(jìn)行正則判斷,如果符合要求,則以表情圖片代替
	 * 
	 * @param context
	 * @param spannableString
	 * @param patten
	 * @param start
	 * @throws Exception
	 */
	private void dealExpression(Context context,
			SpannableString spannableString, Pattern patten, int start)
			throws Exception {
		Matcher matcher = patten.matcher(spannableString);
		while (matcher.find()) {
			String key = matcher.group();
			// 返回第一個(gè)字符的索引的文本匹配整個(gè)正則表達(dá)式,ture 則繼續(xù)遞歸
			if (matcher.start() < start) {
				continue;
			}
			String value = emojiMap.get(key);
			if (TextUtils.isEmpty(value)) {
				continue;
			}
			int resId = context.getResources().getIdentifier(value, "drawable",
					context.getPackageName());
			// 通過上面匹配得到的字符串來生成圖片資源id,下邊的方法可用,但是你工程混淆的時(shí)候就有事了,你懂的。不是我介紹的重點(diǎn)
			// Field field=R.drawable.class.getDeclaredField(value);
			// int resId=Integer.parseInt(field.get(null).toString());
			if (resId != 0) {
				Bitmap bitmap = BitmapFactory.decodeResource(
						context.getResources(), resId);
				bitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, true);
				// 通過圖片資源id來得到bitmap,用一個(gè)ImageSpan來包裝
				ImageSpan imageSpan = new ImageSpan(bitmap);
				// 計(jì)算該圖片名字的長(zhǎng)度,也就是要替換的字符串的長(zhǎng)度
				int end = matcher.start() + key.length();
				// 將該圖片替換字符串中規(guī)定的位置中
				spannableString.setSpan(imageSpan, matcher.start(), end,
						Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
				if (end < spannableString.length()) {
					// 如果整個(gè)字符串還未驗(yàn)證完,則繼續(xù)。。
					dealExpression(context, spannableString, patten, end);
				}
				break;
			}
		}
	}

	public void getFileText(Context context) {
		ParseData(FileUtils.getEmojiFile(context), context);
	}

	/**
	 * 解析字符
	 * 
	 * @param data
	 */
	private void ParseData(List<String> data, Context context) {
		if (data == null) {
			return;
		}
		ChatEmoji emojEentry;
		try {
			for (String str : data) {
				String[] text = str.split(",");
				String fileName = text[0]
						.substring(0, text[0].lastIndexOf("."));
				emojiMap.put(text[1], fileName);
				int resID = context.getResources().getIdentifier(fileName,
						"drawable", context.getPackageName());

				if (resID != 0) {
					emojEentry = new ChatEmoji();
					emojEentry.setId(resID);
					emojEentry.setCharacter(text[1]);
					emojEentry.setFaceName(fileName);
					emojis.add(emojEentry);
				}
			}
			int pageCount = (int) Math.ceil(emojis.size() / 20 + 0.1);

			for (int i = 0; i < pageCount; i++) {
				emojiLists.add(getData(i));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 獲取分頁數(shù)據(jù)
	 * 
	 * @param page
	 * @return
	 */
	private List<ChatEmoji> getData(int page) {
		int startIndex = page * pageSize;
		int endIndex = startIndex + pageSize;

		if (endIndex > emojis.size()) {
			endIndex = emojis.size();
		}
		// 不這么寫,會(huì)在viewpager加載中報(bào)集合操作異常,我也不知道為什么
		List<ChatEmoji> list = new ArrayList<ChatEmoji>();
		list.addAll(emojis.subList(startIndex, endIndex));
		if (list.size() < pageSize) {
			for (int i = list.size(); i < pageSize; i++) {
				ChatEmoji object = new ChatEmoji();
				list.add(object);
			}
		}
		if (list.size() == pageSize) {
			ChatEmoji object = new ChatEmoji();
			object.setId(R.drawable.face_del_icon);
			list.add(object);
		}
		return list;
	}
}
  

下邊是表情布局,帶輸入框的,這樣可以多個(gè)地方使用,就不不會(huì)使用太多多余代碼。


    package com.example.facedemo;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.text.SpannableString;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

/**
 * 
 ******************************************
 * @author 廖乃波
 * @文件名稱	:  FaceRelativeLayout.java
 * @創(chuàng)建時(shí)間	: 2013-1-27 下午02:34:17
 * @文件描述	: 帶表情的自定義輸入框
 ******************************************
 */
public class FaceRelativeLayout extends RelativeLayout implements
		OnItemClickListener, OnClickListener {

	private Context context;

	/** 表情頁的監(jiān)聽事件 */
	private OnCorpusSelectedListener mListener;

	/** 顯示表情頁的viewpager */
	private ViewPager vp_face;

	/** 表情頁界面集合 */
	private ArrayList<View> pageViews;

	/** 游標(biāo)顯示布局 */
	private LinearLayout layout_point;

	/** 游標(biāo)點(diǎn)集合 */
	private ArrayList<ImageView> pointViews;

	/** 表情集合 */
	private List<List<ChatEmoji>> emojis;

	/** 表情區(qū)域 */
	private View view;

	/** 輸入框 */
	private EditText et_sendmessage;

	/** 表情數(shù)據(jù)填充器 */
	private List<FaceAdapter> faceAdapters;

	/** 當(dāng)前表情頁 */
	private int current = 0;

	public FaceRelativeLayout(Context context) {
		super(context);
		this.context = context;
	}

	public FaceRelativeLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
	}

	public FaceRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		this.context = context;
	}

	public void setOnCorpusSelectedListener(OnCorpusSelectedListener listener) {
		mListener = listener;
	}

	/**
	 * 表情選擇監(jiān)聽
	 * 
	 * @author naibo-liao
	 * @時(shí)間: 2013-1-15下午04:32:54
	 */
	public interface OnCorpusSelectedListener {

		void onCorpusSelected(ChatEmoji emoji);

		void onCorpusDeleted();
	}

	@Override
	protected void onFinishInflate() {
		super.onFinishInflate();
		emojis = FaceConversionUtil.getInstace().emojiLists;
		onCreate();
	}

	private void onCreate() {
		Init_View();
		Init_viewPager();
		Init_Point();
		Init_Data();
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_face:
			// 隱藏表情選擇框
			if (view.getVisibility() == View.VISIBLE) {
				view.setVisibility(View.GONE);
			} else {
				view.setVisibility(View.VISIBLE);
			}
			break;
		case R.id.et_sendmessage:
			// 隱藏表情選擇框
			if (view.getVisibility() == View.VISIBLE) {
				view.setVisibility(View.GONE);
			}
			break;

		}
	}

	/**
	 * 隱藏表情選擇框
	 */
	public boolean hideFaceView() {
		// 隱藏表情選擇框
		if (view.getVisibility() == View.VISIBLE) {
			view.setVisibility(View.GONE);
			return true;
		}
		return false;
	}

	/**
	 * 初始化控件
	 */
	private void Init_View() {
		vp_face = (ViewPager) findViewById(R.id.vp_contains);
		et_sendmessage = (EditText) findViewById(R.id.et_sendmessage);
		layout_point = (LinearLayout) findViewById(R.id.iv_image);
		et_sendmessage.setOnClickListener(this);
		findViewById(R.id.btn_face).setOnClickListener(this);
		view = findViewById(R.id.ll_facechoose);

	}

	/**
	 * 初始化顯示表情的viewpager
	 */
	private void Init_viewPager() {
		pageViews = new ArrayList<View>();
		// 左側(cè)添加空頁
		View nullView1 = new View(context);
		// 設(shè)置透明背景
		nullView1.setBackgroundColor(Color.TRANSPARENT);
		pageViews.add(nullView1);

		// 中間添加表情頁

		faceAdapters = new ArrayList<FaceAdapter>();
		for (int i = 0; i < emojis.size(); i++) {
			GridView view = new GridView(context);
			FaceAdapter adapter = new FaceAdapter(context, emojis.get(i));
			view.setAdapter(adapter);
			faceAdapters.add(adapter);
			view.setOnItemClickListener(this);
			view.setNumColumns(7);
			view.setBackgroundColor(Color.TRANSPARENT);
			view.setHorizontalSpacing(1);
			view.setVerticalSpacing(1);
			view.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
			view.setCacheColorHint(0);
			view.setPadding(5, 0, 5, 0);
			view.setSelector(new ColorDrawable(Color.TRANSPARENT));
			view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
					LayoutParams.WRAP_CONTENT));
			view.setGravity(Gravity.CENTER);
			pageViews.add(view);
		}

		// 右側(cè)添加空頁面
		View nullView2 = new View(context);
		// 設(shè)置透明背景
		nullView2.setBackgroundColor(Color.TRANSPARENT);
		pageViews.add(nullView2);
	}

	/**
	 * 初始化游標(biāo)
	 */
	private void Init_Point() {

		pointViews = new ArrayList<ImageView>();
		ImageView imageView;
		for (int i = 0; i < pageViews.size(); i++) {
			imageView = new ImageView(context);
			imageView.setBackgroundResource(R.drawable.d1);
			LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
					new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
							LayoutParams.WRAP_CONTENT));
			layoutParams.leftMargin = 10;
			layoutParams.rightMargin = 10;
			layoutParams.width = 8;
			layoutParams.height = 8;
			layout_point.addView(imageView, layoutParams);
			if (i == 0 || i == pageViews.size() - 1) {
				imageView.setVisibility(View.GONE);
			}
			if (i == 1) {
				imageView.setBackgroundResource(R.drawable.d2);
			}
			pointViews.add(imageView);

		}
	}

	/**
	 * 填充數(shù)據(jù)
	 */
	private void Init_Data() {
		vp_face.setAdapter(new ViewPagerAdapter(pageViews));

		vp_face.setCurrentItem(1);
		current = 0;
		vp_face.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int arg0) {
				current = arg0 - 1;
				// 描繪分頁點(diǎn)
				draw_Point(arg0);
				// 如果是第一屏或者是最后一屏禁止滑動(dòng),其實(shí)這里實(shí)現(xiàn)的是如果滑動(dòng)的是第一屏則跳轉(zhuǎn)至第二屏,如果是最后一屏則跳轉(zhuǎn)到倒數(shù)第二屏.
				if (arg0 == pointViews.size() - 1 || arg0 == 0) {
					if (arg0 == 0) {
						vp_face.setCurrentItem(arg0 + 1);// 第二屏 會(huì)再次實(shí)現(xiàn)該回調(diào)方法實(shí)現(xiàn)跳轉(zhuǎn).
						pointViews.get(1).setBackgroundResource(R.drawable.d2);
					} else {
						vp_face.setCurrentItem(arg0 - 1);// 倒數(shù)第二屏
						pointViews.get(arg0 - 1).setBackgroundResource(
								R.drawable.d2);
					}
				}
			}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {

			}

			@Override
			public void onPageScrollStateChanged(int arg0) {

			}
		});

	}

	/**
	 * 繪制游標(biāo)背景
	 */
	public void draw_Point(int index) {
		for (int i = 1; i < pointViews.size(); i++) {
			if (index == i) {
				pointViews.get(i).setBackgroundResource(R.drawable.d2);
			} else {
				pointViews.get(i).setBackgroundResource(R.drawable.d1);
			}
		}
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		ChatEmoji emoji = (ChatEmoji) faceAdapters.get(current).getItem(arg2);
		if (emoji.getId() == R.drawable.face_del_icon) {
			int selection = et_sendmessage.getSelectionStart();
			String text = et_sendmessage.getText().toString();
			if (selection > 0) {
				String text2 = text.substring(selection - 1);
				if ("]".equals(text2)) {
					int start = text.lastIndexOf("[");
					int end = selection;
					et_sendmessage.getText().delete(start, end);
					return;
				}
				et_sendmessage.getText().delete(selection - 1, selection);
			}
		}
		if (!TextUtils.isEmpty(emoji.getCharacter())) {
			if (mListener != null)
				mListener.onCorpusSelected(emoji);
			SpannableString spannableString = FaceConversionUtil.getInstace()
					.addFace(getContext(), emoji.getId(), emoji.getCharacter());
			et_sendmessage.append(spannableString);
		}

	}
}

  

接下來是聊天數(shù)據(jù)填充器的


    package com.example.facedemo;

import android.content.Context;

import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

/**
 * 
 ******************************************
 * @author 廖乃波
 * @文件名稱	:  ChatMsgAdapter.java
 * @創(chuàng)建時(shí)間	: 2013-1-27 下午02:33:16
 * @文件描述	: 消息數(shù)據(jù)填充起
 ******************************************
 */
public class ChatMsgAdapter extends BaseAdapter {

	public static interface IMsgViewType {
		int IMVT_COM_MSG = 0;
		int IMVT_TO_MSG = 1;
	}

	private List<ChatMsgEntity> coll;
	private LayoutInflater mInflater;
	private Context context;
	public ChatMsgAdapter(Context context, List<ChatMsgEntity> coll) {
		this.coll = coll;
		mInflater = LayoutInflater.from(context);
		this.context = context;
	}

	public int getCount() {
		return coll.size();
	}

	public Object getItem(int position) {
		return coll.get(position);
	}

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

	public int getItemViewType(int position) {
		ChatMsgEntity entity = coll.get(position);

		if (entity.getMsgType()) {
			return IMsgViewType.IMVT_COM_MSG;
		} else {
			return IMsgViewType.IMVT_TO_MSG;
		}

	}

	public int getViewTypeCount() {
		return 2;
	}

	public View getView(int position, View convertView, ViewGroup parent) {

		ChatMsgEntity entity = coll.get(position);
		boolean isComMsg = entity.getMsgType();

		ViewHolder viewHolder = null;
		if (convertView == null) {
			if (isComMsg) {
				convertView = mInflater.inflate(
						R.layout.chatting_item_msg_text_left, null);
			} else {
				convertView = mInflater.inflate(
						R.layout.chatting_item_msg_text_right, null);
			}

			viewHolder = new ViewHolder();
			viewHolder.tvSendTime = (TextView) convertView
					.findViewById(R.id.tv_sendtime);
			viewHolder.tvContent = (TextView) convertView
					.findViewById(R.id.tv_chatcontent);
			viewHolder.isComMsg = isComMsg;

			convertView.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) convertView.getTag();
		}

		viewHolder.tvSendTime.setText(entity.getDate());
		SpannableString spannableString = FaceConversionUtil.getInstace().getExpressionString(context, entity.getText());
		viewHolder.tvContent.setText(spannableString);

		return convertView;
	}

	class ViewHolder {
		public TextView tvSendTime;
		public TextView tvContent;
		public boolean isComMsg = true;
	}

}

  


最開始要讀取的表情配置文件


    package com.example.facedemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;

/**
 * 
 ******************************************
 * @author 廖乃波
 * @文件名稱	:  FileUtils.java
 * @創(chuàng)建時(shí)間	: 2013-1-27 下午02:35:09
 * @文件描述	: 文件工具類
 ******************************************
 */
public class FileUtils {
	/**
	 * 讀取表情配置文件
	 * 
	 * @param context
	 * @return
	 */
	public static List<String> getEmojiFile(Context context) {
		try {
			List<String> list = new ArrayList<String>();
			InputStream in = context.getResources().getAssets().open("emoji");
			BufferedReader br = new BufferedReader(new InputStreamReader(in,
					"UTF-8"));
			String str = null;
			while ((str = br.readLine()) != null) {
				list.add(str);
			}

			return list;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}

  

下邊這個(gè)是表情翻頁的數(shù)據(jù)填充,用的是viewpager,每一頁填充的是一個(gè)gridview

    package com.example.facedemo;

import java.util.List;

import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
/**
 * 
 ******************************************
 * @author 廖乃波
 * @文件名稱	:  ViewPagerAdapter.java
 * @創(chuàng)建時(shí)間	: 2013-1-27 下午02:35:27
 * @文件描述	: ViewPager 數(shù)據(jù)填充器,切記做其他操作!!!只填充View!!!!
 ******************************************
 */
public class ViewPagerAdapter extends PagerAdapter {

    private List<View> pageViews;

    public ViewPagerAdapter(List<View> pageViews) {
        super();
        this.pageViews=pageViews;
    }

    // 顯示數(shù)目
    @Override
    public int getCount() {
        return pageViews.size();
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == arg1;
    }

    @Override
    public int getItemPosition(Object object) {
        return super.getItemPosition(object);
    }

    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager)arg0).removeView(pageViews.get(arg1));
    }

    /***
     * 獲取每一個(gè)item??類于listview中的getview
     */
    @Override
    public Object instantiateItem(View arg0, int arg1) {
        ((ViewPager)arg0).addView(pageViews.get(arg1));
        return pageViews.get(arg1);
    }
}
  

最后呢,是表情的配置文件,你想怎么搞都行,我就這么搞的


    emoji_1.png,[可愛]
emoji_2.png,[笑臉]
emoji_3.png,[囧]
emoji_4.png,[生氣]
emoji_5.png,[鬼臉]
emoji_6.png,[花心]
emoji_7.png,[害怕]
emoji_8.png,[我汗]
emoji_9.png,[尷尬]
emoji_10.png,[哼哼]
emoji_11.png,[憂郁]
emoji_12.png,[呲牙]
emoji_13.png,[媚眼]
emoji_14.png,[累]
emoji_15.png,[苦逼]
emoji_16.png,[瞌睡]
emoji_17.png,[哎呀]
emoji_18.png,[刺瞎]
emoji_19.png,[哭]
emoji_20.png,[激動(dòng)]
emoji_21.png,[難過]
emoji_22.png,[害羞]
emoji_23.png,[高興]
emoji_24.png,[憤怒]
emoji_25.png,[親]
emoji_26.png,[飛吻]
emoji_27.png,[得意]
emoji_28.png,[驚恐]
emoji_29.png,[口罩]
emoji_30.png,[驚訝]
emoji_31.png,[委屈]
emoji_32.png,[生病]
emoji_33.png,[紅心]
emoji_34.png,[心碎]
emoji_35.png,[玫瑰]
emoji_36.png,[花]
emoji_37.png,[外星人]
emoji_38.png,[金牛座]
emoji_39.png,[雙子座]
emoji_40.png,[巨蟹座]
emoji_41.png,[獅子座]
emoji_42.png,[處女座]
emoji_43.png,[天平座]
emoji_44.png,[天蝎座]
emoji_45.png,[射手座]
emoji_46.png,[摩羯座]
emoji_47.png,[水瓶座]
emoji_48.png,[白羊座]
emoji_49.png,[雙魚座]
emoji_50.png,[星座]
emoji_51.png,[男孩]
emoji_52.png,[女孩]
emoji_53.png,[嘴唇]
emoji_54.png,[爸爸]
emoji_55.png,[媽媽]
emoji_56.png,[衣服]
emoji_57.png,[皮鞋]
emoji_58.png,[照相]
emoji_59.png,[電話]
emoji_60.png,[石頭]
emoji_61.png,[勝利]
emoji_62.png,[禁止]
emoji_63.png,[滑雪]
emoji_64.png,[高爾夫]
emoji_65.png,[網(wǎng)球]
emoji_66.png,[棒球]
emoji_67.png,[沖浪]
emoji_68.png,[足球]
emoji_69.png,[小魚]
emoji_70.png,[問號(hào)]
emoji_71.png,[嘆號(hào)]
emoji_179.png,[頂]
emoji_180.png,[寫字]
emoji_181.png,[襯衫]
emoji_182.png,[小花]
emoji_183.png,[郁金香]
emoji_184.png,[向日葵]
emoji_185.png,[鮮花]
emoji_186.png,[椰樹]
emoji_187.png,[仙人掌]
emoji_188.png,[氣球]
emoji_189.png,[]
emoji_190.png,[喝彩]
emoji_191.png,[剪子]
emoji_192.png,[蝴蝶結(jié)]
emoji_193.png,[機(jī)密]
emoji_194.png,[鈴聲]
emoji_195.png,[女帽]
emoji_196.png,[裙子]
emoji_197.png,[理發(fā)店]
emoji_198.png,[和服]
emoji_199.png,[比基尼]
emoji_200.png,[拎包]
emoji_201.png,[拍攝]
emoji_202.png,[鈴鐺]
emoji_203.png,[音樂]
emoji_204.png,[心星]
emoji_205.png,[粉心]
emoji_206.png,[丘比特]
emoji_207.png,[吹氣]
emoji_208.png,[口水]
emoji_209.png,[對(duì)]
emoji_210.png,[錯(cuò)]
emoji_211.png,[綠茶]
emoji_212.png,[面包]
emoji_213.png,[面條]
emoji_214.png,[咖喱飯]
emoji_215.png,[飯團(tuán)]
emoji_216.png,[麻辣燙]
emoji_217.png,[壽司]
emoji_218.png,[蘋果]
emoji_219.png,[橙子]
emoji_220.png,[草莓]
emoji_221.png,[西瓜]
emoji_222.png,[柿子]
emoji_223.png,[眼睛]
emoji_224.png,[好的]
  


忘了布局文件,哇哈哈


    <?xml version="1.0" encoding="utf-8"?>
<com.example.facedemo.FaceRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/FaceRelativeLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <RelativeLayout
        android:id="@+id/rl_input"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/chat_footer_bg" >

        <ImageButton
            android:id="@+id/btn_face"
            android:layout_width="40dip"
            android:layout_height="40dip"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="8dip"
            android:background="@drawable/chat_send_btn"
            android:src="@drawable/ib_face" />

        <Button
            android:id="@+id/btn_send"
            android:layout_width="60dp"
            android:layout_height="40dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dp"
            android:background="@drawable/chat_send_btn"
            android:text="發(fā)送" />

        <EditText
            android:id="@+id/et_sendmessage"
            android:layout_width="fill_parent"
            android:layout_height="40dp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="10dp"
            android:layout_toLeftOf="@id/btn_send"
            android:layout_toRightOf="@id/btn_face"
            android:background="@drawable/login_edit_normal"
            android:singleLine="true"
            android:textSize="18sp" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/ll_facechoose"
        android:layout_width="fill_parent"
        android:layout_height="124dip"
        android:layout_below="@id/rl_input"
        android:background="#f6f5f5"
        android:visibility="gone" >

        <android.support.v4.view.ViewPager
            android:id="@+id/vp_contains"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </android.support.v4.view.ViewPager>

        <LinearLayout
            android:id="@+id/iv_image"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="6dip"
            android:gravity="center"
            android:orientation="horizontal" >
        </LinearLayout>
    </RelativeLayout>

</com.example.facedemo.FaceRelativeLayout>
  


android 仿QQ聊天,帶表情,可翻頁,帶翻頁拖動(dòng)緩沖


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 安吉县| 冕宁县| 嘉黎县| 静乐县| 长岭县| 右玉县| 武义县| 宽甸| 南靖县| 玉环县| 同仁县| 长岭县| 社会| 香港 | 兴国县| SHOW| 霍城县| 清原| 寻乌县| 太谷县| 湖州市| 武乡县| 兴城市| 静乐县| 隆子县| 崇文区| 和田县| 察隅县| 天峻县| 崇左市| 东海县| 房山区| 荔波县| 涡阳县| 上饶市| 巴东县| 哈尔滨市| 桦南县| 陕西省| 巴东县| 邵阳市|