飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

五、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-聊天输入框的实现

时间:2021-12-24  作者:zhimitec  
五、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-聊天输入框的实现 基于uni-app技术开发的仿微信界面IM实例项目,开源Vue版本源码,对于要求高的开发者我们也开发了NVUE版本,实现了文本消息、图文消息、表情(gif动画),图片预览,图片编辑,视频预览,视频编辑,仿微信的图片选择、编辑、长按菜单等功能

会话好友列表的实现

1、项目引言
2、腾讯云后台配置TXIM
3、配置项目并实现IM登录
4、会话好友列表的实现
5、聊天输入框的实现
6、聊天界面容器的实现
7、聊天消息项的实现
8、聊天输入框扩展面板的实现
9、聊天会话管理的实现
10、聊天记录的加载与消息收发
11、定位SD配置与收发定位消息
12、贴图表情的定制化开发
13、腾讯云后台配置TRTC功能
14、集成音视频通话功能
15、集成仿微信的拍照,相册选择插件
16、集成美颜功能
17、集成TPNS消息推送(暂未接入)


@

目录
  • 会话好友列表的实现
  • 文章概述
  • 聊天输入框的实现
    • 1.样式分析
      • 2. 代码分析
        • 1. data数据结构
        • 2. 界面控制模式切换
        • 3. 语音聊天的覆盖层实现
    • 2.上滑取消语音的算法
  • 项目开源地址及交流群


文章概述

今天的文章比较贴合界面设计部分,在demo中我们已经实现了一个业务组件——聊天输入框,那么本文将教大家聊天输入框的业务实现以及如何修改调整聊天输入框


聊天输入框的实现

1.样式分析

根据聊天输入框的俩种模式下,我们可以将样式划分为以下2种

  1. 文本模式:
    在这里插入图片描述

  2. 语音模式:
    在这里插入图片描述

实际上demo中提供的聊天输入框组件已经覆盖着俩种模式,包括输入文件,发送表情,长按说话,上滑取消等操作。当然如果我们要掌握好这个组件,我们也得分析一下组件中是的代码逻辑。

2. 代码分析

从整体上来说,整个demo工程中将组件进行了解耦合的设计,各个组件文件对应关系如下
在这里插入图片描述
由于聊天输入框的组件是域名,因此我们着重分析一下该文件中的代码即可。

1. data数据结构

data () {
let sysInfo = 域名ystemInfoSync()
return {
ios: 域名werCase() == \'ios\',
pageHeight: 域名owHeight,
text: \'\',
showText: \'\',
focus: false,
speechMode: false,
faceMode: false,
extraMode: false,
speechIng: false,
hoverOnSpeechCancelBtn: false
}
},

从data中的数据结构而言我们不难看出,根据speechMode,faceMode,extraMode切换文本,语音,表情,扩展等操作模式的变化,我们对应的来看一下界面中的代码。

2. 界面控制模式切换

在界面中通过speechMode切换显示文本输入框与语音按钮,从而实现语音与文本的切换操作

