美文网首页各种长见识涨姿势安卓控件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:@简书取名好难 解决了
      • Jonas_aaa9:现在点击‘摄像’是报异常么,直接退出?不知道有没有遇到这种情况呢
        Rance935:@Jonas_aaa9 权限问题吧,价格权限验证就行了
      • ee9b4548e234:感谢分享,给了很大帮助!
        Rance935:@请叫我天阳 谢谢
      • Jonas_aaa9:是我的版本有问题咩
        Jonas_aaa9:@Rance935 好的 感谢
        Rance935:@Jonas_aaa9 下拉刷新自己加
      • Jonas_aaa9:咋没有发现可以上下拉刷新呢
      • android码农_:点击输入框,下面直接半屏显示?这样不能用到项目中去吧,太粗糙了。
      • Volice:感谢你的分享,你是我第一个关注的人
        Volice:@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:请问消息框在滑动时为什么会莫名其妙的拉长,而且图片会被拉伸?第一次点表情按钮时,表情框特别高
        张磊_9c5e:@Rance935 修复图片文字一起发送的bug 是这次提交解决的吗
        Rance935:@张磊_9c5e 已经修复了啊,还有这样的问题,图片改变图片显示模式
        张磊_9c5e:我也遇到了这样的问题,在键盘的高度未保存到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: @夏妍妍 请问你是回错了嘛
      • Johnny_k:nice
        Rance935: @Johnny_k 😬
      • 祝融夫人OR:mark了。。。
        Rance935: @祝融夫人OR @祝融夫人O😬

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

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