美文网首页各种长见识涨姿势安卓控件Android UI相关
android IM即时通信之聊天界面UI框架

android IM即时通信之聊天界面UI框架

作者: Rance935 | 来源:发表于2016-12-21 15:40 被阅读12781次

写在最前面

现在很多软件都要求加入即时通信的功能,当然很多都用了三方(环信、融信。。。)。最近,项目也有此需求,我们选择的是环信。环信也提供了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只起到了一个管理工具类的作用。

Paste_Image.png

输入框下面这部分是一个不可左右滑动的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

本文作者:Rance935本文出处:android IM即时通信之聊天界面UI框架转载请在开头注明作者详细信息和本文出处
欢迎关注我的微信公众号和QQ群,分享Android 开发和互联网内容
Android技术分享:群号534813930
微信号:androidparks
公众号:AndroidParks

相关文章

网友评论

  • 鸿门宴扫码点餐:为啥没有考虑融云呢?想知道原因
  • 水儿芽:你好 导入后 点击表情按钮 下面fragment 不显示表情图片 但是低下的指示器是显示的 请问是什么原因
  • 宇拓信息:很喜欢你这个界面... 大佬能不能生成控我直接调用 - -:kissing_closed_eyes:
  • 简书取名好难:多次点击表情按键会闪屏
  • 简书取名好难:大佬点输入框的加号 private void lockContentHeight() {
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mContentView.getLayoutParams();
    params.height = mContentView.getHeight();
    params.weight = 0.0F;
    } 这里会报转换异常
    Rance935:@简书取名好难 什么异常?没人反馈过有这个现象呀,是不是你自己改了什么
  • 追梦小乐:用了环信,聊天信息是保存到自己的服务器的吗?
    Rance935:@追梦小乐 环信聊天信息是保存到本地的,你拿出来直接用还是保存到服务器都可以
  • 简书取名好难:导入到Android Studio3.0 完全失败 好像butterknife7.0.1有问题 这个怎么解决
    简书取名好难:@Rance935 已经解决了 还是用的7.0
    Rance935:@简书取名好难 换butterknife成最新版本
  • 简书取名好难:githuab有人向你提了3个问题 解决了吗 楼主
    Rance935:@简书取名好难 解决了
  • 9db942b30f1f:现在点击‘摄像’是报异常么,直接退出?不知道有没有遇到这种情况呢
    Rance935:@Jonas_aaa9 权限问题吧,价格权限验证就行了
  • ee9b4548e234:感谢分享,给了很大帮助!
    Rance935:@请叫我天阳 谢谢
  • 9db942b30f1f:是我的版本有问题咩
    9db942b30f1f:@Rance935 好的 感谢
    Rance935:@Jonas_aaa9 下拉刷新自己加
  • 9db942b30f1f:咋没有发现可以上下拉刷新呢
  • android码农_:点击输入框,下面直接半屏显示?这样不能用到项目中去吧,太粗糙了。
  • 3fda5fe3a5e6:感谢你的分享,你是我第一个关注的人
    3fda5fe3a5e6:@Rance935 可以更新一下 就是在Android版本6.0之后 打开系统相机的问题
    Rance935:@Volice 谢谢你的支持
  • 下一个明天我的_d1d1:作者你好,我用这个聊天页面聊天时上下滑动气泡会莫名奇妙的变高,是怎么回事
    下一个明天我的_d1d1:@Rance935 看到了谢谢啊
    Rance935:@下一个明天我的_d1d1 github已经将气泡换成了.9图了啊
  • 下一个明天我的_d1d1:用了楼主写的这个确实不错
  • 马珂珂_bbce:发了很多聊天信息之后,那种空行的item导致高度很高,然后刷新页面,其他item的高度也会变化,应该是recycleview的缓存的问题,不知道怎么解决啊
  • 79aaeacf2a5a:layoutParams.width = len + Utils.dp2px(getContext(), 30);
    请问获得文本占屏幕宽度len后,为什么要加Utils.dp2px(getContext(), 30)?
    Rance935:@凤溪凤溪 padding
  • 79aaeacf2a5a:spannablestring用图片替代文字后,原文本的长度不变,图片宽度小于替代的文字长度,但文本框的长度是根据文本长度来的,这是不是导致加了表情之后,对话框很长的原因?
    Rance935:@凤溪凤溪 是的 这里的计算还需优化
  • 79aaeacf2a5a:请问消息框在滑动时为什么会莫名其妙的拉长,而且图片会被拉伸?第一次点表情按钮时,表情框特别高
    androidlei:@Rance935 修复图片文字一起发送的bug 是这次提交解决的吗
    Rance935:@张磊_9c5e 已经修复了啊,还有这样的问题,图片改变图片显示模式
    androidlei:我也遇到了这样的问题,在键盘的高度未保存到shareprefrence的时候,给了一个默认的高度787,所以会很高,我现在处理的方法是在登录界面输入用户名的时候会弹出键盘,这个时候获取到高度保存起来,图片会变形的问题还是不知道怎么处理啊
  • yedajiang44:楼主!多张图片显示会错乱,解决了吗???我用的是旧版
    Rance935:晚上回去提代码
  • c962f5c76b05:你好,自己发送图片后,列表不显示。是什么问题?
    c962f5c76b05:@Rance935 十分感谢,是不是7.0系统的问题?坐等,楼主好人,十分感谢,已经关注,向你学习:+1: :+1:
    Rance935:@leapp 这个bug已经解决了 可能是代码没提上去 代码在家里 晚上回去提上去
  • 8a60061b812c:文字和图片一起发送的时候,文字只有一半显示,有没有优化
    8a60061b812c:@Rance935 还有重相册发送图片,图片显示不出来啊
    8a60061b812c:@Rance935 是的 我用了几个手机 都是这种情况 表情和文字一起发送都显示不完整
    Rance935:@8a60061b812c 优化了啊。还有这种情况?
  • Fan_X:mark了。。。
  • Fan_X:mark了。。。
  • yedajiang44:7.0刚解决相册返回值问题,蓝后又发现相机崩溃、、、、
  • 小郑:博主 当列表有多张图片的时候 显示会错乱
  • eba6cd3f3618:文字换行,会出现显示问题。
  • 风信子丶:问一下,简化findViewById的是什么工具
    Rance935:@风信子丶 butterknife
  • 8a01e823ea0a:谢谢分享,请问消息框怎么会莫名其妙的拉长。
    8a01e823ea0a:@Rance935 说错了,是拉宽:disappointed_relieved:
    8a01e823ea0a:@Rance935 比如文章中的gif就能看出。输入第一条“你好”的信息就被拉长,不过那个我通过修改布局文件中的android:minWidth属性修改,实现了输入框的缩小。然后gif上回复的第一条信息就气泡就被拉长。我修改了回复气泡的android:minWidth发现还是不行。第一条回复还是会拉长。然后就是我自己输入的同样的内容,但是经常出现气泡的拉长情况。我的机型是小米note3
    Rance935: @七絆 拉长?,没遇到过也,什么机型。开始进入界面会计算输入法弹框的高度,获取不到有一个默认的高度
  • 天神Deity:不错,有什么可以提升UI设计的建议吗?
    Rance935: @天神Deity ui设计建议?
  • 苏易川:楼主大赞
    Rance935: @alvis_ai 谢谢
  • d9b37f45f8e3:没错,环信的太复杂了,下次优化试试你这个
    Rance935:@这个昵称不重要 有什么问题?我的就在github上啊
    eba6cd3f3618:我这边写的有问题,你能把你发给我看看么。
    Rance935: @37柯 是的,到时候欢迎提优化意见
  • deb8887b71ec:Thanks to share~
    Rance935: @utopia_1900 不用谢
  • 夏妍妍:这个嘛,你多和我聊聊就知道咯
    Rance935: @夏妍妍 请问你是回错了嘛
  • 36e6a80b83e3:nice
    Rance935: @Johnny_k 😬
  • 祝融夫人OR:mark了。。。
    Rance935: @祝融夫人OR @祝融夫人O😬

本文标题:android IM即时通信之聊天界面UI框架

本文链接:https://www.haomeiwen.com/subject/iveqvttx.html