写在最前面

现在很多软件都要求加入即时通信的功能,当然很多都用了三方(环信、融信。。。)。最近,项目也有此需求,我们选择的是环信。环信也提供了UI框架,但是说实在的一般的应用用不了那么多功能,可能就简单的语音、表情、图片。我们就需要根据我们自己的需求去更改他的UI框架,花了很多时间去看他的UI框架源码。看完我真是要吐了,写的太复杂了,所以一气之下就自己写了界面。

效果展示

简单介绍

如何使用

EmotionInputDetector mDetector = EmotionInputDetector.with(this)

//表情、更多页面布局Layout

.setEmotionView(emotionLayout)

//表情和更多功能是一个Frament,因此放在了ViewPager里面

.setViewPager(viewpager)

//聊天信息列表

.bindToContent(chatList)

//输入框

.bindToEditText(editText)

//表情按钮绑定

.bindToEmotionButton(emotionButton)

//add按钮绑定

.bindToAddButton(emotionAdd)

//发送按钮绑定

.bindToSendButton(emotionSend)

//录音按钮绑定

.bindToVoiceButton(emotionVoice)

//显示“按下说话,放开发送”的textview绑定

.bindToVoiceText(voiceText)

.build();

之所以没有自定义view做,是为了将布局样式交给开发者自己定义,EmotionInputDetector只起到了一个管理工具类的作用。

输入框下面这部分是一个不可左右滑动的viewpager,表情、相册等都是一个fragment。如果你想扩展其它功能时只需要在EmotionInputDetector的viewpager里面加一个fragment即可,其它逻辑操作全在你这个fragment里面。

* 表情功能简介

表情主要在ChatEmotionFragment里面,里面嵌套了一个viewpager,viewpager的每一页是一个GridView,每一页的GridView的最后一个item是一个删除按钮。具体可以看demo。

再说说表情的加载EmotionUtils,表情加载类,可自己添加多种表情,分别建立不同的map存放和不同的标志符即可

EMOTION_CLASSIC_MAP.put("[呵呵]", R.drawable.d_hehe);

EMOTION_CLASSIC_MAP.put("[嘻嘻]", R.drawable.d_xixi);

EMOTION_CLASSIC_MAP.put("[哈哈]", R.drawable.d_haha);

EMOTION_CLASSIC_MAP.put("[爱你]", R.drawable.d_aini);

这是放在本地的图片,对于在线表情。你只需要将你的imageurl和标识符一一对应即可。然后通过你的标识符取对应的imageurl。

* 语音功能简介

录音主要通过AudioRecoderUtils这个工具类,播放通过MediaManager。具体代码就不上了。

录音事件

mVoiceText.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

// 获得x轴坐标

int x = (int) event.getX();

// 获得y轴坐标

int y = (int) event.getY();

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

mVoicePop.showAtLocation(v, Gravity.CENTER, 0, 0);

mVoiceText.setText("松开结束");

mPopVoiceText.setText("手指上滑,取消发送");

mVoiceText.setTag("1");

mAudioRecoderUtils.startRecord(mActivity);

break;

case MotionEvent.ACTION_MOVE:

if (wantToCancle(x, y)) {

mVoiceText.setText("松开结束");

mPopVoiceText.setText("松开手指,取消发送");

mVoiceText.setTag("2");

} else {

mVoiceText.setText("松开结束");

mPopVoiceText.setText("手指上滑,取消发送");

mVoiceText.setTag("1");

}

break;

case MotionEvent.ACTION_UP:

mVoicePop.dismiss();

if (mVoiceText.getTag().equals("2")) {

//取消录音(删除录音文件)

mAudioRecoderUtils.cancelRecord();

} else {

//结束录音(保存录音文件)

mAudioRecoderUtils.stopRecord();

}

mVoiceText.setText("按住说话");

mVoiceText.setTag("3");

mVoiceText.setVisibility(View.GONE);

mEditText.setVisibility(View.VISIBLE);

break;

}

return true;

}});

录音话筒动画主要是通过mImageView.getDrawable().setLevel()进行一个上下波动的效果展示

* 聊天气泡自定义

聊天气泡没有用.9图片,因为.9图片背景,不能满足图片气泡功能。所以笔者采用的是自定义view:BubbleDrawable、BubbleImageView、BubbleLinearLayout。如此也可以满足用户自定义气泡的需求。本文没有做这个功能,有需求可以根据以上三个自定义view自己加。

三方开源框架

为尊重开源作者,再次将所用的三方开源框架一一罗列:

EasyRecyclerView——支持下拉上拉刷新等功能全面的RecyclerView

butterknife——View注解库和配套插件android-butterknife-zelezny

EventBus——事件总线

Glide——图片加载

BubbleView——聊天气泡自定义view

StateButton——一个可以用代码设置selector背景(按下去背景颜色更改,样式变化等等)的button, 再也不用写selector了

写到最后

如果觉得本文对你有帮助,感谢给个star

github地址:https://github.com/Rance935/ChatUI

