本文介绍uni-app的交互反馈、动态设置滚动条、动态设置tabbar、录音管理、视频组件控制、剪贴板API。
一、交互反馈
【消息提示框】
uni.showToast显示消息提示框,属性见uni-app官网:
uni.showToast({
title: '标题',
duration: 2000
});
【loading提示框】
uni.showLoading显示loading提示框,一般用于请求服务器端数据时使用,用于在等待期间显示一个加载中的提示。当加载完毕后,关闭提示框。示例:
uni.showLoading({
title: '加载中'
});
setTimeout(function () {
uni.hideLoading();
}, 2000);
当加载完毕后,用uni.hideLoading()关闭提示框。
【模态窗口】
uni.showModel()显示模态窗口,可理解为消息提示框。语法比较简单,见下面示例:
uni.showModal({
title: '提示',
content: '这是一个模态弹窗',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
【操作菜单】
uni.showActionSheet显示操作菜单,经常用于选择性别、选择相册还是拍照等功能,一般是从手机底部弹出的菜单。
uni.showActionSheet({
itemList: ['A', 'B', 'C'],
success: function (res) {
console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
},
fail: function (res) {
console.log(res.errMsg);
}
});
二、动态设置导航条
导航条中可以动态设置的包括当前页面的标题、页面导航条颜色、显示、隐藏导航条加载动画、隐藏返回首页按钮等。官方说明见:
uni.setNavigationBarTitle({
title: '新的标题'
});
【设置导航条颜色】
uni.setNavigationBarColor({
frontColor: '#ffffff',
backgroundColor: '#ff0000',
animation: {
duration: 400,
timingFunc: 'easeIn'
}
})
【显示和隐藏导航条加载动画】
uni.showNavigationBarLoading()和uni.hideNavigationBarLoading();
【隐藏返回首页按钮】
uni.hideHomeButton()用于隐藏返回首页按钮。
三、动态设置tabBar
uni-app可动态设置tabBar某项的内容、整体样式、隐藏/显示tabBar以及为某一项右上角添加/删除文本、显示/隐藏某一项右上角的红点等功能。例如商城底部的购物车图标右上角显示购物车的数量。tabBar使用的官方介绍见:
uni.setTabBarItem({
index: 0,
text: 'text',
iconPath: '/path/to/iconPath',
selectedIconPath: '/path/to/selectedIconPath'
})
下面是设置tabBar样式的示例:
uni.setTabBarStyle({
color: '#FF0000',
selectedColor: '#00FF00',
backgroundColor: '#0000FF',
borderStyle: 'white'
})
下面是显示、隐藏tabBar的示例:
uni.showTabBar({animation:true})
uni.hideTabBar({animation:true})
【为tabBar右上角添加/删除文本】
如果实现购物车右上角显示数字,参考下面的代码:
uni.setTabBarBadge({index :1,text:'10'}) //tabBar第二项右上角文本设置为10,index为1 是第二项
uni.removeTabBarBadge({index :1}) //移除文本
【在tabBar右上角显示红点】
uni.showTabBarRedDot({index:2})
uni.hideTabBarRedDot({index:2})
四、录音管理
录音通常用于开发聊天系统时发送语音的功能,也可以利用录音配合人工智能API实现语音识别功能。官方介绍见:uni.getRecorderManager() | uni-app官网uni-app,uniCloud,serverless,uni.getRecorderManager(),start(options),onStop(callback),onFrameRecorded(callback),onError(callback),示例https://uniapp.dcloud.net.cn/api/media/record-manager.html下面是录音管理的示例代码,示例代码包括了创建音频控制组件、监听录音停止事件、开始录音、录音结束、播放录音等。最终录音的音频为aac格式,如果将录音文件上传到服务器,可以使用res.tempFilePath字段:
<template>
<view>
<button @tap="startRecord">开始录音</button>
<button @tap="endRecord">停止录音</button>
<button @tap="playVoice">播放录音</button>
</view>
</template>
<script>
export default {
name: "recorder",
onLoad() {
//创建录音管理器实例
this.recorderManager = uni.getRecorderManager();
//创建音频组件控制实例
this.innerAudioContext = uni.createInnerAudioContext();
//停止录音事件
this.recorderManager.onStop((res)=> {
console.log('recorder stop' + JSON.stringify(res));
//音频文件路径
this.voicePath = res.tempFilePath;
});
},
methods:{
startRecord() {
console.log('开始录音');
this.recorderManager.start({
format:"mp3"
});
},
endRecord() {
console.log('录音结束');
this.recorderManager.stop();
},
playVoice() {
console.log('播放录音');
if (this.voicePath) {
this.innerAudioContext.src = this.voicePath;
this.innerAudioContext.play();
}
}
}
}
</script>
<style scoped>
</style>
五、视频组件控制
视频组件控制可控制<video>组件使用js实现播放、暂停、全屏、弹幕等功能。
使用uni.createVideoContext创建并返回video上下文videoContext对象,可以操作组件内的<video>组件。视频组件控制官方说明见:
<template>
<view>
<video id="myVideo" :src="videoUrl" controls style="width:100%;height:500rpx;" object-fit="fill" @timeupdate="getTime" :danmu-list="danmuList" :danmu-btn="true"></video>
当前播放时间:{{currentTime|formatSeconds}}/{{duration|formatSeconds}}
<input type="text" placeholder="请输入弹幕内容" v-model="danmuValue">
<button @click="sendDanmu()">发送弹幕</button>
<button @click="play()">播放</button>
<button @click="pause()">暂停</button>
<button @click="goTime()">前进15秒</button>
<button @click="backTime()">后退15秒</button>
</view>
</template>
<script>
export default {
name: "video-component",
data(){
return {
videoUrl:"https://www.xxx.com/aaa.m3u8",
currentTime:"00:00",
duration:"00:00",
danmuList: [{
text: '第 1s 出现的弹幕',
color: '#ff0000',
time: 1
},
{
text: '第 3s 出现的弹幕',
color: '#ff00ff',
time: 3
}
],
danmuValue:""
}
},
onReady(){
//创建视频组件控制实例
this.videoContext = uni.createVideoContext('myVideo')
},
methods:{
play(){
this.videoContext.play();
},
pause(){
this.videoContext.pause();
},
//获取时长
getTime(e){
// console.log(e);
this.currentTime=e.detail.currentTime;
this.duration=e.detail.duration;
},
goTime(){
this.videoContext.seek(this.currentTime+15);
},
backTime(){
this.videoContext.seek(this.currentTime-15);
},
//发送弹幕
sendDanmu(){
this.videoContext.sendDanmu({
text: this.danmuValue,
color: this.getRandomColor()
})
},
getRandomColor() {
const rgb = []
for (let i = 0; i < 3; ++i) {
let color = Math.floor(Math.random() * 256).toString(16)
color = color.length == 1 ? '0' + color : color
rgb.push(color)
}
console.log('#' + rgb.join(''));
return '#' + rgb.join('')
}
},
filters:{
formatSeconds(val){
let minute=parseInt(val/60)?parseInt(val/60):"0";//分
let second=parseInt(val%60)?parseInt(val%60):"0"; //秒
if(minute<10){
minute="0"+minute;
}
if(second<10){
second="0"+second;
}
return minute+":"+second;
}
}
}
</script>
<style scoped>
</style>
演示效果:
在上面的代码中还使用了uni.createVodeContext('myVideo').sendDanmu()发送弹幕,并设置随机弹幕文本颜色。发送弹幕需要在video组件上设置enable-danmu属性为true。在实际开发中,弹幕内容应该让所有观看视频的用户看到,需要通过webSocket实现。首先是搭建服务器端的socket环境,然后通过客户端的WebSocket连接通信。后续会在 Java开发示例搭建一个websocket服务器。在uni-app中使用websocket参考官方示例:
uni.connectSocket(OBJECT) | uni-app官网uni-app,uniCloud,serverless,uni.connectSocket(OBJECT),参数 HarmonyOS Next 兼容性,ConnectSocketSuccess 的属性值,ConnectSocketFail 的属性值,返回值 HarmonyOS Next 兼容性,Sohttps://uniapp.dcloud.net.cn/api/request/websocket.html 在上面的示例中,在请输入弹幕内容的地方输入弹幕文字,然后点发送弹幕,就可以在视频的顶部看到弹幕的内容,不过这个是本地发的,只有自己能看到。实际项目中需要通过websocket实现发弹幕让大家都能看到。
六、剪贴板
uni-app中可设置剪贴板内容和获取剪贴板内容,同时可实现复制口令功能。官方文档见:
uni.setClipboardData({
data: 'hello',
success: function () {
console.log('success');
}
});
获取剪贴板内容:
uni.getClipboardData({
success: function (res) {
console.log(res.data);
}
});