<image
@click="clickSpeech"
class="chat-input-btn is-item"
:src="!speechMode ? \'../static/域名\'
: \'../static/域名\'"
></image>
<view v-if="!speechMode"
:class="[
\'is-item\',
\'chat-input-this\',
ios ? \'\' : \'chat-input-this-isAndroid\'
].join(\' \')"
>
<textarea
ref="input"
class="chat-input-this-elem"
:value="showText"
:focus="focus"
:autofocus="focus"
@blur="focus = false"
@touchend="onInputFocus"
@input="onTextareaInput"
:adjust-position="false"
auto-height
/>
</view>
<view
v-else
@域名ent="touchOnSpeech"
@touchend="touchOffSpeech"
@touchmove="touchMoveSpeech"
class="is-item chat-input-this chat-input-speech-btn"
>
<text class="chat-input-speech-btn-inner">按住说话</text>
</view>
<image
class="chat-input-btn is-item"
src="../static/域名"
@click="clickFaceBtn"
></image>
<image
v-if="!text"
class="chat-input-btn is-item"
src="../static/域名"
@click="clickExtra"
></image>
<text
v-else
class="chat-send-btn is-item"
@click="clickSend"
>发送</text>
</view>

3. 语音聊天的覆盖层实现

比较特别的地方是语音聊天有一个“说话中”的覆盖层,我们通过在template的最后追加一个语音聊天覆盖层,通过监听speechMode是否为true控制显隐,从而实现语音聊天的效果

<view v-if="speechIng" class="speech-fixed">
<view></view>
<view
class="speech-fixed__time"
>
<image
class="speech-fixed__time-icon"
:src="
hoverOnSpeechCancelBtn ? \'/static/域名\'
: \'/static/域名\'
"
mode="widthFix"
></image>
<text
class="speech-fixed__time-text"
>{{ hoverOnSpeechCancelBtn ? \'手指上滑 取消发送\'
: (域名 > 50000 ? `剩余 ${60 - (域名 / 1000).toFixed(0)} 秒` : \'松开手指 取消发送\') }}</text>
</view>
<view></view>
</view>

2.上滑取消语音的算法

一般而言用户在长按说话的时候,很难去做点击取消按钮这类操作,因此对于取消语音一般采用的是上滑取消语音的操作,而对于组件而言,内部实现长按时候手指移动算法如下
首先我们需要在界面上监听触摸事件,该事件的监听在vue/nvue下都能得到一个统一的反馈,只是nvue下对于y轴的坐标计算需要做一个负值纠正的处理。

<view
@域名ent="touchOnSpeech"
@touchend="touchOffSpeech"
@touchmove="touchMoveSpeech"
class="is-item chat-input-this chat-input-speech-btn"
>
<text class="chat-input-speech-btn-inner">按住说话</text>
</view>

touchOnSpeech主要是记录当前为长按事件,做好其他UI控件的事件冲突处理,也标记开始录音。

async touchOnSpeech () {
域名chIng = { time: 0, timer: null }
域名r = setInterval(e => {
域名chIng && (域名 += 500);
// 这里是超时判断
if (域名 >= 60000) {
域名rOnSpeechCancelBtn = false
域名hOffSpeech()
}
}, 500)
域名(\'speech-start\')
let success = await this.$域名tRecord()
if (!success) {
域名hOffSpeech()
域名Toast({
icon: \'none\',
position: \'bottom\',
title: \'录音失败,请检查是否授权麦克风权限\'
})
}
}

touchOffSpeech主要是记录当前松开长按事件,从而做结束/取消录音的判断,这里使用了来自lodash的防抖处理,因为nvue下有可能会多次触发

touchOffSpeech: 域名unce(async function () {
if (!域名chIng) {
return
}
clearInterval(域名r)
let timeLen = 域名
域名chIng = null
if (域名rOnSpeechCancelBtn) {
域名rOnSpeechCancelBtn = false
return
}
if (timeLen < 1000) {
return
}
let filePath = await this.$域名ecord()
if (!filePath) {
return
}
this.$emit(\'sendAudio\', { filePath, timeLen })
}, 500, { leading: true, trailing: false }),

touchMoveSpeech主要是计算当前手指移动位置,如果到达了取消区域则设置取消状态为true,从而实现取消语音的处理。

touches = touches[0]
let minScope = 0
let maxScope = 域名Height - 50
// 这里我们默认只要离开了【长按说话】按钮就属于取消语音的处理,开发者可以根据实际需求调整业务逻辑
if (域名enY >= minScope && 域名enY <= maxScope) {
域名rOnSpeechCancelBtn = true
} else {
域名rOnSpeechCancelBtn = false
}

项目开源地址及交流群

项目开源地址:https://域名/ckong/域名域名
Uniapp开发交流群:755910061

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。