


Detaillierte Erläuterung der Uni-App (vue), die eine grundlegende Audiokomponente basierend auf InnerAudioContext kapselt
Sep 19, 2020 pm 04:32 PMVerwandte Lernempfehlungen: Entwicklung des WeChat-Miniprogramms
Der Grund
Derselbe liegt darin, dass der Beamte des Miniprogramms die audio
-Komponente nicht verwaltetaudio
组件了
音频组件的要求与限制
1、点击播放或者暂停
2、显示播放进度及总时长
3、通过图标变化显示当前音频所处状态(暂停/播放/加载中)
4、页面音频更新时刷新组件状态
5、全局有且只有一个音频处于播放状态
6、离开页面之后要自动停止播放并销毁音频实例
材料/属性/方法
让我们开始吧
uni-app Vue
- 同样的先构造
DOM
结构
<view class="custom-audio"> <image v-if="audioSrc !== undefined && audioSrc !== null && audioSrc !== ''" @click="playOrStopAudio" :src="audioImg" class="audio-btn" /> <text v-else @click="tips" class="audio-btn">无音源</text> <text>{{ fmtSecond(currentTime) }}/{{ fmtSecond(duration) }}</text></view>复制代码
- 定义接受的组件
props: { audioSrc: { type: String, default: '' }, },复制代码
- 定义
CustomAudio
组件的初始化相关的操作,并给innerAudioContext
的回调添加一些行为(之前Taro那篇我们踩过的坑这里就直接上代码了)
import { formatSecondToHHmmss, afterAudioPlay, beforeAudioRecordOrPlay } from '../../lib/Utils'const iconPaused = '../../static/images/icon_paused.png'const iconPlaying = '../../static/images/icon_playing.png'const iconStop = '../../static/images/icon_stop.png'const iconLoading = '../../static/images/icon_loading.gif'// ...data() { return { audioCtx: null, // 音频上下文 duration: 0, // 音频总时长 currentTime: 0, // 音频当前播放的时长 audioImg: iconLoading, // 默认状态为加载中 } },watch: { audioSrc: { handler(newSrc, oldSrc) { console.log('watch', newSrc, oldSrc) this.audioImg = iconLoading this.currentTime = 0 this.duration = 0 if (this.audioCtx === undefined) { this.audioCtx = uni.createInnerAudioContext() this.onTimeUpdate = this.audioCtx.onTimeUpdate this.bindAuidoCallback(this.audioCtx) } else { this.audioCtx.src = newSrc } if (this.audioCtx.play) { this.audioCtx.stop() getApp().globalData.audioPlaying = false } } } }, mounted() { this.audioCtx = uni.createInnerAudioContext() this.audioCtx.src = this.audioSrc this.audioCtx.startTime = 0 this.bindAuidoCallback(this.audioCtx) },methods: { bindAuidoCallback(ctx) { ctx.onTimeUpdate((e) => { this.onTimeUpdate(e) }) ctx.onCanplay((e) => { this.onCanplay(e) }) ctx.onWaiting((e) => { this.onWaiting(e) }) ctx.onPlay((e) => { this.onPlay(e) }) ctx.onPause((e) => { this.onPause(e) }) ctx.onEnded((e) => { this.onEnded(e) }) ctx.onError((e) => { this.onError(e) }) }, tips(){ uni.showToast({ title: '无效音源,请先录音', icon: 'none' }) }, playOrStopAudio() { if (this.audioCtx === null) { this.audioCtx = uni.createInnerAudioContext() this.audioCtx.src = this.audioSrc this.bindAuidoCallback(this.audioCtx) } if (this.audioCtx.paused) { if (beforeAudioRecordOrPlay('play')) { this.audioCtx.play() this.audioImg = iconPlaying } } else { this.audioCtx.pause() afterAudioPlay() this.audioImg = iconPaused } }, onTimeUpdate(e) { console.log('onTimeUpdate', this.audioCtx.duration, this.audioCtx.currentTime) if (this.audioCtx.currentTime > 0 && this.audioCtx.currentTime <= 1) { this.currentTime = 1 } else if (this.currentTime !== Math.floor(this.audioCtx.currentTime)) { this.currentTime = Math.floor(this.audioCtx.currentTime) } const duration = Math.floor(this.audioCtx.duration) if (this.duration !== duration) { this.duration = duration } }, onCanplay(e) { if (this.audioImg === iconLoading) { this.audioImg = iconPaused } console.log('onCanplay', e) }, onWaiting(e) { if (this.audioImg !== iconLoading) { this.audioImg = iconLoading } }, onPlay(e) { console.log('onPlay', e, this.audioCtx.duration) this.audioImg = iconPlaying if (this.audioCtx.duration > 0 && this.audioCtx.duration <= 1) { this.duration = 1 } else { this.duration = Math.floor(this.audioCtx.duration) } }, onPause(e) { console.log('onPause', e) this.audioImg = iconPaused }, onEnded(e) { console.log('onEnded', e) if (this.audioImg !== iconPaused) { this.audioImg = iconPaused } afterAudioPlay() }, onError(e) { uni.showToast({ title: '音频加载失败', icon: 'none' }) throw new Error(e.errMsg, e.errCode) }, fmtSecond(sec) { const { min, second } = formatSecondToHHmmss(sec) return `${min}:${second}` } },复制代码
同样的scss
Anforderungen und Einschränkungen der Audiokomponenten
1. Zum Abspielen oder Anhalten klicken
2. Zeigt den aktuellen Audiostatus an (Pause). ) durch Symboländerungen /Wiedergabe/Laden)
4. Aktualisieren Sie den Komponentenstatus, wenn das Seitenaudio aktualisiert wird.
5. Es gibt und gibt nur ein Audio im Wiedergabestatus.
6 Stoppen Sie die Wiedergabe und zerstören Sie das Audio, nachdem Sie die Seite verlassen haben. Beispiel
Material/Eigenschaft/Methode
Lass uns beginnenuni-app Vue
- Das Gleiche: Erstellen Sie zunächst die
DOM
-Struktur
<style lang="scss" scoped>.custom-audio { border-radius: 8vw; border: #CCC 1px solid; background: #F3F6FC; color: #333; display: flex; flex-flow: row nowrap; align-items: center; justify-content: space-between; padding: 2vw; font-size: 14px;
.audio-btn { width: 10vw; height: 10vw; white-space: nowrap; display: flex; align-items: center; justify-content: center;
}
}
</style>复制代码
Nach dem Login kopieren- Definieren Sie die akzeptierten Komponenten
rrreeeDefinieren Sie -Vorgänge im Zusammenhang mit der Initialisierung der CustomAudio
-Komponente und fügen Sie einige Verhaltensweisen zum Rückruf von innerAudioContext
hinzu (die Fallstricke, auf die wir im vorherigen Taro-Artikel gestoßen sind). werden hier direkt codiert) ul>rrreeeDie gleiche scss
-Dateirrreee
Endlich
Wenn Sie auf Probleme stoßen oder Vorschläge haben, können Sie uns folgen. Lassen Sie mich darüber diskutierenDas obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Uni-App (vue), die eine grundlegende Audiokomponente basierend auf InnerAudioContext kapselt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
2. Zeigt den aktuellen Audiostatus an (Pause). ) durch Symboländerungen /Wiedergabe/Laden)
4. Aktualisieren Sie den Komponentenstatus, wenn das Seitenaudio aktualisiert wird.
5. Es gibt und gibt nur ein Audio im Wiedergabestatus.
6 Stoppen Sie die Wiedergabe und zerstören Sie das Audio, nachdem Sie die Seite verlassen haben. Beispiel

