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 ...
随机推荐
- hdu 4038 2011成都赛区网络赛H 贪心 ***
贪心策略 1.使负数为偶数个,然后负数就不用管了 2.0变为1 3.1变为2 4.2变为3 5.若此时操作数剩1,则3+1,否则填个1+1,然后回到5
- jsp,图片显示
问题:jsp中显示项目中image文件夹中的图片 1,项目中image文件夹中有对应的图片 2,<img ,src="/项目名/image/图片名.jpg">,用其他变 ...
- win8.1/win10 UEFI + GPT 安装(测试机型:华硕S56CM)
本教程简要介绍在UEFI 启动模式下在GPT分区表中,最简单的方法安装 Windows 10 x64 位系统.(并非傻瓜教程,安装者总要有一定的经验基础)下面先简单介绍一下UEFI和GTP. UEFI ...
- hdu 3183(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 思路:比较前后两个相邻的字符,如果前面一个字符大于后面一个字符,就把它去掉. #include ...
- 重写ViewPager方法,防止滑动广告尾页的时候,Fragment也改变! (如果广告设置为轮播的话,不需要重写ViewPager)
public class MyViewPager extends ViewPager{ public MyViewPager(Context context) { this(context, null ...
- Eclipse配置Lifery SDK步骤与错误解决。
第一步.我们先去官网下载我们要用的东西 1.Eclipse 2.SDK 3.Tomcat 这是官网下载地址-->https://www.liferay.com/zh/downloads 下面是图 ...
- SSH无密码登录配置小结
ssh-keygen -t rsa //-t指定算法 将公钥复制到被管理机器上面 ssh-copy-id -i ~/.ssh/id_rsa.pub 172.29.0.89 ssh-copy-id -i ...
- 宫格布局实例(注意jquery的版本号要统一)2
<!DOCTYPE html><html><head><meta charset="utf-8" /><style> * ...
- Codeforces Round #354 (Div. 2)-C
C. Vasya and String 题目链接:http://codeforces.com/contest/676/problem/C High school student Vasya got a ...
- zepto的bug1
给页面<a>标签绑定了tap事件,在移动设备上点击按钮貌似一切正常,可以正常响应. 但是,把页面上下滑动几次之后,或者在滑动时手指滑动出移动屏幕之外,之后再点击按钮,就会发现第一次点击的时 ...