android即时通讯ui框架,android IM即时通信之聊天界面UI框架相关推荐

  1. 即时通讯项目 java版本qq (含服务器和客户端)源码_即时通讯安卓-QQ互联网和即时通讯云,如何实现即时通讯,这是Android还是Java...

    Android是系统平台. 应用程序所做的是应用程序的开发和完成 也就是说,通信是网络通信,但在手机环境中,网络的情况更复杂,所以我们必须做好结构 安卓即时通讯. 怎么做?安卓版TT即时通讯排行. A ...

  2. 【即时通讯】一个完善的即时通讯模块具备哪些功能?

    一个完善的即时通讯模块需要具备哪些功能? 前言 前提需求,目前一个系统,由于产品需求,需要在系统中实现用户之间的即时通讯.那么,这个即时通讯的子系统,需要实现哪些功能呢? 功能列表 单人对单人实时聊天 ...

  3. php类似微信聊天框,仿微信UI界面的PHP+Swoole多人聊天室 TP6框架

    仿微信UI界面的PHP+Swoole多人聊天室 TP6框架 介绍 基于swoole实现模仿微信的即时通讯聊天室 软件架构 使用thinkphp6编写 安装教程 导入install.sql到数据库 == ...

  4. IM即时通讯H信 Android

    一.概述 1.开发环境及安装配置 开发环境Windows10下基于JRE1.8.0.OpenJDK Server VM的集成开发工具Android Studio 3.5和环信即时通讯云Android ...

  5. 浅析即时通讯开发之Android端加密算法

    即时通讯是互联网的重要应用形态之一,安全性一直是开发者需要优先考虑的基础问题,并不是使用了加密就绝对安全了,如果加密函数使用不正确,加密数据很容易受到逆向破解攻击.如何正确地理解和使用加密技术则显的尤 ...

  6. 盘点im即时通讯开发中Android后台保活方案

    对于IM应用和消息推送服务的开发者来说,在Android机型上的后台保活是个相当头疼的问题. 老板一句:"为什么微信.QQ能收到消息,而你写的APP却不行?",直接让人崩溃,话说老 ...

  7. IM即时通讯:如何跳出传统思维来设计聊天室架构?

    因为视频直播业务的大规模扩张,聊天室这种功能在最近几年又火了起来.本篇文章将会重点挑选聊天室这个典型场景,和大家分享一下网易云信在实现这个功能时是如何做架构设计的. 相关推荐阅读 几十万人同时在线的直 ...

  8. 个人开源作品,即时通讯App支持文本、语音、图片聊天

    开源一个即时通讯类App,支持纯文本.语音.地理位置.图片聊天,同时还加入了好友圈功能,支持分享动态和发送图片,支持搜索附近的人,使用的百度地图定位功能:由Bmob后端云提供服务器支持,欢迎喜欢的伙伴 ...

  9. IM即时通讯系统源码,即时通讯系统开发架构

    IM系统是一种即时通讯系统,可以让用户实时地发送和接收消息,支持文字.图片.语音等多种类型的消息.下面我们来介绍一下IM系统的架构设计和示例代码. IM系统的架构设计 IM系统的架构设计一般包括以下几 ...

最新文章

  1. C#实现MVC模式简要方法(2)
  2. 001_Maven入门
  3. UA MATH564 概率论 多项分布
  4. wxWidgets:wxTreeListCtrl类用法
  5. 打印某个user在指定时间段内做过的personalization detail
  6. JConsole的使用手册 JDK1.5(转)
  7. 小样本点云深度学习库_论文 | 小样本学习综述
  8. nginx 启动失败
  9. sql 查询表共多少列
  10. linux默认提供几个虚拟桌面 如何,消防车按功能用途可分为灭火消防车、专勤消防车、举高消防车和后援消防车。...
  11. 三因素三水平正交表l9_正交试验在减水剂中的应用
  12. 微信小程序的在线学习每日签到打卡 项目源码介绍
  13. 【知识图谱】OpenKG 发布多个新冠病毒相关开放知识图谱
  14. 深度学习OCR | 文字识别网络 CRNN 论文翻译
  15. 屏幕录制和视频剪辑Filmage Screen
  16. 图像视觉保真度(VIF)评估-MATLAB代码与matlab-PyrTools-master工具包
  17. pdf中矢量图提取出来,插入visio 或者 word,保持矢量图特性,十分清晰;
  18. nginx的4层和7层代理的区别(附OSI网络模型)
  19. 如何有效建设企业薪酬管理体系?
  20. 突破,中科大郭光灿院士团队首次实现多模式量子中继

热门文章

  1. JS代码获取当前项目名称
  2. MacBook上更新hosts文件并使其立刻生效
  3. microsoft excel使用技巧和问题解决
  4. 基于朴素贝叶斯的垃圾邮件分类Python实现
  5. 基于Syntiant TinyML Board与Edge Impulse的LED语音控制(Arduino/C++)
  6. HDU 4960:Another OCD Patient
  7. php案例:批量重命名图片
  8. http缓慢攻击漏洞
  9. ^^^ 存货盘盈盘亏的账务处理 Accounting for Inventory Profit and Inventory Loss with Goods Stock...
  10. 【C语言】数据表现形式及基本数据类型