uniapp小視頻項(xiàng)目開發(fā)之滑動(dòng)播放視頻
1、監(jiān)聽視頻滑動(dòng)
給 swiper 增加 @change="change",這個(gè)時(shí)間在我們完成一次滑動(dòng)后執(zhí)行,在 methods 下增加 change 事件,并打印結(jié)果:
change(res){
console.log(res);
}其中 res.detail.current 表示當(dāng)前頁(yè)數(shù)

還可以監(jiān)聽滑動(dòng)方向,因此增加 @touchstart="touchStart"和@touchend="touchEnd"的監(jiān)聽,分別在觸摸屏幕開始和結(jié)束時(shí)執(zhí)行
當(dāng)向上滑時(shí),也就是從第一個(gè)視頻 翻到 第二個(gè)視頻的時(shí)候


可以看到 pageY 變小了,我們可以根據(jù)這個(gè)來(lái)判斷上下滑動(dòng)方向
因此我們編寫代碼
<template>
<view class="videoList">
<view class="video-box">
<swiper class="swiper" :vertical="true" @change="change" @touchstart="touchStart" @touchend="touchEnd">
<swiper-item v-for="item of list" :key="item.id">
<view class="swiper-item">
<videoPlayer :video="item"></videoPlayer>
</view>
<view class="left-box">
<listLeft></listLeft>
</view>
<view class="right-box">
<listRight></listRight>
</view>
</swiper-item>
</swiper>
</view>
</view>
</template>
<script>
import videoPlayer from './videoPlayer.vue'
import listLeft from './listLeft.vue'
import listRight from './listRight.vue'
var time = null
export default {
props: ["myList"],
components: {
videoPlayer,
listLeft,
listRight
},
name: "video-list",
data() {
return {
list: [],
pageStartY: 0,
pageEndY: 0
};
},
methods: {
change(res) {
clearTimeout(time)
time = setTimeout(() => {
if (this.pageStartY > this.pageEndY) {
console.log("向上滑動(dòng)")
this.pageStartY = 0
this.pageEndY = 0
} else {
console.log("向下滑動(dòng)");
this.pageStartY = 0
this.pageEndY = 0
}
},1)
},
touchStart(res) {
this.pageStartY = res.changedTouches[0].pageY;
console.log(this.pageStartY);
},
touchEnd(res) {
this.pageEndY = res.changedTouches[0].pageY;
console.log(this.pageEndY);
}
},
watch: {
myList() {
this.list = this.myList;
}
}
}
</script>
<style>
.videoList {
width: 100%;
height: 100%;
}
.video-box {
width: 100%;
height: 100%;
}
.swiper {
width: 100%;
height: 100%;
}
.swiper-item {
width: 100%;
height: 100%;
z-index: 19;
}
.left-box {
z-index: 20;
position: absolute;
bottom: 50px;
left: 10px;
}
.right-box {
z-index: 20;
position: absolute;
bottom: 50px;
right: 10px;
}
</style>查看 log 日志

代碼的執(zhí)行順序是:touchStart->change->toucheEnd ,所以在chagne方法中使用 pageStartY 和 pageEndY 來(lái)判斷上下滑動(dòng)方向需要有一個(gè)定時(shí)器,延遲 1ms,這樣執(zhí)行順序就變成了touchStart->toucheEnd->change,pageStartY 和 pageEndY 都完成了賦值,就可以進(jìn)行判斷了
2、播放和暫停
從第1個(gè)視頻滑到第2個(gè)視頻,那么第1個(gè)視頻應(yīng)改暫停播放,第2個(gè)視頻應(yīng)該開始播放。我們把這部分代碼寫道 videoPlayer.vue 中
onReady() {
this.videoContext = uni.createVideoContext("myVideo",this)
},
methods:{
playVideo(){
this.videoContext.seek(0)
this.videoContext.play()
console.log("播放視頻");
},
pauseVideo(){
this.videoContext.pause()()
console.log("暫停視頻");
}
}下面要做的就是解決如何讓父組件調(diào)用子組件的方法,修改 videoList.vue,給其中的 videoPlayer 增加 ref
<videoPlayer ref="player" :video="item"></videoPlayer>
然后通過(guò) this.$refs.player 可以找到 videoPlayer 這個(gè)插件,由于是個(gè)數(shù)組,所以通過(guò) page 來(lái)找到當(dāng)前頁(yè)。當(dāng)?shù)谝粋€(gè)視頻滑動(dòng)到第二個(gè)視頻,第一個(gè)視頻應(yīng)該暫停,第二個(gè)應(yīng)該自動(dòng)播放,也就是上滑的情況。下滑的情況則相反,因此完善代碼:
data() {
return {
......
page:0
};
},
methods: {
change(res) {
clearTimeout(time)
this.page = res.detail.current
time = setTimeout(() => {
if (this.pageStartY > this.pageEndY) {
console.log("向上滑動(dòng)"+this.page);
this.$refs.player[this.page].playVideo()
this.$refs.player[this.page-1].pauseVideo()
this.pageStartY = 0
this.pageEndY = 0
} else {
console.log("向下滑動(dòng)"+this.page);
this.$refs.player[this.page].playVideo()
this.$refs.player[this.page+1].pauseVideo()
this.pageStartY = 0
this.pageEndY = 0
}
},1)
},
......
},查看效果:

