QQ表情

源码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/white"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/tweet_pub_form"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="0.22"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/tweet_pub_content"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:autoLink="web"
            android:background="@null"
            android:gravity="top"
            android:hint="请输入动弹内容" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/widget_bar_bg"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/tweet_pub_footbar_face"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:clickable="true"
            android:src="@drawable/widget_bar_face_over" />
    </LinearLayout>

    <GridView
        android:id="@+id/tweet_pub_faces"
        android:layout_width="fill_parent"
        android:layout_height="220dip"
        android:background="@color/face_bg"
        android:columnWidth="50dip"
        android:fadingEdge="none"
        android:gravity="center"
        android:numColumns="auto_fit"
        android:scrollingCache="false"
        android:stretchMode="columnWidth"
        android:visibility="gone" />

</LinearLayout>

brow_item.xml(GridView的每个表情的布局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

<ImageView
    android:id="@+id/iv_brow"
    android:layout_gravity="center"
    android:layout_width="26dip"
    android:layout_height="26dip"/>
</LinearLayout>

另外在assets中

brow.xml(一部分)

<?xml version="1.0" encoding="utf-8"?>
<brows>
	<brow>
		<code><![CDATA[[em:1:]]]></code>
		<name>f001</name>
	</brow>
	<brow>
		<code><![CDATA[[em:2:]]]></code>
		<name>f002</name>
	</brow>
</brows>

对象封装类

Smile

package com.example.edit_with_expression;

public class Smile {
	private String code; // 表情代码

	private String name; // 表情名字

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

}

ParserBrowXml

package com.example.edit_with_expression;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;

public class ParserBrowXml {
	public static List<Smile> getInfo(InputStream inputStream) {

		XmlPullParser parser = Xml.newPullParser();
		int eventType = 0;
		List<Smile> smiles = null;
		Smile smile = null;
		try {
			parser.setInput(inputStream, "UTF-8");
			eventType = parser.getEventType();
			while (eventType != XmlPullParser.END_DOCUMENT) {

				switch (eventType) {
				case XmlPullParser.START_DOCUMENT:

					smiles = new ArrayList<Smile>();
					break;
				case XmlPullParser.START_TAG:
					if ("brow".equals(parser.getName())) {
						smile = new Smile();

					} else if ("code".equals(parser.getName())) {
						smile.setCode(parser.nextText());
					} else if ("name".equals(parser.getName())) {
						smile.setName(parser.nextText());
					}
					break;
				case XmlPullParser.END_TAG:
					if ("brow".equals(parser.getName())) {
						smiles.add(smile);
						smile = null;
					}
					break;

				default:
					break;
				}

				eventType = parser.next();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return smiles;
	}
}

MainActivity

package com.example.edit_with_expression;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

	private List<Smile> smiles = null; // 表情集合

	private EditText ET_content; // 显示框
	private GridView GV_faceView;// 存放表情列表的GridView
	private ImageView IV_face; // 表情显示按钮
	private InputMethodManager inputManager;// 软键盘管理类

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 和 各个组件变量初始化
		InitVariable();
		// 初始化GridView,将其与Adapter绑定
		InitGridView();
		// 表情显示图片点击监听
		IV_face.setOnClickListener(faceClickListener);
		// EditText点击监听
		ET_content.setOnClickListener(EditContentClickListener);
		// 监听点击了表情的哪一项
		GV_faceView.setOnItemClickListener(gridViewFaceItemClickListener);
	}

	/**
	 * 初始化变量
	 */
	private void InitVariable() {
		// 软键盘管理类
		inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
		// 取得放置表情的gridView组件
		GV_faceView = (GridView) this.findViewById(R.id.tweet_pub_faces);
		// 显示表情框
		ET_content = (EditText) findViewById(R.id.tweet_pub_content);
		// 表情显示按钮
		IV_face = (ImageView) findViewById(R.id.tweet_pub_footbar_face);
	}

	private void InitGridView() {
		try {
			// 取得assets中的borw.xml文件
			InputStream inputStream = this.getResources().getAssets()
					.open("brow.xml");
			// 解析borw.xml
			smiles = ParserBrowXml.getInfo(inputStream);
			// 调用生情表情的方法
			addexpression(this, smiles, GV_faceView);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 根据SMILE列表找到对应的SORCE ID,生成simpleAdatper 传到GrideView中 生成表情的方法
	 *
	 * @param context
	 *            要传入的上下文
	 * @param smiles
	 *            表情集合
	 * @param gridView
	 *            要显示器的grildView
	 * @throws Exception
	 *             异常
	 */
	public void addexpression(Context context, List<Smile> smiles,
			GridView gridView) throws Exception {

		/**
		 * 每个表情封装为一个map集合,在将每个表情放到arraylist集合中
		 */
		ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < 50; i++) {
			// 获取每个表情对象
			Smile smile = smiles.get(i);
			if (smile != null) {
				HashMap<String, Object> map = new HashMap<String, Object>();
				// 指定要获取的字段名
				Field f = (Field) R.drawable.class.getDeclaredField(smile
						.getName());
				// 获取每个表情在资源文件中的id
				int j = f.getInt(R.drawable.class);
				// 添加图像资源的ID
				map.put("ItemImage", j);
				lstImageItem.add(map);

			}
		}

		// 生成适配器的ImageItem <====> 动态数组的元素,两者一一对应
		// 动态数组与ImageItem对应的子项
		// ImageItem的XML文件里面的一个ImageView
		SimpleAdapter saImageItems = new SimpleAdapter(context, lstImageItem,
				R.layout.brow_item, new String[] { "ItemImage" },
				new int[] { R.id.iv_brow });
		gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));// 解决点击GridView背景变黑的情况
		gridView.setAdapter(saImageItems);
	}

	/**
	 * 点击EditText的监听器,当用户点击EditText的时候显示键盘
	 */
	private View.OnClickListener EditContentClickListener = new View.OnClickListener() {

		@Override
		public void onClick(View v) {
			// 显示软键盘
			showIMM();
		}
	};

	// 以下显示隐藏软键或表情的方法集合
	private void showIMM() {
		IV_face.setTag(1);
		showOrHideIMM();
	}

	private void showOrHideIMM() {
		if (IV_face.getTag() == null) {
			// 隐藏软键盘
			inputManager.hideSoftInputFromWindow(IV_face.getWindowToken(), 0);
			// 显示表情
			showFace();
		} else {
			// 显示软键盘
			inputManager.showSoftInput(ET_content, 0);
			// 隐藏表情
			hideFace();
		}
	}

	private void showFace() {
		IV_face.setTag(1);
		GV_faceView.setVisibility(View.VISIBLE);
	}

	private void hideFace() {
		IV_face.setTag(null);
		GV_faceView.setVisibility(View.GONE);
	}

	/**
	 * 点击显示表情的监听器,当用户点击时显示表示列表
	 */
	private View.OnClickListener faceClickListener = new View.OnClickListener() {

		@Override
		public void onClick(View v) {
			try {
				showOrHideIMM();
			} catch (Exception e) {
				Log.w("msg", e.getMessage());
			}
		}

	};

	/**
	 * 点击表情GRIDVIEW中的某一项的监听器
	 */
	private OnItemClickListener gridViewFaceItemClickListener = new AdapterView.OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> arg0, View view, int position,
				long id) {
			// 首先得到当前用户点击的表情的信息
			Smile smile = smiles.get(position);
			// 得到当前CURSOR位置
			int cursor = ET_content.getSelectionStart();
			Field f;
			try {
				// 根据资源名字得到Resource和对应的Drawable
				f = (Field) R.drawable.class.getDeclaredField(smile.getName());
				int j = f.getInt(R.drawable.class);
				Drawable drawable = getResources().getDrawable(j);
				drawable.setBounds(0, 0, 35, 35);// 设置表情图片的显示大小

				// 显示在EditText中
				String str = "img";
				// 需要处理的文本,[smile]是需要被替代的文本
				SpannableString ss = new SpannableString(str);
				// 要让图片替代指定的文字就要用ImageSpan
				ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);
				// 开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束
				ss.setSpan(span, 0, str.length(),
						Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

				ET_content.getText().insert(cursor, ss);
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

	};

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 05:42:12

QQ表情的相关文章

微信中QQ表情的解析(php)

微信公众平台接受的消息中,标签是用'/:'开头的字符串表示的,假设要在网页上显示(比方制作微信大屏幕),就须要进行转换. 所以我向微信公众平台按顺序发送了各个QQ表情,在微信公众平台后台能够看到接受的表情会被解析成https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/0.gif 这种图片.所以自己写一套解析函数就可以. 在微信公众平台后台发现,腾讯自己干了一件错误的事情:有一些表情没有被正确解析,这些标签的特点是有括号.引號这种字

WPF 微信 MVVM 【续】发送部分QQ表情

今天主要记录的就是发送QQ表情, WPF 微信 MVVM里写了,后期为了发送QQ表情,需要把TextBox替换为RichTextBox,接下来就说说替换的过程. 一.支持Binding的RichTextBox RichTextBox虽然支持文字,图片,链接,但是,原生的它不支持Binding,这个对于MVVM是很不方便的,因此,需要给RichTextBox设置一个依赖属性Document,来让它支持绑定,这样才能继续下一步. public class BindableRichTextBox :

分享一批QQ表情,表情工厂【喜洋洋版】

下载地址:程序吧QQ表情之喜洋洋 分享一批QQ表情,表情工厂[喜洋洋版],布布扣,bubuko.com

消除QQ表情小游戏

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style> *{ padding:0px; margin:0px; font-family:"微软雅黑";} body{ background:#f1f1f1; font-family:"微软雅黑"; font-s

在EditText中添加QQ表情

本文参考自:http://blog.csdn.net/wulianghuan/article/details/8583921 在输入框中输入表情是每个聊天软件的必备功能,做到这点仅需要将表情放入工程图片文件夹中,然后用这段代码来添加图片即可,也就是说将图片作为一个文字添加到输入框中. //获取表情图片文件名 Field field=R.drawable.class.getDeclaredField("f" + randomId); int resourceId=Integer.pars

微信公众帐号中使用的QQ表情代码对照表

下 面一共列出了105个QQ表情,每个表情都给出了与之相对应的文字代码与符号代码: 向公众帐号发送一个QQ表情,在后台程序中接收到的是QQ表情的符号代码. // 判断QQ表情的正则表达式 string qqfaceRegex = "/::\\)|/::~|/::B|/::\\||/:8-\\)|/::<|/::$|/::X|/::Z|/::'\\(|/::-\\||/::@|/::P|/::D|/::O|/::\\(|/::\\+|/:--b|/::Q|/::T|/:,@P|/:,@-D|

EditView插入qq表情,可删除表情或文字

代码如下: 代码如下: package com.push.notif; import java.lang.reflect.Field; import java.util.Random; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.text.SpannableSt

金馆长qq表情包 | qq 表情包

QQ表情包,表情可以表达寓意.分享给大家表情包... QQ设置导入表情包 表情包演示: 表情包演示: QQ表情包,当表情帝.你愿意不? 下载地址:http://pan.baidu.com/s/1mgxjwDE

经典qq表情插件(html+nodejs应用)

由于目前在接触聊天室项目,接到一个需求实现一个类似QQ表情.在网上找了一款jquery经典表情插件.下面介绍一个用法: HTML: 首先在html页面的head中引入jQuery库文件和QQ表情插件jquery.qqFace.js文件 <script type="text/javascript" src="jquery-1.7.2.min.js"></script>    <script type="text/javascri

【Qt UI】仿QQ表情选择控件

表情选择控件在聊天应用中经常要用到,做起来虽然不复杂但是很繁琐,特别是有些图标需要按顺序排列.每次重做必然是很费时,所以我将聊天表情选择控件封装成一个独立的类QFaceSelectWidget,方便直接应用到自己的项目中. 先来看看效果图: 测试程序是一个对话框,里面放有一个QPushButton和一个QLabel,水平布局.点击按钮弹出"表情选择框",选择表情后"表情选择框"关闭,QLabel中显示刚才选择的表情."表情选择框"中的表情都是gi