小程序仿微信聊天按住说话功能

实现:按住说话有录音动画,上滑可取消发送,松开发送录音

录音授权判断

# .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按住说话然后播放,小程序仿微信聊天按住说话功能相关推荐

  1. 小程序仿微信聊天按住说话功能

    小程序仿微信聊天按住说话功能 实现:按住说话有录音动画,上滑可取消发送,松开发送录音 录音授权判断 # .wxml <view class="btn {{touchBtn?'hover ...

  2. 小程序(十六)小程序仿微信聊天页面及功能

    后期打算在小程序中添加即时聊天的功能,但是目前这个还没有考虑好以一种什么样的形势去实现,先接入一个腾讯AI提供的免费闲聊接口.先做一个大概的页面及功能. 腾讯AI地址: https://ai.qq.c ...

  3. 微信小程序仿微信聊天语音播放自定义控件

    效果如↓↓↓        假装有声音. 很郁闷,没有做到完全解耦,试了试音频播放组件<audio></audio>与API wx.createInnerAudioContex ...

  4. 微信小程序仿微信聊天

    主要思想使用websocket,微信小程序有提供websocket的直接方法,所有问题的难点在于后端代码的编写. 效果示意图 演示视频地址 https://www.bilibili.com/video ...

  5. 微信小程序仿微信SlideView组件slide-view

    微信小程序仿微信SlideView组件. 使用 1.安装 slide-view 从小程序基础库版本 2.2.1 或以上.及开发者工具 1.02.1808300 或以上开始,小程序支持使用 npm 安装 ...

  6. Java微信运动步数排序设计_微信小程序仿微信运动步数排行(交互)

    本文介绍了微信小程序仿微信运动步数排行(交互),分享给大家,也给自己留个笔记,废话不多说了,具体如下: 效果图如下: wxml: {{item.name}} {{item.steps}} wxss: ...

  7. android微信运动页面开发,微信小程序仿微信运动步数排行(交互)

    微信小程序仿微信运动步数排行(交互) 发布时间:2020-08-20 00:51:02 来源:脚本之家 阅读:101 作者:祈澈姑娘 本文介绍了微信小程序仿微信运动步数排行(交互),分享给大家,也给自 ...

  8. 小程序仿微信支付数字键盘,微信支付数字键盘

    小程序仿微信支付数字键盘,微信支付数字键盘 前段时间在一个小程序中需要写个支付页面,刚开始用input来唤起手机自带的数字键盘,甲方说不好看,然后说微信支付页面做的就比较好....于是就动手写了一个, ...

  9. java实现音频播放小程序_微信小程序实现音频文件播放进度的实例代码

    问题描述 在微信小程序中经常会用到控制文件播放的滑块,通过滑块可控制音频播放进度,下面即用代码实现. 解决方案 首先用.wxml与 .wmss 代码实现进度条的效果,再通过 .js 文件控制进度条的进 ...

最新文章

  1. python 特性和方法同名_Python语言特性的梳理
  2. asp.net中让GridView加上垂直流动条并让标头不动
  3. centos7 python3安装numpy_centos 7 下安装numpy、scipy等python包
  4. 笨方法“学习python笔记之关键字
  5. akka一些邮箱的实现
  6. 诺基亚手机的安全保护。--如何使你的手机丢失,被盗后依然安全。
  7. windows 问题排查
  8. php arcsin,三角函数在线计算器
  9. QComboBox代理
  10. 软件自动化测试的学习路线
  11. 运用GoogleSketchUp创作城市雕塑
  12. 中国剩余定理求解同余线性方程组(模数互素和非互素的情况)
  13. SolidWorks如何编辑今日制造插件生成的齿轮
  14. 微信公众号视频录制开发 踩坑汇总
  15. 闲来没事自己研究了下RBAC
  16. 【附源码】计算机毕业设计JAVA小王防疫副食品配送商城
  17. iOS小技巧11-Xcode中相对路径和绝对路径的使用
  18. 网站被挂码处理,百度等搜索引擎点击跳转其它赌博黄色等网站
  19. 2018最新传智黑马39期WEB前端开发全套教程
  20. 数藏行业周报(06.20-06.26)

热门文章

  1. 傅里叶变换 卷积定理 空域模板转换为频域模板
  2. matlab绘图方法汇总
  3. 解决'ascii' codec can't encode character
  4. S7700交换机组网部分终端上不了网故障排查
  5. NLP工具——Stanford CoreNLP的python封装包 处理中文
  6. 什么是银行卡实名认证接口?
  7. 防止电脑休眠锁屏、防止休眠锁定、防止电脑休眠的小工具 —— 定时执行专家
  8. 下载 kaakoo 咔咕 http://job.kaakoo.cn/download.aspx?ID=T679
  9. 全国职称考试考无忧2018破解
  10. ActivePerl安装包及安装