小程序視頻或音頻自定義可拖拽進(jìn)度條的示例代碼
小程序原生組件的音頻播放時(shí)并沒有進(jìn)度條的顯示,而此次項(xiàng)目中,鑒于原生的視頻進(jìn)度條樣式太丑,產(chǎn)品要求做一個(gè)可拖拽的進(jìn)度條滿足需求。
視頻和音頻提供的api大致是相似的,可以根據(jù)以下代碼修改為與音頻相關(guān)的進(jìn)度條。
wxml的結(jié)構(gòu)如下:
<video id="myVideo" src="http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400" enable-danmu danmu-btn controls="{{false}}" autoplay='{{true}}' bindtimeupdate="videoUpdate" objectFit="fill"></video>
<view class='process-container'>
<image src='{{playStates ? "../../assets/image/pause_icon.png" : "../../assets/image/play_icon.png"}}' class='video-controls-icon' bindtap='videoOpreation'></image>
<view class='slider-container'>
<slider bindchange="sliderChange" bindchanging="sliderChanging" step="1" value="{{sliderValue}}" backgroundColor="#A8A8A8" activeColor="#FFEE83" block-color="#FFEE83" />
</view>
</view>
data中初始化了sliderValue, updateState, playStates幾個(gè)變量。
data: {
sliderValue: 0, //控制進(jìn)度條slider的值,
updateState: false, //防止視頻播放過程中導(dǎo)致的拖拽失效
playStates: true //控制播放 & 暫停按鈕的顯示
},
onReady: function () {
this.videoContext = wx.createVideoContext('myVideo');
this.setData({
updateState: true
})
},
videoUpdate在播放進(jìn)度變化時(shí)觸發(fā),觸發(fā)頻率 250ms 一次。event.detail = {currentTime, duration},currentTime表示當(dāng)前時(shí)間,duration表示總時(shí)長,都以秒為單位。
videoUpdate(e) {
if (this.data.updateState) { //判斷拖拽完成后才觸發(fā)更新,避免拖拽失效
let sliderValue = e.detail.currentTime / e.detail.duration * 100;
this.setData({
sliderValue,
duration: e.detail.duration
})
}
},
進(jìn)度條可拖拽并指定視頻跳轉(zhuǎn)到相應(yīng)的位置
sliderChanging(e) {
this.setData({
updateState: false //拖拽過程中,不允許更新進(jìn)度條
})
},
sliderChange(e) {
if (this.data.duration) {
this.videoContext.seek(e.detail.value / 100 * this.data.duration); //完成拖動(dòng)后,計(jì)算對應(yīng)時(shí)間并跳轉(zhuǎn)到指定位置
this.setData({
sliderValue: e.detail.value,
updateState: true //完成拖動(dòng)后允許更新滾動(dòng)條
})
}
},
暫停/播放視頻
videoOpreation() {
this.data.playStates ? this.videoContext.pause() : this.videoContext.play();
this.setData({
playStates: !this.data.playStates
})
},
總結(jié):slider的最大值為100, step的值最小為1,這會導(dǎo)致視頻或音頻播放時(shí)間過長的時(shí)候,slider滑塊移動(dòng)速度很慢,拖拽移動(dòng)的時(shí)間間隔較大,用戶體驗(yàn)差。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript學(xué)習(xí)筆記之DOM操作實(shí)例分析
這篇文章主要介紹了JavaScript學(xué)習(xí)筆記之DOM操作,結(jié)合實(shí)例形式分析了javascript針對dom元素的獲取、設(shè)置相關(guān)操作常用函數(shù)使用技巧,需要的朋友可以參考下2019-01-01
textarea不能通過maxlength屬性來限制字?jǐn)?shù)的解決方法
textarea稱文本域,又稱文本區(qū),其不能通過maxlength屬性來限制字?jǐn)?shù),為此必須尋求其他方法來加以限制以達(dá)到預(yù)設(shè)的需求2014-09-09
JavaScript中高階函數(shù)的巧妙運(yùn)用
JavaScript中的高階函數(shù)是指可以接受其他函數(shù)作為參數(shù)或者返回一個(gè)函數(shù)作為結(jié)果的函數(shù),本文介紹了JS中一些高階函數(shù)的妙用,希望對大家有所幫助2023-05-05
深入理解 TypeScript Reflect Metadata
這篇文章主要介紹了深入理解 TypeScript Reflect Metadata,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
uniapp監(jiān)聽頁面滾動(dòng)2種常用方法
在uni-app中,監(jiān)聽頁面滾動(dòng)可以使用onPageScroll生命周期函數(shù)或@scroll事件監(jiān)聽器,onPageScroll適用于監(jiān)聽整個(gè)頁面的滾動(dòng)事件,而@scroll事件監(jiān)聽器適用于監(jiān)聽特定組件如scroll-view的滾動(dòng),這兩種方法的選擇取決于監(jiān)聽需求的不同,需要的朋友可以參考下2024-09-09
基于原生JavaScript實(shí)現(xiàn)SPA單頁應(yīng)用
單頁Web應(yīng)用?(single?page?web?application,SPA)?,就是只有一張Web頁面的應(yīng)用,是加載單個(gè)HTML?頁面并在用戶與應(yīng)用程序交互時(shí)動(dòng)態(tài)更新該頁面的Web應(yīng)用程序。本文將利用原生JS實(shí)現(xiàn)SPA單頁應(yīng)用,需要的可以參考一下2023-03-03

