小程序音頻播放圓形進(jìn)度條

最近羔巢,因?yàn)闃I(yè)務(wù)需要树碱,研究了一波圓形進(jìn)度條的實(shí)現(xiàn),最終采用了如下這種方式墅诡。


先上效果圖:


sound.gif

實(shí)現(xiàn)思路

  • 重點(diǎn)參照了 詳解用CSS3制作圓形滾動(dòng)進(jìn)度條動(dòng)畫(huà)效果 的第三種效果。即采用兩個(gè)矩形截取完整的兩個(gè)圓桐智,利用.progress_wrapperoverflow: hidden;屬性防止整圓溢出末早,表現(xiàn)為兩個(gè)半圓拼接為一個(gè)整圓。然后旋轉(zhuǎn)矩形里面的圓说庭,通過(guò)改變旋轉(zhuǎn)角度逐漸顯示隱藏的圓形部分然磷,表現(xiàn)為音頻進(jìn)度條的變化。
  • 另外刊驴,這個(gè)圓形進(jìn)度條有點(diǎn)小bug姿搜,在兩個(gè)半圓下方接口處會(huì)有一像素的空隙,我采用了一像素背景圖配合絕對(duì)定位填補(bǔ)這個(gè)空隙

WXML代碼

核心圓形進(jìn)度條wxml代碼

<view class="circle_container">
  <view class="circle_wrapper">
    <view class="progress_wrapper circle_right">
      <view class="circle_progress right_circle" style="transform: rotate({{rightDeg}});"></view>
    </view>
    <view class="progress_wrapper circle_left">
      <view class="circle_progress left_circle" style="transform: rotate({{leftDeg}});"></view>
    </view>
    <image src="/images/{{play?'template_play03':'template_play'}}.png" class='play_audio' catchtap='pause_audio'></image>
    <view style="visibility: {{visible}}" class="circle_markup"></view>
  </view>
</view>

WXSS代碼

圓形進(jìn)度條樣式

.circle_container {
  position: absolute;
  width: 56rpx;
  height: 56rpx;
  right: 30rpx;
  bottom: 20rpx;
}

.circle_wrapper {
  position: relative;
  width: 56rpx;
  height: 56rpx;
}

.progress_wrapper {
  width: 28rpx;
  height: 56rpx;
  position: absolute;
  top: 0;
  overflow: hidden;
}

.circle_right {
  right: 0;
}

.circle_left {
  left: 0;
}

.circle_progress {
  width: 48rpx;
  height: 48rpx;
  border: 4rpx solid #fff;
  border-radius: 50%;
  position: absolute;
  top: 0;
  transform: rotate(45deg);
}

.right_circle {
  border-top: 4rpx solid transparent;
  border-right: 4rpx solid transparent;
  right: 0;
}

.left_circle {
  border-bottom: 4rpx solid transparent;
  border-left: 4rpx solid transparent;
  left: 0;
}

.circle_markup {
  position: absolute;
  left: 28rpx;
  bottom: 0;
  width: 2rpx;
  height: 4rpx;
  background: #fff;
  visibility: hidden;
}

JS代碼

使用了WePY框架捆憎,其中舅柜,formatNumber格式化時(shí)間樣式,isPlay控制音頻播放圖標(biāo)躲惰,isStop控制播放懸浮框是否顯示,time表示音頻當(dāng)前播放時(shí)間致份,duration表示音頻總時(shí)長(zhǎng),percent表示音頻進(jìn)度條礁扮,play控制懸浮框音頻播放圖標(biāo)知举,title表示音頻標(biāo)題,rightDeg表示右側(cè)半圓旋轉(zhuǎn)角度太伊,leftDeg表示左側(cè)半圓旋轉(zhuǎn)角度雇锡,visible控制圓形進(jìn)度條空隙是否顯示

