在uniapp中实现即时通讯中的【发送语音】

ops/2024/10/18 9:21:56/

目录

效果描述

效果展示

代码实现

渲染层

逻辑层


效果描述

在与好友的对话框中,点击语音图标可以切换到给好友发送语音,长按发送语音的按钮即可开始录音:

如果录制时间 小于60s 时,松手则表示录音结束并将语音消息发送给对方;

如果录制的时间 超过60s 则自动结束,并将语音发送给对方;

如果在录制 60s之内 并且没有松手,而是上滑100像素,则表示取消发送该条语音;

效果展示

默认页面
语音消息录制中
取消发送
发送成功

代码实现

发送语音部分的代码是全的,但是别的部分代码有缺失,如果需要对话框页面完整代码的可以私信。

渲染层

    <view class="guding"><view class="bottom" :style="bottomStyle"><view class="mic"><uv-icon name="mic" color="#09B5BE" size="50rpx" v-if="!isVoice" @click="handleVoice(true)"></uv-icon><image src="../../static/message/keyboard.svg" mode="aspectFill" class="img" v-if="isVoice"@click="handleVoice(false)"></image></view><view class="b-cen" v-if="!isVoice"><!-- autoHeight:是否自动增加高度,设置auto-height时,height不生效 --><uv-textarea ref="textarea" v-model="msgText" autoHeight border="none" @input="input" :adjustPosition="true"@focus="focus" @blur="blur" :showConfirmBar="false" maxlength="100":customStyle="{minHeight:'30rpx',borderRadius:'20rpx'}" :textStyle="{fontSize:'30rpx'}"></uv-textarea><image v-if="isShowSmile" src="../../static/message/smile.svg" mode="aspectFill" class="img"@click="handleKeySmile('smile')"></image><image v-if="isShowKeyboard" src="../../static/message/keyboard.svg" mode="aspectFill" class="img"@click="handleKeySmile('key')"></image></view><view v-if="isVoice" class="b-cen"><view class="bc-text" @touchstart="touchstart" @touchend="touchend" @touchmove="touchmove">按住 说话</view></view><view v-if="!msgText.length" class="mic" @click="handlePlus"><uv-icon name="plus" color="#09B5BE"size="50rpx"></uv-icon></view><view class="sendBtn" v-if="msgText.length" @click="handleSubmit">发送</view></view><view class="emoji" v-if="!isShowSmile"><text class="e-item" v-for="(item,index) in emojiList" :key="index" @click="handleEmoji(item)">{{item}}</text></view><view class="extra" v-if="isShowExtra"><view v-for="item in extraList" :key="item.id" class="ex-item" @click="handleExtra(item)"><uv-icon :name="item.icon" size="74rpx"></uv-icon><text>{{item.text}}</text></view></view></view>

逻辑层

  const recorderManager = ref('');const isVoice = ref(false) //是否显示语音const isshowVoiceBg = ref(false) //是否显示录音背景// 切换语音和键盘const handleVoice = (val) => {isVoice.value = valisShowExtra.value = falseinputh.value = 0isShowSmile.value = trueisShowKeyboard.value = falseif (val) {uni.authorize({scope: 'scope.record',desc: '需要获取您的录音权限',fail(res) {uni.showToast({title: "请点击右上角“…”功能菜单,进入设置界面,打开麦克风权限后,再重新录音",icon: "none",duration: 2000,});return false;},})}}const pageY = ref(0)const timer = ref(0) //计时器const vlength = ref(0) //录音时长// 点击开始录制语音const touchstart = (e) => {console.log("开始录制", e)let i = 1;timer.value = setInterval(() => {vlength.value = i;i++;console.log("计时器开始工作,第几秒", i)//结束计时,如果录制时间超过60s就强制停止录音if (i > 60) {clearInterval(timer.value);touchend();}}, 1000)recorderManager.value.start();pageY.value = e.changedTouches[0].pageY;isshowVoiceBg.value = true}const isCancel = ref(false)const recordSend = ref(true)// 结束录音const touchend = async (e) => {console.log("结束录制", e)recorderManager.value.stop();clearInterval(timer.value)isshowVoiceBg.value = false// 如果取消发送录音,则不发送if (isCancel.value) {recordSend.value = false} else {recordSend.value = true}// 结束录音后重置取消状态isCancel.value = false}// 删除录音const touchmove = (e) => {console.log('删除录音')// 如果手指移动距离大于100,则关闭录音界面if (pageY.value - e.changedTouches[0].pageY > 100) {// 关闭录音界面isshowVoiceBg.value = falseisCancel.value = true}}onMounted(() => {recorderManager.value = uni.getRecorderManager()// 处理录音停止的逻辑recorderManager.value.onStop(async (res) => {console.log("录制结束后生成的声音文件", res, vlength.value)await http.uploadFile(api.singleUpload, res.tempFilePath).then(res => {console.log("录制的时长为多少", vlength.value)let data = {voice: res.data.filePath,time: vlength.value};if (recordSend.value) {sendMsg({ type: 2, message: JSON.stringify(data) }) //语音} else {uni.showToast({icon: "none",title: "语音已取消发送"})}})// 重置时长和状态vlength.value = 0;isshowVoiceBg.value = false});})


