这篇博文主要讲表情发送的一些东西。

参考:Android基于XMPP的即时通讯1-基本对话

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-表情发送的更多相关文章

  1. Android基于XMPP的即时通讯2-文件传输

    本文是在上一篇博文Android基于XMPP的即时通讯1-基本对话的基础上,添加新的功能,文件传输 1.初始化文件传输管理类 public static FileTransferManager get ...

  2. Android基于xmpp的即时通讯应用

    xmpp是一个通信协议.因为这是个开放的协议,为了节俭开发成本,很多即时应用都采用了这个协议.Android上最常用的组合asmack +openfire.Asmack是smack的android版, ...

  3. Android基于XMPP的即时通讯1-基本对话

    闲暇之余,自己写了个简单的即时通讯,基于OpenFire服务器平台. 整个项目包括两个部分,一个是服务器端,一个是android手机端: 一.关于服务器端没什么好说的,下载安装配置即可 推荐下载带ja ...

  4. 【XMPP】基于XMPP的即时通讯解决方案

    什么是XMPP 介绍XMPP之前,先来看看GTalk. GTalk是Google推出的IM(Instant Messaging,即时通讯)软件,类似于QQ和MSN. 从技术角度来说,GTalk与QQ和 ...

  5. iOS基于XMPP实现即时通讯之一、环境的搭建

    移动端访问不佳,请访问我的个人博客 使用XMPP已经有一段时间了,但是一直都没深入研究过,只是使用SDK做一些简单的操作,看了许多大神的博客,自己总结一下,准备写一系列关于XMPP的使用博客,以便于自 ...

  6. Android基于XMPP Smack openfire 开发的聊天室

    Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...

  7. android环境下的即时通讯

    首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...

  8. 基于openfire+smack即时通讯instant message开发

    前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire 是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使 ...

  9. [Python]实现XMPP协议即时通讯发送消息功能

    #-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = 'che ...

随机推荐

  1. 实时视频应用之QoS关键技术分析

    转自:http://www.aiweibang.com/m/detail/104476372.html?from=p 随着WebRTC标准的逐步推广,实时音视频通讯技术受到越来越多公司和技术人员的关注 ...

  2. Database.com SOQL and SOSL Reference

    如下是关于 SOQ L与 SOSL 的相关链接: http://docs.database.com/dbcom/en-us/db_sosl_soql/sforce_api_calls_soql.htm ...

  3. 遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程

    1.EPROCESS结构体 EPROCESS块来表示.EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针.例如每一个进程里面都至少有一个ETHREAD块表示的线程 ...

  4. 【maven】 在 MyEcplise上使用maven搭建Web项目

    二.在My Ecplise上使用Maven搭建Web项目 1.新建一个maven项目   2.create一个简单的骨架 3.就像在ecplise中一样设置项目的以下配置   4.新创建的项目结构如下 ...

  5. nginx日志中文变成类型\xE9\xA6\x96\xE9\xA1\xB5-\xE6\x8E\xA8\xE8\x8D\x90的东西

    感谢 http://my.oschina.net/leejun2005/blog/106791 代码如下: public class App { public static String str2He ...

  6. SQL错误码

    ///////////////////////////////////////////////////////////////ORA-00001: 违反唯一约束条件 (.)ORA-00017: 请求会 ...

  7. ubuntu使用笔记

    查看自己系统版本: 使用命令:cat /proc/version 查看:proc目录下记录的当前系统运行的各种数据,version记录的版本信息可以直接通过cat查看到,还可以看到我的gcc版本呢. ...

  8. 如何查看经过编码的cookie?

    方法1.去在线工具网站(http://tool.oschina.net/encode?type=2)手动复制编码的cookie,转码后查看. 方法2.用火狐浏览器打开网页,如果有历史记录(存在cook ...

  9. zookeeper + LevelDB + ActiveMQ实现消息队列高可用

    通过集群实现消息队列高可用. 消息队列在项目中存储订单.邮件通知.数据分发等重要信息,故对消息队列稳定可用性有高要求. 现在通过zookeeper选取activemq leader的形式实现当某个ac ...

  10. PHP 生成二维码

    利用PHP QRcode生成二维码: php QRcode 官网 http://phpqrcode.sourceforge.net/ 在官网下载 phpqrcode.php就ok啦: 然后,查看自己的 ...