uni-app Vue
- Das Gleiche: Erstellen Sie zunächst die
DOM
-Struktur
<style lang="scss" scoped>.custom-audio { border-radius: 8vw; border: #CCC 1px solid; background: #F3F6FC; color: #333; display: flex; flex-flow: row nowrap; align-items: center; justify-content: space-between; padding: 2vw; font-size: 14px; .audio-btn { width: 10vw; height: 10vw; white-space: nowrap; display: flex; align-items: center; justify-content: center; } } </style>复制代码
- Definieren Sie die akzeptierten Komponenten
-Vorgänge im Zusammenhang mit der Initialisierung der CustomAudio
-Komponente und fügen Sie einige Verhaltensweisen zum Rückruf von innerAudioContext
hinzu (die Fallstricke, auf die wir im vorherigen Taro-Artikel gestoßen sind). werden hier direkt codiert)Die gleiche scss
-Dateirrreee
Endlich
Wenn Sie auf Probleme stoßen oder Vorschläge haben, können Sie uns folgen. Lassen Sie mich darüber diskutieren
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Uni-App (vue), die eine grundlegende Audiokomponente basierend auf InnerAudioContext kapselt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Wie entwickle ich eine Uni-App in VSCode? (Tutorial-Teilen)

Verwenden Sie uniapp, um eine einfache Kartennavigation zu entwickeln

Lassen Sie uns darüber sprechen, wie Sie mit Uniapp ein Schlangenspiel entwickeln können!

So kapseln Sie eine Uni-App-Vue3-Schnittstellenanfrage

Beispiele zur Erläuterung, wie Uniapp die All-Select-Funktion von Multi-Select-Boxen implementiert

Führen Sie Sie Schritt für Schritt durch die Entwicklung eines Uni-App-Kalender-Plug-Ins (und dessen Veröffentlichung).

Detailliertes Beispiel, wie Uniapp die Telefonaufzeichnungsfunktion implementiert (mit Code)

Lassen Sie uns darüber sprechen, wie Sie mit Uniapp globale Nachrichtenaufforderungen und deren Komponenten implementieren