http://www.ppmy.cn/ops/126160.html

相关文章

Java项目:154 基于ssm旅游信息网站(含论文+ppt)

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 使用旅游信息网站的分为管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有&#xff1a;个人中心、用户管理、旅游景点管理、交流论坛、…

CentOS7安装RabbitMQ-3.13.7、修改端口号

本文安装版本&#xff1a; Erlang&#xff1a;26.0 官网下载地址 Erlang RabbitMQ&#xff1a;3.13.7 官网下载地址 RabbitMQ RabbitMQ和Erlang对应关系查看&#xff1a;https://www.rabbitmq.com/which-erlang.html 注&#xff1a;安装erlang之前先安装下依赖文件&#xff0…

LabVIEW智能可变温循环PCT测试系统

LabVIEW智能可变温循环PCT测试系统 随着科技的不断发展&#xff0c;实验室测试和质量控制已经成为科学研究和工业制造中不可或缺的一部分。在实验室测试中&#xff0c;PCT测试系统是一种常用的质量控制工具&#xff0c;通过测量材料的热传导系数来评估材料的性质。然而&#x…

电力系统机电暂态仿真程序

发电机(经典模型)、线路、负荷; 2)故障只处理对称故障; 3)采用改进欧拉法; 第 1 章 绪论 1.1背景介绍 暂态稳定性分析计算是电力系统三大经典计算之一&#xff0c;它是电力系统规划、设计、调度运行与控制中必不可少的一项计算任务。 1.1.1 电力系统暂态分析的基本概念 在…

深度解析 Redis 存储结构及其高效性背后的机制

目录 1. Redis 存储结构存储结构存储转换 2. 字典实现数据结构冲突处理负载因子 3. 扩容扩容步骤影响与优化 4. 缩容缩容步骤优化策略 5. 渐进式 Rehash**渐进式 Rehash 的工作原理**Rehash 规则优势 6. SCAN 命令SCAN 的实现原理遍历顺序避免重复和遗漏使用场景 7. 过期&#…

实战OpenCV之兴趣点检测

基础入门 兴趣点检测,也叫特征点检测,英文全称为Interest Point Detection,是在图像中定位具有独特性质的小区域的过程。这些区域通常包含丰富的结构信息,即使在图像发生旋转、缩放或光照变化时也能够被可靠地识别出来。这些独特的点被称为兴趣点,它们是计算机视觉和模式识…

深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构

目录 写在前面 1. Flutter 的基本适配机制 1.1 响应式布局 1.2 逻辑像素 2. 横屏与竖屏的适配 2.1 方向感知 2.2 针对方向的布局优化 3. 多屏协作的实现 3.1 适配多屏显示 3.2 使用 StreamBuilder 和 Provider 3.3 多设备协作的挑战 4. 实践中的应用场景 4.1 移动办…

不使用第三方软件win系统之间如何直接远程登录

被链接者&#xff08;家庭版可能只有远程协助&#xff0c;不支持远程桌面&#xff0c;需特殊的方法&#xff09;&#xff1a; 1.确保远程桌面功能已开启&#xff0c; 控制面板 > 系统和安全 > 系统 > 允许远程访问。&#xff08;win10、win11&#xff09; 2.端口号&…