微信小程序?qū)崿F(xiàn)自動(dòng)播放視頻模仿gif動(dòng)圖效果實(shí)例
需求背景:
在小程序頁(yè)面插入gif動(dòng)態(tài)圖,但gif圖一般體積比較大,轉(zhuǎn)而用自動(dòng)播放視頻的模式來(lái)模擬gif圖的效果,豐富頁(yè)面展示。自動(dòng)播放的視頻,無(wú)控制條,無(wú)聲音,自動(dòng)循環(huán)播放。
技術(shù)難點(diǎn):
因?yàn)槲⑿判〕绦蛟谕粋€(gè)頁(yè)面,存在多個(gè)視頻時(shí)(建議不超過(guò)3個(gè)視頻),會(huì)出現(xiàn)卡頓甚至閃退的情況。
developers.weixin.qq.com/community/d…
方案:
參考小程序社區(qū)討論方案,當(dāng)視頻未出現(xiàn)在屏幕可視區(qū)域時(shí),用圖片占位,出現(xiàn)在屏幕中,把圖片替換成視頻,并且自動(dòng)播放。
代碼注意點(diǎn):
video標(biāo)簽用wx:if來(lái)控制,image標(biāo)簽用visibility樣式來(lái)占位。
<view class="container" style="width: {{videoWidth}}rpx;height: {{videoHeight}}rpx">
<image class="image" style="visibility: {{play ? 'hidden' : 'visible'}};" id="image_{{videoId}}" src="{{poster}}" />
<video class="video" wx:if="{{play}}" id="video_{{videoId}}" controls="{{controls}}" object-fit='contain' show-center-play-btn="{{showCenterPlayBtn}}" enable-progress-gesture="{{enableProgressGesture}}" direction="{{direction}}" enable-play-gesture="{{enablePlayGesture}}" muted="{{muted}}" loop="{{loop}}" src="{{videoUrl}}" />
</view>
.container {
position: relative;
width: 100%;
height: 100%;
}
.image {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 10;
width: 100%;
height: 100%;
}
.video {
width: 100%;
height: 100%;
}
Component({
properties: {
// 視頻寬度
videoWidth: {
type: Number,
value: 0,
},
// 視頻高度
videoHeight: {
type: Number,
value: 0,
},
// 視頻海報(bào)/封面圖
poster: {
type: String,
value: '',
},
// 視頻鏈接
videoUrl: {
type: String,
value: '',
},
// 是否顯示播放進(jìn)度條
controls: {
type: Boolean,
value: false,
},
// 是否顯示中間播放按鈕
showCenterPlayBtn: {
type: Boolean,
value: false,
},
// 是否靜音
muted: {
type: Boolean,
value: true,
},
// 是否顯示靜音按鈕
showMuteBtn: {
type: Boolean,
value: true,
},
// 是否啟用手勢(shì)控制進(jìn)度
enableProgressGesture: {
type: Boolean,
value: false,
},
// 是否啟用手勢(shì)控制播放
enablePlayGesture: {
type: Boolean,
value: false,
},
// 方向
direction: {
type: Number,
value: 0,
},
// 指定開(kāi)始播放時(shí)間,單位:秒
showPlayTime: {
type: Number,
value: 0,
},
// 視頻id(唯一標(biāo)識(shí))
videoId: {
type: String,
value: '',
},
// 是否播放
play: {
type: Boolean,
value: false,
},
// 是否循環(huán)播放
loop: {
type: Boolean,
value: true,
},
},
data: {
paly: false, // 是否播放
context: null, // 創(chuàng)建的視頻實(shí)例對(duì)象
},
lifetimes: {
attached() {
this.videObserve();
},
},
methods: {
// 監(jiān)聽(tīng)視頻組件是否進(jìn)入可視區(qū)域
videObserve() {
this._observer = this.createIntersectionObserver({
observeAll: true,
});
this._observer.relativeToViewport().observe(`#image_${this.data.videoId}`, (res) => {
// res.intersectionRatio === 0表示不相交
if (res.intersectionRatio === 0) {
this.setData({
play: false,
});
} else {
const ctx = this.data.context || wx.createVideoContext(`video_${this.data.videoId}`, this);
if (ctx) {
this.setData(
{
context: ctx,
play: true,
},
() => {
// 加延時(shí)是為了等wxml節(jié)點(diǎn)創(chuàng)建完,拿到節(jié)點(diǎn)再播放,否則可能會(huì)出現(xiàn)播放失敗
setTimeout(() => {
ctx.play();
}, 400);
}
);
}
}
});
},
},
});
效果圖
視頻進(jìn)入可視區(qū)域,才加載視頻開(kāi)始播放。視頻離開(kāi)可視區(qū)域,play=false,清除video標(biāo)簽,即清除視頻。

未來(lái)優(yōu)化點(diǎn)
目前視頻剛開(kāi)始渲染時(shí),會(huì)出現(xiàn)閃黑屏的效果。后續(xù)看看能否改成白色(白色比黑色好接受一些),也要看小程序視頻支持情況。
目前未限制一屏不能超過(guò)3個(gè)視頻同時(shí)播放。如果視頻寬高比較小,可能會(huì)出現(xiàn)一屏有很多視頻,從而卡頓或閃退。
總結(jié)
到此這篇關(guān)于微信小程序?qū)崿F(xiàn)自動(dòng)播放視頻模仿gif動(dòng)圖效果的文章就介紹到這了,更多相關(guān)小程序自動(dòng)播放視頻模仿gif動(dòng)圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用JavaScript實(shí)現(xiàn)仿Windows關(guān)機(jī)效果
用JavaScript實(shí)現(xiàn)仿Windows關(guān)機(jī)效果...2007-03-03
淺談JavaScript中的對(duì)象及Promise對(duì)象的實(shí)現(xiàn)
這篇文章主要介紹了淺談JavaScript中的對(duì)象及Promise對(duì)象的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2015-11-11
cookie丟失問(wèn)題(認(rèn)證失效) Authentication (用戶(hù)驗(yàn)證信息)也會(huì)丟失
window.showModalDialog() 后 window.open() 導(dǎo)致cookie丟失問(wèn)題(認(rèn)證失效) Authentication (用戶(hù)驗(yàn)證信息)也會(huì)丟失2009-06-06
iScroll中事件點(diǎn)擊觸發(fā)兩次解決方案
iScroll是我們?cè)谧鍪謾C(jī)網(wǎng)頁(yè)中常用的滑動(dòng)控件之一。單說(shuō)其功能已相當(dāng)豐富。但個(gè)別時(shí)候也是會(huì)掉坑的,正好這次就遇上了。在android的app中嵌入網(wǎng)頁(yè)時(shí)不少手機(jī)會(huì)出現(xiàn)一次點(diǎn)擊兩次觸發(fā)的現(xiàn)象。經(jīng)過(guò)一段時(shí)間的折騰,總算想到了一個(gè)還算合理的解決放案。2015-03-03
innertext , insertadjacentelement , insertadjacenthtml , ins
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等區(qū)別...2007-06-06
JavaScript實(shí)現(xiàn)簡(jiǎn)易tab欄切換案例
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)易tab欄切換案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞
下面小編就為大家?guī)?lái)一篇淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
微信小程序 this.triggerEvent()的具體使用
這篇文章主要介紹了微信小程序 this.triggerEvent()的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