3、增加播放、暫停視頻功能
增加一個(gè)點(diǎn)擊視頻進(jìn)行播放、暫停的功能。給 videoPlayer 增加一個(gè)點(diǎn)擊事件
<template>
<view class="videoPlayer">
<video id="myVideo" @click="click"
class="video" :controls="false" :loop="true" :src="video.src"></video>
</view>
</template>
<script>
export default {
props:['video'],
name: "videoPlayer",
data() {
return {
play:false
};
},
onReady() {
this.videoContext = uni.createVideoContext("myVideo",this)
},
methods:{
click(){
if(this.play === false){
this.playthis()
}else{
this.pauseVideo()
}
},
playVideo(){
if(this.play === false){
this.videoContext.seek(0)
this.videoContext.play()
this.play = true
}
},
pauseVideo(){
if(this.play === true){
this.videoContext.pause()
this.play = false
}
},
playthis(){
if(this.play === false){
this.videoContext.play()
this.play = true
}
}
}
}
</script>
......
4、增加雙擊點(diǎn)贊
雙擊方法直接在 videoPlayer.vue 的 click() 方法上修改:
data() {
return {
......
dblClick: false
};
},
......
methods: {
click() {
clearTimeout()
this.dblClick = !this.dblClick
timer = setTimeout(() => {
//300ms之內(nèi)dblClick為true為單擊
if (this.dblClick) {
//單擊
if (this.play === false) {
this.playthis()
} else {
this.pauseVideo()
}
} else {
//雙擊
this.$emit("doubleClick")
}
this.dblClick = false
}, 300)
},
......
}另外由于愛(ài)心寫在 listRight.vue,所以在 listRight.vue 中增加一個(gè)方法
change() {
this.color = 'color: red;'
}沒(méi)有復(fù)用 changeColor() 方法,因?yàn)殡p擊點(diǎn)贊,再雙擊并不會(huì)取消點(diǎn)贊,跟直接單擊愛(ài)心圖標(biāo)是不一樣的
videoPlayer.vue 雙擊時(shí),子組件向父組件傳值使用了 this.$emit("doubleClick"),我們需要在 video-list.vue 中增加 doubleClick() 方法
<listRight ref="right"></listRight>
doubleClick(){
//點(diǎn)贊,調(diào)用 listRight 中方法
this.$refs.right[0].change()
}
當(dāng)雙擊屏幕,愛(ài)心變紅,再次雙擊,愛(ài)心不會(huì)改變 單擊愛(ài)心,取消點(diǎn)贊
5、控制首個(gè)視頻自動(dòng)播
思路:判斷是否為第一個(gè)視頻,然后修改 videoPlayer 的 autoplay 屬性
修改 video-list.vue,在循環(huán)時(shí),給 videoPlayer 傳一個(gè) index
<swiper-item v-for="(item,index) of list" :key="item.id"> <view class="swiper-item"> <videoPlayer @doubleClick="doubleClick" ref="player" :video="item" :index="index"></videoPlayer> </view> ...... </swiper-item>
videoPlayer.vue 中接收 index 傳值,判斷如果是 0,改變 autoPlay 的值
<template>
<view class="videoPlayer">
<video id="myVideo" @click="click"
class="video" :controls="false" :loop="true"
:src="video.src" :autoplay="autoPlay"></video>
</view>
</template>
<script>
var timer = null
export default {
props: ['video','index'],
name: "videoPlayer",
data() {
return {
......
autoPlay:false
};
},
......
methods: {
......
auto(){
if(this.index === 0){
this.autoPlay = true
}
}
},
created() {
this.auto()
}
}
</script>
......6、動(dòng)態(tài)渲染視頻信息
index.vue 中獲取數(shù)據(jù)后,通過(guò) myList 將數(shù)據(jù)傳遞給了 video-list.vue,在 video-list.vue 中接收了 myList 的數(shù)據(jù),然后通過(guò)循環(huán)展示了視頻數(shù)據(jù),所以展示左側(cè)和右側(cè)的數(shù)據(jù),只需要將循環(huán)的每項(xiàng) item 傳給 listLeft 和 listRight 即可
<view class="left-box"> <listLeft :item='item'></listLeft> </view> <view class="right-box"> <listRight ref="right" :item='item'></listRight> </view>
然后分別在 listLeft 和 listRight 中接收后,展示數(shù)據(jù)
<template>
<view class="listLeft">
<view class="author">
{{item.author}}
</view>
<view class="title">
{{item.title}}
</view>
<view class="box">
<view class="music">
@我們的戀愛(ài)是對(duì)生命的嚴(yán)重浪費(fèi)@
</view>
</view>
</view>
</template>
<script>
export default {
props:['item'],
name:"listLeft",
data() {
return {
};
}
}
</script>
......listRight.vue
<template>
<view class="listRight">
......
<view class="number">{{item.loveNumber}}</view>
......
<view class="number">{{item.commentNumber}}</view>
......
<view class="number">{{item.shareNumber}}</view>
......
</view>
</template>
<script>
export default {
props:['item'],
......
}
</script>
......
總結(jié)
到此這篇關(guān)于uniapp小視頻項(xiàng)目開發(fā)之滑動(dòng)播放視頻的文章就介紹到這了,更多相關(guān)uniapp滑動(dòng)播放視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- uniapp實(shí)現(xiàn)tabs切換(可滑動(dòng))效果實(shí)例
- uniapp組件之tab選項(xiàng)卡滑動(dòng)切換功能實(shí)現(xiàn)
- uniapp使用scroll-view實(shí)現(xiàn)左右上下滑動(dòng)功能
- uniapp實(shí)現(xiàn)滑動(dòng)評(píng)分效果
- uniapp開發(fā)小程序?qū)崿F(xiàn)滑動(dòng)頁(yè)面控制元素的顯示和隱藏效果
- uniapp實(shí)現(xiàn)可以左右滑動(dòng)導(dǎo)航欄
- uni-app封裝組件實(shí)現(xiàn)下方滑動(dòng)彈出模態(tài)框效果
相關(guān)文章
Router解決跨模塊下的頁(yè)面跳轉(zhuǎn)示例
開始模塊化開發(fā)項(xiàng)目之后,一個(gè)很重要的問(wèn)題就是頁(yè)面見的跳轉(zhuǎn)問(wèn)題,這篇文章主要介紹了Router解決跨模塊下的頁(yè)面跳轉(zhuǎn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
5個(gè)可以幫你理解JavaScript核心閉包和作用域的小例子
這篇文章主要介紹了5個(gè)可以幫你理解JavaScript核心閉包和作用域的小例子,本文是翻譯自國(guó)外的一篇文章,短小精悍,需要的朋友可以參考下2014-10-10
JavaScript創(chuàng)建數(shù)組的方法詳解
這篇文章主要為大家介紹了JavaScript創(chuàng)建數(shù)組的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-12-12
JavaScript 俄羅斯方塊游戲?qū)崿F(xiàn)方法與代碼解釋
這篇文章主要介紹了JavaScript 俄羅斯方塊游戲,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript 俄羅斯方塊游戲原理、實(shí)現(xiàn)步驟及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-04-04

