体质测试
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
5.1 KiB

2 years ago
module.exports = (option) => {
option = option || {};
const app = option.app;
class Audio {
constructor(option) {
const _ts = this;
_ts.option = option.option;
_ts.playerId = option.playerId;
_ts.dataId = option.dataId;
this.player = this.createPlayer();
this.status = 'init';
}
// 播放
play() {
const _ts = this;
_ts.player.play();
}
// 暂停
pause() {
const _ts = this;
_ts.player.pause();
}
// 获取需要更新的数据键名
getAppDataKey(id){
for(let key in app.data){
let item = app.data[key];
if(item.id === id){
return key;
};
};
}
updateView(data){
data = data || {};
const _ts = this,
option = _ts.option;
_ts.updateKey = _ts.updateKey || _ts.getAppDataKey(_ts.dataId)
let articleData = global.__towxmldata__[_ts.dataId].article,
playerData = global.__towxmldata__[_ts.dataId].audio[_ts.playerId];
// 检查如果数据没有被应用到页面上则中止操作
if(!_ts.updateKey){
return;
};
// 将选项和新传入的数据组合到viewData,后续更新使用
for(let key in data){
option[key] = data[key];
};
// 设置默认进的播放进度
option.duration = _ts.duration || 0.001;
option.currentTime = _ts.currentTime || 0;
option.class = option.class || 'audioForH2w';
// 设置播放器样式
playerData.attr.class = option.class;
// 设置封面图片
playerData.child[1].child[0].attr.src = option.poster;
// 设置进度条
playerData.child[2].child[0].attr.style = `width:${option.currentTime / option.duration * 100}%`;
// 设置title、歌手、播放时间
playerData.child[2].child[1].child[0].text = option.name;
playerData.child[2].child[2].child[0].text = option.author;
playerData.child[2].child[3].child[0].text = `${_ts.formatTime(option.duration)} / ${_ts.formatTime(option.currentTime)}`;
// 更新数据
let updateData = {};
updateData[_ts.updateKey] = articleData;
app.setData(updateData);
}
// 创建播放器
createPlayer(){
const _ts = this;
let option = _ts.option,
autoplay = option.autoplay === 'true' ? true :
option.autoplay === 'false' ? false :
!!option.autoplay,
loop = option.loop === 'true' ? true :
option.loop === 'false' ? false :
!!option.loop,
src = option.src,
audio = wx.createInnerAudioContext();
audio.src = src;
audio.loop = loop;
audio.autoplay = autoplay;
// 进入可播放状态时更新视图
audio.onCanplay(() =>{
_ts.updateView({
class:'audioForH2w'
});
});
// 播放
audio.onPlay(() => {
_ts.status = 'start';
_ts.updateView({
class:'audioForH2w audioForH2w--play'
});
});
// 播放过程中
let temp = 0;
audio.onTimeUpdate(function (obj) {
_ts.status = 'update';
_ts.duration = audio.duration;
_ts.currentTime = audio.currentTime;
// 每5秒更新一次(否则内容过多会导致性能低下)
if(_ts.currentTime - temp > 5){
temp = _ts.currentTime;
_ts.updateView({
class:'audioForH2w audioForH2w--play'
});
};
});
// 暂停
audio.onPause(obj => {
_ts.status = 'pause';
_ts.updateView({
class:'audioForH2w'
});
});
// 停止
audio.onEnded(obj => {
_ts.status = 'end';
_ts.updateView({
class:'audioForH2w audioForH2w--end'
});
});
return audio;
}
// 数字补位
fillIn(val) {
return `${val < 10 ? '0' : ''}${val}`;
}
// 格式化时间
formatTime(time){
let fillIn = this.fillIn,
second = Math.floor(time % 60),
minute = Math.floor(time / 60 % 60),
hour = Math.floor(time / 60 / 60);
return `${fillIn(hour)}:${fillIn(minute)}:${fillIn(second)}`;
}
};
return new Audio(option);
};