import wepy from 'wepy'
  import {
    formatNumber
  } from '@/utils/util'
  export default class Index extends wepy.page {
    config = {
      navigationBarTitleText: '測(cè)試'
    }
    data = {
      isPlay: false,
      isStop: true,
      duration: '',
      percent: 0,
      play: true,
      title: '今日片尾',
      time: '',
      rightDeg: '',
      leftDeg: '',
      visible: 'hidden'
    }
    methods = {
      play_audio_func() {
        const audio = wx.getBackgroundAudioManager()
        audio.src = 'http://audio.heardtech.com/endAudio.mp3'
        audio.title = '今日片尾'
      }
    }
    onLoad() {
      let leftDeg = ''
      let rightDeg = ''
      let visible = ''
      let currentTime = 0
      let duration = 0
      const audio = wx.getBackgroundAudioManager()
      audio.onPlay(() => {
        this.isPlay = true
        this.isStop = false
      })
      audio.onPause(() => {
        this.isPlay = false
        this.isStop = false
      })
      audio.onStop(() => {
        this.isPlay = false
        this.isStop = true
      })
      audio.onEnded(() => {
        // audio.onTimeUpdate(() => {})
        this.percent = 0
        this.isPlay = false
        this.isStop = true
      })
      audio.onError((e) => {
        console.log('音頻播放錯(cuò)誤', e)
      })
      audio.onTimeUpdate(() => {
        let audioData = this.computePercent(audio)
        this.percent = audioData.percent
        this.time = audioData.time
        currentTime = audioData.currentTime
        duration = audioData.duration
        this.duration = audioData.dtime
        // 右側(cè)半圓在進(jìn)度超過(guò)一半之后要保持旋轉(zhuǎn)225deg狀態(tài),未超過(guò)一半,左側(cè)半圓保持原始角度45deg
        if (currentTime / duration <= 0.5) {
          leftDeg = '45deg'
          rightDeg = currentTime / duration * 360 + 45 + 'deg'
          visible = 'hidden'
        } else {
          leftDeg = currentTime / duration * 360 + 225 + 'deg'
          rightDeg = '225deg'
          visible = 'visible'
        }

        this.rightDeg = rightDeg
        this.leftDeg = leftDeg
        this.visible = visible

        this.$apply()
      })
    }
    computePercent(audio) {
      let currentTime = parseInt(audio.currentTime)
      let duration = parseInt(audio.duration)
      let min = parseInt(currentTime / 60)
      let sec = parseInt(currentTime % 60)
      let dmin = parseInt(duration / 60)
      let dsec = parseInt(duration % 60)
      let time = formatNumber(min) + ':' + formatNumber(sec)
      let dtime = formatNumber(dmin) + ':' + formatNumber(dsec)
      let percent = parseInt(currentTime / duration * 100)
      console.log('currentTime:', currentTime, 'percent:', percent, 'duration:', duration)
      return {
        time,
        dtime,
        percent,
        currentTime,
        duration
      }
    }
  }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末僚焦,一起剝皮案震驚了整個(gè)濱河市锰提,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖立肘,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件边坤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谅年,警方通過(guò)查閱死者的電腦和手機(jī)茧痒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)融蹂,“玉大人旺订,你說(shuō)我怎么就攤上這事〕迹” “怎么了区拳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)意乓。 經(jīng)常有香客問(wèn)我樱调,道長(zhǎng),這世上最難降的妖魔是什么届良? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任笆凌,我火速辦了婚禮,結(jié)果婚禮上士葫,老公的妹妹穿的比我還像新娘菩颖。我一直安慰自己,他們只是感情好为障,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著放祟,像睡著了一般鳍怨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跪妥,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天鞋喇,我揣著相機(jī)與錄音,去河邊找鬼眉撵。 笑死侦香,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纽疟。 我是一名探鬼主播罐韩,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼污朽!你這毒婦竟也來(lái)了散吵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矾睦,沒(méi)想到半個(gè)月后晦款,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枚冗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年缓溅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赁温。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坛怪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出束世,到底是詐尸還是另有隱情酝陈,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布毁涉,位于F島的核電站沉帮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贫堰。R本人自食惡果不足惜穆壕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望其屏。 院中可真熱鬧喇勋,春花似錦、人聲如沸偎行。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛤袒。三九已至熄云,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妙真,已是汗流浹背缴允。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珍德,地道東北人练般。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锈候,于是被迫代替她去往敵國(guó)和親薄料。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1晴及、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,979評(píng)論 3 119
  • 古典專(zhuān)欄《22-2 寫(xiě)給努力卻學(xué)不好的人,給大腦注入知識(shí)晶體》讀后反思 一琳钉、筆記 你知道鉆石之所以比同樣組成元素的...
    丹丹自語(yǔ)閱讀 638評(píng)論 0 0
  • “用雪把火埋了势木,我們?cè)撟吡恕歌懒!?“恩啦桌。這是第幾天了?” “第八天及皂,還有五天吧甫男,還有十八天‘白夜’才會(huì)結(jié)束,你可要堅(jiān)...
    銀色金屬閱讀 208評(píng)論 0 0
  • 晚飯過(guò)后验烧,涼風(fēng)習(xí)習(xí)板驳,恰逢周末。踏上單車(chē)碍拆,塞上耳機(jī)若治,身披夕陽(yáng)余暉,一路蹬到開(kāi)遠(yuǎn)市滇南發(fā)電總廠——是的感混,就是那個(gè)7路端幼、...
    聆聽(tīng)_自然閱讀 272評(píng)論 0 0