Android基于XMPP的即时通讯3-表情发送
这篇博文主要讲表情发送的一些东西。
1、准备好资源文件
采用的是emoji的表情,我打包好了,下载地址:http://files.cnblogs.com/files/pear-lemon/drawable.zip
2、表情布局文件layout_send_emotion.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_send_emotion"
android:layout_width="match_parent"
android:layout_height="260dp"
android:orientation="vertical"
android:visibility="gone" >
<android.support.v4.view.ViewPager
android:id="@+id/vp_pager_emotion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" >
</android.support.v4.view.ViewPager>
<LinearLayout
android:id="@+id/ll_emotion_dot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="10dp"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>
3、用于和图片资源对应的字符array.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="emoji">
<item>01</item>
<item>02</item>
<item>03</item>
<item>04</item>
<item>05</item>
<item>06</item>
<item>07</item>
<item>08</item>
<item>09</item>
<item>10</item>
<item>11</item>
...
</string-array>
</resources>
4、获取表情资源文件(资源文件命名为"emoji_XX",所以key我自定义一个静态AppDefine.EMOJI = "emoji_")
private List<Integer> emotionImgs;//表情图片 private String[] emotionText;//表情文字
String packageName = activity.getPackageName();
Resources resource = activity.getResources();
emotionImgs = new ArrayList<Integer>();
//获取所有的表情
emotionText = resource.getStringArray(R.array.emoji);
for(String emution :emotionText) {
String key = AppDefine.EMOJI + emution;
int resId = resource.getIdentifier(key, "drawable", packageName);
emotionImgs.add(resId);
}
5、初始化views
ViewPager viewPager = (ViewPager) findViewById(R.id.vp_pager_emotion);
LinearLayout llDots = (LinearLayout) findViewById(R.id.ll_emotion_dot);
//初始化表情格子
for(int i = 0;i < pageCount;i ++){
gridViews[i] = new GridView(activity);
gridViews[i].setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
gridViews[i].setNumColumns(5);
gridViews[i].setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
gridViews[i].setGravity(Gravity.CENTER);
gridViews[i].setAdapter(new EmotionGridAdapter(activity, emotionImgs, pageCount, i));
gridViews[i].setOnItemClickListener(mOnItemClickListener);
gridViews[i].setSelector(new ColorDrawable(Color.TRANSPARENT));
}
//初始化下面的点
for(int i=0;i<pageCount;i++){
viewDots[i]=new View(activity);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(10, 10);
lp.setMargins(10, 0, 10, 0);
viewDots[i].setLayoutParams(lp);
if(i!=currentIndex){
viewDots[i].setBackgroundResource(R.drawable.icon_dot_normal);
}else{
viewDots[i].setBackgroundResource(R.drawable.icon_dot_focused);
}
llDots.addView(viewDots[i]);
}
viewPager.setAdapter(new EmotionPagerAdapter(gridViews, pageCount));
6、界面上边的内容没什么难度,写好基本这个效果

