智慧画屏客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

498 lines
13 KiB

<template>
<view class="main_container">
<view class="show-content" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd">
<view v-for="(item, index) in show_materials" :key="index" :class="['show-item', item.material_type == 1 && itemIndex == index ? 'show-video' : '']">
<!-- <image
:class="['show-img', 'animate__animated', item.material_type == 0 ? item.effect : '']"
v-show="item.material_type == 0 && itemIndex == index"
:src="linkUrl"
mode="aspectFill"
></image> -->
<image
:class="['show-img', 'animate__animated', item.material_type == 0 ? item.effect : '']"
v-show="item.material_type == 0 && itemIndex == index"
:src="require('@/static/source/'+linkUrl)"
mode="aspectFill"
></image>
<video
:id="'video' + index"
v-if="item.material_type == 1 && itemIndex == index"
:src="require('@/static/source/'+linkUrl)"
:controls="false"
:autoplay="autoplay"
:enable-progress-gesture="false"
:enable-play-gesture="false"
object-fit="contain"
show-center-play-btn="false"
@play="playEvent"
@ended="videoPlayEnd"
@waiting="waitingVideo"
@loadeddata="loading"
@timeupdate="timeUpdate"
initial-time="initial_time"
>
</video>
</view>
</view>
<view class="show-audio" @click="pauseAudio">
<image :class="['audio_round',!isPauseAudio ? 'animate_round' : '']" src="~@/static/images/audio_01.png"></image>
<image class="audio_zz" src="~@/static/images/audio_02.png"></image>
</view>
<!-- <view style="position:absolute; bottom:55.55rpx; left: 69.44rpx; color: #fff; z-index: 99999;">{{ infoTxt }}--{{ audioName }}</view> -->
<view v-if="!deviceInfoShow" class="local-data">
<text class="title">欢迎使用数字新视窗</text>
<view class="data-info">设备ID : 123456789</view>
<view class="data-info">设备账号 : 123456789</view>
<view class="data-info">设备名称 : CVBBN2</view>
<view class="count-down" @click="deviceInfoShow=true">{{ count }}</view>
</view>
</view>
</template>
<script>
import one from './show.js';
let innerAudioContext = uni.createInnerAudioContext();
export default {
name:'Show',
components: {},
data() {
return {
// 已登录情况显示6S得设备信息
count: 6,
deviceInfoShow: false,
autoplay: false,
// 素材
materialsCont: [],
show_materials: [],
contentIndex: 0,
itemIndex: 0,
linkUrl: '',
timer: null,
duration: null,
audioSrc: null,
audioName: null,
itemLength: [],
flagIndex: 0,
infoTxt: '',
video_real_time: 0,
nitial_time: '',
startY: 0,
startX: 0,
isAutoSwitch: true,
moveX: 0, //滑动的x轴距离
moveY: 0, //滑动的y轴距离
pageState: 0,//-1:左滑,0:没滑动,1:右滑
isPauseAudio: false
};
},
onLoad() {
const _this = this;
let result = one.data.data;
this.materialsCont = result;
this.materialsCont.map(item => {
this.itemLength = this.itemLength.concat(item.show_materials.length);
this.show_materials = this.show_materials.concat(item.show_materials);
});
// 初始化
this.changIndex();
},
onReady: function(res) {
const videoId = 'video'+this.itemIndex
this.videoCtx = uni.createVideoContext(videoId)
},
created() {
this.auto();
},
mounted() {
this.countdown();
this.changeMaterial();
},
methods: {
// 素材切换
touchStart(event) {
this.startX = event.touches[0].pageX;
this.startY = event.touches[0].pageY;
// console.log('开始触摸:', this.startX, this.startY);
},
touchMove(event) {
let currentX = event.touches[0].pageX;
let currentY = event.touches[0].pageY;
let moveX = currentX - this.startX;
let moveY = currentY - this.startY;
let text = '';
let state = 0; //-1:左滑,0:没滑动,1:右滑
// //左右方向滑动
if (Math.abs(moveX) > Math.abs(moveY)) {
if (moveX < -10) {
text = '左滑';
state = 1;
} else if (moveX > 10) {
text = '右滑';
state = -1;
}
} else {
//上下方向滑动
if (moveY < 0) {
text = '上滑';
state = -2;
} else if (moveY > 0) {
text = '下滑';
state = 2;
}
}
this.pageState = state;
this.moveX = moveX;
this.moveY = moveY;
// console.log('开始滑动:', this.moveX, this.moveY, this.pageState);
},
touchEnd(event) {
// console.log(`移动距离:${Math.abs(this.moveX)}`);
// if (Math.abs(this.moveX) > 60 ) {
// if (this.pageState == 1) {
// this.itemIndex++;
// this.flagIndex++;
// this.isAutoSwitch = true;
// } else if (this.pageState == -1) {
// this.itemIndex--;
// this.flagIndex--;
// this.isAutoSwitch = false;
// }
// this.changIndex();
// }
// 上下滑动
if (Math.abs(this.moveY) > 60) {
if (this.pageState == -2) {
this.itemIndex++;
this.flagIndex++;
this.isAutoSwitch = true;
} else if (this.pageState == 2) {
this.itemIndex--;
this.flagIndex--;
this.isAutoSwitch = false;
}
this.changIndex();
}
},
// 自动切换
changeMaterial() {
const _this = this;
clearInterval(_this.timer);
_this.timer = setInterval(() => {
_this.duration -= 1;
if (_this.duration == 0) {
_this.itemIndex++;
_this.flagIndex++;
this.isAutoSwitch = true;
this.changIndex();
}
}, 1000);
},
changIndex() {
const _this = this;
innerAudioContext.destroy();
_this.linkUrl = '';
console.log(this.itemLength)
// 资源素材加载到最后一张时 - 下一页
if (_this.itemIndex == this.show_materials.length) {
// clearInterval(_this.timer);
console.log('最后一页啦')
this.itemIndex = 0;
this.flagIndex = 0;
this.contentIndex = 0;
}
// 资源加载到第一张时 - 上一页
if (this.itemIndex == -1) {
this.itemIndex = this.show_materials.length - 1;
this.contentIndex = this.itemLength.length - 1;
this.flagIndex = this.itemLength[this.contentIndex];
}
if (this.flagIndex == -1) {
this.contentIndex--;
this.flagIndex = this.itemLength[this.contentIndex];
}
// 图片播放时间
_this.duration = this.show_materials[this.itemIndex].duration;
// 资源地址-图片/视频
_this.linkUrl = this.show_materials[this.itemIndex].deposit_url;
// 优先判断图片自带音频
if (this.show_materials[this.itemIndex].bgm_url) {
_this.audioSrc = this.show_materials[this.itemIndex].bgm_url;
_this.audioName = this.show_materials[this.itemIndex].bgm_name;
} else {
// 不同发布节点
if (this.contentIndex == this.itemLength.length) {
this.flagIndex = 0;
this.contentIndex = 0;
} else {
if (this.isAutoSwitch) {
if (this.flagIndex == this.itemLength[this.contentIndex]) {
this.flagIndex = 0;
this.contentIndex++;
if (this.contentIndex == this.itemLength.length || _this.itemIndex == this.show_materials.length) {
this.contentIndex = this.itemLength.length-1;
this.flagIndex = this.itemLength[this.contentIndex];
}
}
}
}
// 图片无自带 - 再判断是否有BGM - main
if (this.materialsCont[this.contentIndex].bgm_main) {
this.audioSrc = this.materialsCont[this.contentIndex].bgm_main;
this.audioName = this.materialsCont[this.contentIndex].bgm_name;
}
}
// 当前资源是 - 视频 - 时,即销毁音频(防止干扰)
if (this.show_materials[this.itemIndex].material_type == 1) {
innerAudioContext.destroy();
innerAudioContext.src = '';
}
// 销毁-创建音频-播放音频
innerAudioContext = uni.createInnerAudioContext();
this.playVoice(this.audioSrc);
},
// 视频
videoPlayEnd() {
console.log('end-video');
this.itemIndex++;
this.flagIndex++;
this.changIndex();
},
auto() {
setTimeout(()=>{
this.autoplay = true;
},500)
},
playEvent(e) {
console.log("play_video")
let currentId = e.target.id; // 获取当前视频id
this.videoCtx = uni.createVideoContext(currentId);
innerAudioContext.destroy();
},
loading(){
console.log('play_loading');
},
waitingVideo(){
console.log('waiting-video');
this.videoCtx.pause();
},
timeupdateEvent(event) {
console.log('timeupdateEvent');
},
// 禁止拖动进度条快进
timeUpdate(e) {
var isReady = 1; // 是否开启可以视频快进 1 禁止开启
//跳转到指定播放位置 initial-time 时间为秒
let that = this;
//播放的总时长
var duration = e.detail.duration;
//实时播放进度 秒数
var currentTime = parseInt(e.detail.currentTime);
//当前视频进度
// console.log("视频播放到第" + currentTime + "秒")//查看正在播放时间,以秒为单位
if (that.video_real_time == 0) {
var jump_time = parseInt(that.initial_time) + parseInt(that.video_real_time);
} else {
var jump_time = parseInt(that.video_real_time);
}
if (isReady == 1) {
if (currentTime > jump_time && currentTime - jump_time > 3) {
let videoContext = uni.createVideoContext(e.target.id);
uni.showToast({
title: '未完整看完该视频,不能快进',
icon: 'none',
duration: 2000
});
videoContext.stop();
videoContext.seek(0);
}
}
that.video_real_time = currentTime; //实时播放进度
},
pauseAudio(){
this.isPauseAudio = !this.isPauseAudio;
if(this.isPauseAudio){
innerAudioContext.pause();
}else{
this.playVoice(this.audioSrc);
}
},
// 音频
playVoice(src) {
const _this = this;
if (innerAudioContext != undefined) {
innerAudioContext.stop();
}
innerAudioContext = uni.createInnerAudioContext();
innerAudioContext.stop();
innerAudioContext.src = src;
if(_this.isPauseAudio){
if(innerAudioContext.paused){
innerAudioContext.destroy();
innerAudioContext = uni.createInnerAudioContext();
}else{
innerAudioContext.autoplay = true;
}
}else{
innerAudioContext.autoplay = true;
}
innerAudioContext.onPlay(() => {
this.infoTxt = '音频开始播放';
console.log('开始播放');
});
innerAudioContext.onStop(() => {
this.infoTxt = '音频停止';
// console.log('停止');
});
innerAudioContext.onError(res => {
if(this.show_materials[this.itemIndex].material_type != 1){
console.log(res.errMsg);
console.log(res.errCode);
innerAudioContext.destroy();
}
});
innerAudioContext.onEnded(() => {
this.infoTxt = '音频自然播放结束事件';
// console.log('音频自然播放结束事件');
});
},
countdown() {
this.count = 6;
const timer = setInterval(() => {
this.count -= 1;
if (this.count < 1) {
clearInterval(timer);
this.deviceInfoShow = true;
console.log('倒计时结束');
}
}, 1000);
}
}
};
</script>
<style scoped>
.main_container {
position: relative;
overflow: hidden;
background: #000;
}
.show-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.show-item .show-img {
width: 100%;
height: 100vh;
object-fit: cover;
}
.show-item uni-video {
width: 100%;
height: 100%;
}
.show-video {
width: 100%;
height: 100vh;
}
.show-audio {
position: fixed;
bottom: 79.16rpx;
right: 46.52rpx;
width: 122.91rpx;
height: 113.88rpx;
}
.show-audio .audio_round{
width: 113.19rpx;
height: 113.19rpx;
}
.show-audio .audio_zz{
position: absolute;
right: 0;
top: 0;
width: 40.27rpx;
height: 84.02rpx;
z-index: 999;
}
.animate_round{
animation: circle 2s linear infinite;
}
@keyframes circle {
100% {
transform: rotate(360deg);
}
}
.show-audio uni-image {
width: 159.72rpx;
height: 152.08rpx;
}
.local-data {
position: absolute;
left: 50%;
top: 50%;
display: flex;
flex-direction: column;
justify-content: center;
width: 625rpx;
height: 555.55rpx;
transform: translate(-50%, -50%);
font-size: 27.77rpx;
color: #333;
border-radius: 27.77rpx;
background: rgba(255, 255, 255, 0.85);
}
.title {
margin-bottom: 32.63rpx;
font-size: 56.94rpx;
text-align: center;
}
.data-info {
padding: 0 83.33rpx;
margin-bottom: 32.63rpx;
}
.count-down {
position: absolute;
right: 34.72rpx;
top: 27.77rpx;
width: 48.61rpx;
height: 48.61rpx;
font-size: 30.55rpx;
text-align: center;
line-height: 48.61rpx;
border: 1px solid #333;
border-radius: 50%;
}
.swiper {
height: 100vh;
}
.item {
width: 100%;
height: 100%;
}
.mask {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.3);
z-index: 999;
}
.controls-title {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.3);
text-align: center;
color: #ffffff;
border: 10px solid #fff;
z-index: 9999;
}
</style>