php按住说话然后播放,小程序仿微信聊天按住说话功能
小程序仿微信聊天按住说话功能
实现:按住说话有录音动画,上滑可取消发送,松开发送录音
录音授权判断
# .wxml
bind:longpress="onLongpress" catch:touchmove="onTouchMove">{{touchBtn?'松开 结束':'按住说话'}}
复制代码
// # ontouchstart
record() {
const scopeRecord = app.globalData.scopeRecord;
// 无授权时获取授权
if (!scopeRecord) {
getScopeRecord();
return;
}
this.data.touched = true;
// 触发父组件录音事件,由父组件调用录音API
this.triggerEvent('startRecord')
},
复制代码
上滑取消发送,利用滑动距离判断是否取消,
onTouchMove(e) {
if (e.touches[0].clientY < 520) {
// # 取消发送
this.data.cancelRecord = true;
wx.showToast({
title: '松开,取消发送',
duration: 10000,
image: '/page/common/resource/image/cancel.png'
})
} else {
// # 不取消
this.showMicAni(1);
this.data.cancelRecord = false;
}
},
复制代码
松开发送 - 快速点击bug
bug:快速点击按钮,一直显示录音中 原因:调起录音API需要一定时间,会出现touchstart->touchend->调起录音API,touchend事件在录音前触发了,无法再调起停止录音API
思路:可以在调用录音后用个变量a标识,在!a时执行touchend后则用变量b标识,在调用录音后若有b则再立即停止录音。但该方法涉及太多变量传递(父传子,子传父),就偷了下懒用了个400ms的延时
onTouchEnd(e) {
if (!this.data.touched) return;
this.data.touched = false;
wx.hideToast();
// 延时处理 防止录音未调起就触发停止
setTimeout(() => {
this.triggerEvent('stopRecord', {
// # 判断是否取消发送
send: !this.data.cancelRecord
});
}, 400);
}
},
复制代码
除了说话中,上滑取消外,还要加多个说话时间太短的提示
方案一:我用了小程序的longpress事件做判断,未触发该事件则属于说话太短;同时,如果在没在触发Longpress前触发了上滑也默认开启录音
方案二:touchstart时开始计时,touchend结束计时,用时间来判断
// # 利用长按判断录音是否太短
onLongpress() {
this.data.recording = true;
},
// # 上滑时默认录音中
onTouchMove(e) {
this.data.recording = true;
if (e.touches[0].clientY < 520) { ... } else { ... }
},
onTouchEnd(e) {
if (this.data.recording) {
// # 触发停止...
} else {
wx.showToast({
title: '说话时间太短',
duration: 500,
image: '/page/common/resource/image/warn-b.png'
})
// # 触发停止...
}
},
复制代码
录音动画 — 实现微信聊天录音中可根据音量大小改麦克风音量提示的动画的toast。
问题:官方API中录音回调没提供音量数据,无法根据音量来做动画。而且我们使用了wx.showToast,image无法使用动图,也无法自定义动画
思路:既然无法获取音量数据,又需要用户感知有在录音中,还无法做动画。我想了个方法,能不能每隔一段时间换一张image直到录音停止,而且更换图片的顺序不能是固定的,这样看起来很假,必须随机更换图片
注意:touchend和touchmove要清空定时器,touchmove手指回到按钮则要再次调用showMicAni
showMicAni(i) {
// # 初始化间隔时间
let delay = 500;
let that = this;
wx.showToast({
title: '上滑,取消发送',
duration: 60000,
// # 准备5张麦克风不同状态的png
image: '/page/common/resource/image/mic0' + i + '.png'
})
that.data.time1 = setTimeout(() => {
// util.getRandomInt公共方法,随机生成【1,5】中的整数
i = util.getRandomInt(1, 5)
that.showMicAni(i)
}, delay);
},
// touchstart
record() {
// # 开始录音...
this.showMicAni(1);
},
onTouchEnd() {
clearTimeout(this.data.time1)
},
onTouchMove(e) {
clearTimeout(this.data.time1)
if (e.touches[0].clientY < 520) {
// # 取消发送...
} else {
this.showMicAni(1);
this.data.cancelRecord = false;
}
},
复制代码
以下是完整代码
// # .js
import wlogin from '../../../common/resource/js/login.js';
import util from '../../../../utils/util'
let app = getApp();
const getScopeRecord = wlogin.recordInpower();
Component({
properties: {},
data: {
touchBtn: false,
},
ready() {},
methods: {
// 利用长按判断录音是否太短
onLongpress() {
this.data.recording = true;
},
// touchstart
record() {
const scopeRecord = app.globalData.scopeRecord;
if (!scopeRecord) {
getScopeRecord();
return;
}
this.data.recording = false;
this.data.touched = true;
this.data.cancelRecord = false;
this.setData({
touchBtn: true
})
this.triggerEvent('startRecord')
this.showMicAni(1);
},
showMicAni(i) {
let delay = 500;
let that = this;
wx.showToast({
title: '上滑,取消发送',
duration: 60000,
image: '/page/common/resource/image/mic0' + i + '.png'
})
that.data.time1 = setTimeout(() => {
// 随机生成
i = util.getRandomInt(1, 5)
that.showMicAni(i)
}, delay);
},
onTouchMove(e) {
this.data.recording = true;
clearTimeout(this.data.time1)
if (e.touches[0].clientY < 520) {
this.data.cancelRecord = true;
wx.showToast({
title: '松开,取消发送',
duration: 10000,
image: '/page/common/resource/image/cancel.png'
})
} else {
this.showMicAni(1);
this.data.cancelRecord = false;
}
},
onTouchEnd(e) {
clearTimeout(this.data.time1)
if (this.data.recording) {
if (!this.data.touched) return;
this.data.touched = false;
wx.hideToast();
setTimeout(() => {
this.triggerEvent('stopRecord', {
send: !this.data.cancelRecord
});
}, 400);
} else {
wx.showToast({
title: '说话时间太短',
duration: 500,
image: '/page/common/resource/image/warn-b.png'
})
// 延时处理 防止录音未调起就触发停止
setTimeout(() => {
this.triggerEvent('stopRecord', {send: false});
}, 400);
}
this.setData({touchBtn: false})
},
})
复制代码
php按住说话然后播放,小程序仿微信聊天按住说话功能相关推荐
- 小程序仿微信聊天按住说话功能
小程序仿微信聊天按住说话功能 实现:按住说话有录音动画,上滑可取消发送,松开发送录音 录音授权判断 # .wxml <view class="btn {{touchBtn?'hover ...
- 小程序(十六)小程序仿微信聊天页面及功能
后期打算在小程序中添加即时聊天的功能,但是目前这个还没有考虑好以一种什么样的形势去实现,先接入一个腾讯AI提供的免费闲聊接口.先做一个大概的页面及功能. 腾讯AI地址: https://ai.qq.c ...
- 微信小程序仿微信聊天语音播放自定义控件
效果如↓↓↓ 假装有声音. 很郁闷,没有做到完全解耦,试了试音频播放组件<audio></audio>与API wx.createInnerAudioContex ...
- 微信小程序仿微信聊天
主要思想使用websocket,微信小程序有提供websocket的直接方法,所有问题的难点在于后端代码的编写. 效果示意图 演示视频地址 https://www.bilibili.com/video ...
- 微信小程序仿微信SlideView组件slide-view
微信小程序仿微信SlideView组件. 使用 1.安装 slide-view 从小程序基础库版本 2.2.1 或以上.及开发者工具 1.02.1808300 或以上开始,小程序支持使用 npm 安装 ...
- Java微信运动步数排序设计_微信小程序仿微信运动步数排行(交互)
本文介绍了微信小程序仿微信运动步数排行(交互),分享给大家,也给自己留个笔记,废话不多说了,具体如下: 效果图如下: wxml: {{item.name}} {{item.steps}} wxss: ...
- android微信运动页面开发,微信小程序仿微信运动步数排行(交互)
微信小程序仿微信运动步数排行(交互) 发布时间:2020-08-20 00:51:02 来源:脚本之家 阅读:101 作者:祈澈姑娘 本文介绍了微信小程序仿微信运动步数排行(交互),分享给大家,也给自 ...
- 小程序仿微信支付数字键盘,微信支付数字键盘
小程序仿微信支付数字键盘,微信支付数字键盘 前段时间在一个小程序中需要写个支付页面,刚开始用input来唤起手机自带的数字键盘,甲方说不好看,然后说微信支付页面做的就比较好....于是就动手写了一个, ...
- java实现音频播放小程序_微信小程序实现音频文件播放进度的实例代码
问题描述 在微信小程序中经常会用到控制文件播放的滑块,通过滑块可控制音频播放进度,下面即用代码实现. 解决方案 首先用.wxml与 .wmss 代码实现进度条的效果,再通过 .js 文件控制进度条的进 ...
最新文章
- python 特性和方法同名_Python语言特性的梳理
- asp.net中让GridView加上垂直流动条并让标头不动
- centos7 python3安装numpy_centos 7 下安装numpy、scipy等python包
- 笨方法“学习python笔记之关键字
- akka一些邮箱的实现
- 诺基亚手机的安全保护。--如何使你的手机丢失,被盗后依然安全。
- windows 问题排查
- php arcsin,三角函数在线计算器
- QComboBox代理
- 软件自动化测试的学习路线
- 运用GoogleSketchUp创作城市雕塑
- 中国剩余定理求解同余线性方程组(模数互素和非互素的情况)
- SolidWorks如何编辑今日制造插件生成的齿轮
- 微信公众号视频录制开发 踩坑汇总
- 闲来没事自己研究了下RBAC
- 【附源码】计算机毕业设计JAVA小王防疫副食品配送商城
- iOS小技巧11-Xcode中相对路径和绝对路径的使用
- 网站被挂码处理,百度等搜索引擎点击跳转其它赌博黄色等网站
- 2018最新传智黑马39期WEB前端开发全套教程
- 数藏行业周报(06.20-06.26)
热门文章
- 傅里叶变换 卷积定理 空域模板转换为频域模板
- matlab绘图方法汇总
- 解决'ascii' codec can't encode character
- S7700交换机组网部分终端上不了网故障排查
- NLP工具——Stanford CoreNLP的python封装包 处理中文
- 什么是银行卡实名认证接口?
- 防止电脑休眠锁屏、防止休眠锁定、防止电脑休眠的小工具 —— 定时执行专家
- 下载 kaakoo 咔咕 http://job.kaakoo.cn/download.aspx?ID=T679
- 全国职称考试考无忧2018破解
- ActivePerl安装包及安装