7、处理点击事件,加载到发送框里边
OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// 获取图片对应的字符,资源ID
String emotion = AppDefine.EMOJI + emotionText[currentIndex * 15 + position];
int resId = emotionImgs.get(currentIndex * 15 + position);
Drawable drawable = getResources().getDrawable(resId);
int length = (int) getResources().getDimension(R.dimen.emotion_icon);
drawable.setBounds(0, 0, length, length);
// 根据字符创建SpannableString
SpannableString spannable = new SpannableString(emotion);
// 根据drawable创建ImageSpan
ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);
spannable.setSpan(span, 0, emotion.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
// 设置输入框内容
etSend.append(spannable);
etSend.setSelection(etSend.getText().toString().length());
}
};
8、列表中也要显示表情,做法如下:
private final String[] emotionText;//表情文字 private final int [] emotionImgs;//表情图片 private final HashMap<String, Integer> emotionToText;//文字图片对应 private final Pattern mPattern;//正则匹配
一步一步初始化需要的数据
String packageName = context.getPackageName();
Resources resource = context.getResources();
emotionText = context.getResources().getStringArray(R.array.emoji);
int length = emotionText.length;
emotionImgs = new int[length];
emotionToText = new HashMap<String, Integer>();
for(int i = 0;i < length;i ++) {
String key = AppDefine.EMOJI + emotionText[i];
int resId = resource.getIdentifier(key, "drawable", packageName);
emotionImgs[i] = resId;
emotionToText.put(key, resId);
}
初始化正则匹配字符(百度找的)
StringBuilder patternString = new StringBuilder(emotionText.length * 3);
patternString.append('(');
for (String str : emotionText) {
patternString.append(Pattern.quote(AppDefine.EMOJI + str));
patternString.append('|');
}
patternString.replace(patternString.length() - 1,
patternString.length(), ")");
mPattern = Pattern.compile(patternString.toString());
主要的文字转换图片方法
public SpannableString textToEmotion(Context context, String text){
Matcher matcher = mPattern.matcher(text);
SpannableString spannable = new SpannableString(text);
while (matcher.find()) {//找到匹配的字符
String findText = matcher.group();
//根据对应关系找到资源ID
int resId = emotionToText.get(findText);
Drawable drawable = context.getResources().getDrawable(resId);
int length = (int) context.getResources().getDimension(R.dimen.emotion_icon);
drawable.setBounds(0, 0, length, length);
ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);
spannable.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
return spannable;
}
源码送上:https://github.com/PearLemon/XmppTest.git
Android基于XMPP的即时通讯3-表情发送的更多相关文章
- Android基于XMPP的即时通讯2-文件传输
本文是在上一篇博文Android基于XMPP的即时通讯1-基本对话的基础上,添加新的功能,文件传输 1.初始化文件传输管理类 public static FileTransferManager get ...
- Android基于xmpp的即时通讯应用
xmpp是一个通信协议.因为这是个开放的协议,为了节俭开发成本,很多即时应用都采用了这个协议.Android上最常用的组合asmack +openfire.Asmack是smack的android版, ...
- Android基于XMPP的即时通讯1-基本对话
闲暇之余,自己写了个简单的即时通讯,基于OpenFire服务器平台. 整个项目包括两个部分,一个是服务器端,一个是android手机端: 一.关于服务器端没什么好说的,下载安装配置即可 推荐下载带ja ...
- 【XMPP】基于XMPP的即时通讯解决方案
什么是XMPP 介绍XMPP之前,先来看看GTalk. GTalk是Google推出的IM(Instant Messaging,即时通讯)软件,类似于QQ和MSN. 从技术角度来说,GTalk与QQ和 ...
- iOS基于XMPP实现即时通讯之一、环境的搭建
移动端访问不佳,请访问我的个人博客 使用XMPP已经有一段时间了,但是一直都没深入研究过,只是使用SDK做一些简单的操作,看了许多大神的博客,自己总结一下,准备写一系列关于XMPP的使用博客,以便于自 ...
- Android基于XMPP Smack openfire 开发的聊天室
Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...
- android环境下的即时通讯
首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...
- 基于openfire+smack即时通讯instant message开发
前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire 是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使 ...
- [Python]实现XMPP协议即时通讯发送消息功能
#-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = 'che ...
随机推荐
- Linux系统安装及初始化(ubuntu14.04)
Windows 7下硬盘安装Ubuntu 14.04图文教程 Ubuntu 官方已经发布了正式版的 Ubuntu 14.04 LTS,并宣称这是为云计算准备的版本.该版本在云平台和伸缩环境的可靠性.性 ...
- 第二十五篇:在SOUI中做事件分发处理
不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分 ...
- OVER(PARTITION BY)函数用法
OVER(PARTITION BY)函数介绍 开窗函数 Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返 ...
- Sp EF输出 临时表
-- ============================================= -- Author: <Author,,Name> -- Create date: < ...
- N种内核注入DLL的思路及实现
内核注入,技术古老但很实用.现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中.可能有部分人会说:"都进内核了.什么不能干?".是啊,要是内核中可以做包括R ...
- X64下MmIsAddressValid的逆向及内存寻址解析
标 题: [原创]X64下MmIsAddressValid的逆向及内存寻址解析 作 者: 普通朋友 时 间: 2015-10-21,20:03:52 链 接: http://bbs.pediy.com ...
- 通信原理实践(三)——FM调制
一.FM调制 1.代码如下: clc,clear; fm = ; % 调制信号频率(Hz) Am = 0.5; % 调制信号幅度 fc = 5e3; % 载波频率(Hz) Ac = ; % 载波幅度 ...
- JMeter性能监测插件介绍(三)
JMeter 性能监测插件介绍 压力测试过程中,能够随时对负载服务器的健康状况的把控是相当重要的,有了这些数据,我们才能准确分析出服务器负载瓶颈.JMeter 插件包现在能够支持服务器监控,可以在所有 ...
- ie不支持getElementsByClassName的解决办法
目前可以这么解决,判断浏览器支不支持这个方法,如果支持就不管:如果不支持,就在document对象里加入getElementsByClassName这个方法,按兴趣的朋友可以了解下 if (navig ...
- 请将 php.ini 中的 short_open_tag 设置为 On,否则无法继续安装。
安装的wamp套件,访问http://localhost/Discuz/install/index.PHP进行安装操作,提示 对不起,请将 php.ini 中的 short_open_tag 设置为 ...