|
@@ -45,6 +45,8 @@ class LessonScene extends scene {
|
|
|
this.curWareIndex = 0; //当前课件在课件列表中的索引
|
|
|
this.curImageList = null; //当前图片课件的图片列表
|
|
|
this.curImageIndex = null;//当前图片在列表中的索引
|
|
|
+ this.curAudioList = null; //当前音频课件的音频列表
|
|
|
+ this.curAudioIndex = 0; //当前音频在列表中的索引
|
|
|
this.videoPosition = {
|
|
|
top: 270,
|
|
|
left: 790,
|
|
@@ -104,7 +106,7 @@ class LessonScene extends scene {
|
|
|
this.curWareIndex = parseInt(e.target.id.split('-')[3]);
|
|
|
let curWare = matchWare(this.wareList, this.curWareId);
|
|
|
if (curWare) {
|
|
|
- this.createRightView(curWare);
|
|
|
+ this.createRightView(curWare);
|
|
|
}
|
|
|
});
|
|
|
this.moye.root.reRender();
|
|
@@ -125,6 +127,9 @@ class LessonScene extends scene {
|
|
|
case Consts.TYPE_VIDEO:
|
|
|
item.icon = 'assets/img/LessonScene/video.png';
|
|
|
break;
|
|
|
+ case Consts.TYPE_AUDIOBOOK:
|
|
|
+ item.icon = 'assets/img/LessonScene/audio.png';
|
|
|
+ break;
|
|
|
}
|
|
|
return `
|
|
|
<div class="ware-item-frame">
|
|
@@ -160,16 +165,6 @@ class LessonScene extends scene {
|
|
|
if (list && list.length >= 1) {
|
|
|
playUrl = Utils.videoUrlFormat(list[0].url);
|
|
|
}
|
|
|
- /*
|
|
|
- let videoViewDom =
|
|
|
- `
|
|
|
- <div id="view-full-screen" fe-role="Widget" class="view-full-screen-video">
|
|
|
- </div>
|
|
|
- <div id="view-video-start" fe-role="Widget">
|
|
|
- <div class="transparent-btn">播放</div>
|
|
|
- </div>
|
|
|
- `;
|
|
|
- */
|
|
|
let videoViewDom = '';
|
|
|
document.getElementById('view-bottom').innerHTML = videoViewDom;
|
|
|
this.moye.root.reRender();
|
|
@@ -194,9 +189,29 @@ class LessonScene extends scene {
|
|
|
this.curImageIndex = 0;
|
|
|
this.renderImageView();
|
|
|
}
|
|
|
+ break;
|
|
|
+ case Consts.TYPE_AUDIOBOOK:
|
|
|
+ let audioViewDom =
|
|
|
+ `
|
|
|
+ <div id="view-full-screen" fe-role="Widget" class="view-full-screen-img"></div>
|
|
|
+ <div id="view-previous" fe-role="Widget">
|
|
|
+ <div class="transparent-btn">上一页</div>
|
|
|
+ </div>
|
|
|
+ <div id="view-page">1/1</div>
|
|
|
+ <div id="view-next" fe-role="Widget">
|
|
|
+ <div class="transparent-btn">下一页</div>
|
|
|
+ </div>
|
|
|
+ `;
|
|
|
+ document.getElementById('view-bottom').innerHTML = audioViewDom;
|
|
|
+ this.moye.root.reRender();
|
|
|
+ this.curAudioList = list;
|
|
|
+ if (this.curAudioList.length > 0) {
|
|
|
+ this.curAudioIndex = 0;
|
|
|
+ this.renderAudioView();
|
|
|
+ }
|
|
|
break;
|
|
|
- default:
|
|
|
- break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -206,9 +221,9 @@ class LessonScene extends scene {
|
|
|
renderImageView() {
|
|
|
const curImage = this.curImageList[this.curImageIndex];
|
|
|
document.getElementById('view-page').innerHTML = (this.curImageIndex + 1) + '/' + this.curImageList.length;
|
|
|
- let imageDom = `<img src=${curImage.url} />`
|
|
|
+ let imageDom = `<img src="${curImage.url}" />`
|
|
|
if (this.isDownload) {
|
|
|
- imageDom = `<img src=${getLocalResourceUrl(curImage.url)} />`
|
|
|
+ imageDom = `<img src="${getLocalResourceUrl(curImage.url)}" onerror="this.src='${curImage.url}'" />`
|
|
|
}
|
|
|
document.getElementById('view-content').innerHTML = imageDom;
|
|
|
}
|
|
@@ -238,7 +253,7 @@ class LessonScene extends scene {
|
|
|
const videoDom = `<div id="hls-video"></div>`;
|
|
|
document.getElementById('view-content').innerHTML = videoDom;
|
|
|
this.videoPlayer = new EfunVideoPlayer();
|
|
|
- this.videoPlayer.initPlayer(localUrl, 'hls-video');
|
|
|
+ this.videoPlayer.initPlayer(localUrl, 'hls-video', url);
|
|
|
}
|
|
|
// 监控到初始化视频成功后暂停画面
|
|
|
this.timer = window.setInterval(() => {
|
|
@@ -253,6 +268,108 @@ class LessonScene extends scene {
|
|
|
}, 500);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 渲染音频视图
|
|
|
+ */
|
|
|
+ renderAudioView(focusTarget) {
|
|
|
+ const curAudio = this.curAudioList[this.curAudioIndex];
|
|
|
+ const { img, audio, type } = curAudio;
|
|
|
+ let imgPath = (img || {}).path || '';
|
|
|
+ let audioUrl = (audio || {}).url;
|
|
|
+ let footer = document.getElementById('view-page');
|
|
|
+ if (footer) {
|
|
|
+ footer.innerHTML = (this.curAudioIndex + 1) + '/' + this.curAudioList.length;
|
|
|
+ }
|
|
|
+ let content = document.getElementById('view-content');
|
|
|
+ // 1.更换背景图片
|
|
|
+ const imgUrl = `${Consts.IMG_PATH}/${imgPath}`;
|
|
|
+ let imgHTML = `<img src="${imgUrl}" />`;
|
|
|
+ if (this.isDownload) {
|
|
|
+ imgHTML = `<img src="${getLocalResourceUrl(imgUrl)}" />`
|
|
|
+ }
|
|
|
+ content.innerHTML = imgHTML;
|
|
|
+ // 2.根据是否有无audioURL来控制面板及audio的展现
|
|
|
+ if (type === Consts.TYPE_AUDIOBOOK && audioUrl) {
|
|
|
+ if (this.isDownload) {
|
|
|
+ audioUrl = getLocalResourceUrl(audioUrl)
|
|
|
+ }
|
|
|
+ let audioElement = document.createElement('audio');
|
|
|
+ audioElement.setAttribute('id', 'courseware-audio');
|
|
|
+ audioElement.setAttribute('src', audioUrl);
|
|
|
+ audioElement.setAttribute('autoplay', 'autoplay');
|
|
|
+ let controlsElement = document.createElement('div');
|
|
|
+ controlsElement.setAttribute('class', 'audio-controls');
|
|
|
+ let controlsBtns = `
|
|
|
+ <!-- 播放/暂停 -->
|
|
|
+ <div id="audio-play" class="audio-controls-item btn-play" fe-role="Widget"></div>
|
|
|
+ <!-- 有声/静音 -->
|
|
|
+ <div id="audio-mute" class="audio-controls-item btn-mute" fe-role="Widget"></div>
|
|
|
+ <!-- 下一个音频 -->
|
|
|
+ <div id="audio-next" class="audio-controls-item btn-next" fe-role="Widget"></div>
|
|
|
+ <!-- 上一个音频 -->
|
|
|
+ <div id="audio-last" class="audio-controls-item btn-last" fe-role="Widget"></div>
|
|
|
+ `;
|
|
|
+ controlsElement.innerHTML = controlsBtns;
|
|
|
+ content.appendChild(audioElement);
|
|
|
+ content.appendChild(controlsElement);
|
|
|
+ this.moye.root.reRender();
|
|
|
+ // 监听onended事件
|
|
|
+ let audioDom = document.getElementById('courseware-audio');
|
|
|
+ if (audioDom) {
|
|
|
+ audioDom.addEventListener('ended', function () {
|
|
|
+ document.getElementById('audio-play').classList.add('paused');
|
|
|
+ audioDom.currentTime = 0;
|
|
|
+ }, false);
|
|
|
+ }
|
|
|
+ // 指定光标位置
|
|
|
+ if (focusTarget && this.moye.root.getWidgetById(focusTarget)) {
|
|
|
+ this.moye.root.getWidgetById(focusTarget).focus();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 音频播放控制 */
|
|
|
+ audioPlayControl(eventId) {
|
|
|
+ let targetAudio = document.getElementById('courseware-audio');
|
|
|
+ if (!targetAudio) { return; }
|
|
|
+ switch (eventId) {
|
|
|
+ case 'audio-play':
|
|
|
+ let playBtn = document.querySelector('#audio-play');
|
|
|
+ if (targetAudio.paused) {
|
|
|
+ targetAudio.play();
|
|
|
+ playBtn.classList.remove('paused');
|
|
|
+ } else {
|
|
|
+ targetAudio.pause();
|
|
|
+ playBtn.classList.add('paused');
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 'audio-mute':
|
|
|
+ let muteBtn = document.querySelector('#audio-mute');
|
|
|
+ if (targetAudio.muted) {
|
|
|
+ targetAudio.muted = false;
|
|
|
+ muteBtn.classList.remove('muted');
|
|
|
+ } else {
|
|
|
+ targetAudio.muted = true;
|
|
|
+ muteBtn.classList.add('muted');
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 'audio-next':
|
|
|
+ if (this.curAudioIndex < this.curAudioList.length -1) {
|
|
|
+ this.curAudioIndex += 1;
|
|
|
+ this.renderAudioView('audio-next');
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 'audio-last':
|
|
|
+ if (this.curAudioIndex > 0) {
|
|
|
+ this.curAudioIndex -= 1;
|
|
|
+ this.renderAudioView('audio-last');
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
updateRightView(item) {
|
|
|
const { title, type, list } = item;
|
|
|
document.getElementById('view-top').innerHTML = title;
|
|
@@ -262,20 +379,6 @@ class LessonScene extends scene {
|
|
|
if (list && list.length >= 1) {
|
|
|
playUrl = Utils.videoUrlFormat(list[0].url);
|
|
|
}
|
|
|
- /*
|
|
|
- let playText = '播放';
|
|
|
- if (this.videoPlayer && this.videoPlayer.playStatus()) {
|
|
|
- playText = '暂停';
|
|
|
- }
|
|
|
- let videoViewDom =
|
|
|
- `
|
|
|
- <div id="view-full-screen" fe-role="Widget" class="view-full-screen-video">
|
|
|
- </div>
|
|
|
- <div id="view-video-start" fe-role="Widget">
|
|
|
- <div class="transparent-btn">${playText}</div>
|
|
|
- </div>
|
|
|
- `;
|
|
|
- */
|
|
|
document.getElementById('view-bottom').innerHTML = '';
|
|
|
this.moye.root.reRender();
|
|
|
//如果是H5播放器,则重新创建video标签
|
|
@@ -285,7 +388,7 @@ class LessonScene extends scene {
|
|
|
const videoDom = `<div id="hls-video"></div>`;
|
|
|
document.getElementById('view-content').innerHTML = videoDom;
|
|
|
this.videoPlayer = new EfunVideoPlayer();
|
|
|
- this.videoPlayer.initPlayer(playUrl, 'hls-video');
|
|
|
+ this.videoPlayer.initPlayer(playUrl, 'hls-video', url);
|
|
|
}
|
|
|
break;
|
|
|
case Consts.TYPE_IMAGE:
|
|
@@ -293,12 +396,12 @@ class LessonScene extends scene {
|
|
|
`
|
|
|
<div id="view-full-screen" fe-role="Widget" class="view-full-screen-img"></div>
|
|
|
<div id="view-previous" fe-role="Widget">
|
|
|
- <div class="transparent-btn">上一页</div>
|
|
|
- </div>
|
|
|
+ <div class="transparent-btn">上一页</div>
|
|
|
+ </div>
|
|
|
<div id="view-page">1/1</div>
|
|
|
<div id="view-next" fe-role="Widget">
|
|
|
- <div class="transparent-btn">下一页</div>
|
|
|
- </div>
|
|
|
+ <div class="transparent-btn">下一页</div>
|
|
|
+ </div>
|
|
|
`;
|
|
|
document.getElementById('view-bottom').innerHTML = imageViewDom;
|
|
|
this.moye.root.reRender();
|
|
@@ -324,7 +427,8 @@ class LessonScene extends scene {
|
|
|
|
|
|
onCreate(data) {
|
|
|
//是否已下载
|
|
|
- this.isDownload = checkDownloadStatus(data.downloadStatus);
|
|
|
+ // this.isDownload = checkDownloadStatus(data.downloadStatus);
|
|
|
+ this.isDownload = true;
|
|
|
this.lessonId = data.id;
|
|
|
this.courseId = data.courseId;
|
|
|
this.setContentView(require('../../../res/tpl/LessonScene.tpl'), {}, 'LessonScene', {}, () => {
|
|
@@ -336,15 +440,21 @@ class LessonScene extends scene {
|
|
|
onResume(data) {
|
|
|
if (!data) { return; }
|
|
|
//更新下当前的课件信息
|
|
|
- const { curWareIndex, curImageList, curImageIndex } = data;
|
|
|
+ const { curWareIndex, curImageList, curImageIndex, curAudioList, curAudioIndex } = data;
|
|
|
this.curWareIndex = curWareIndex;
|
|
|
this.curWareId = this.wareList[curWareIndex].id;
|
|
|
this.curWareType = this.wareList[curWareIndex].type;
|
|
|
if (curImageList) {
|
|
|
- this.curImageList = curImageList;
|
|
|
+ this.curImageList = curImageList;
|
|
|
}
|
|
|
if (curImageIndex) {
|
|
|
- this.curImageIndex = curImageIndex;
|
|
|
+ this.curImageIndex = curImageIndex;
|
|
|
+ }
|
|
|
+ if (curAudioList) {
|
|
|
+ this.curAudioList = curAudioList;
|
|
|
+ }
|
|
|
+ if (curAudioIndex) {
|
|
|
+ this.curAudioIndex = curAudioIndex;
|
|
|
}
|
|
|
//更新左侧焦点位置
|
|
|
this.moye.root.getWidgetById(`item-${this.curWareType}-${this.curWareId}-${this.curWareIndex}`).focus();
|
|
@@ -354,52 +464,91 @@ class LessonScene extends scene {
|
|
|
}
|
|
|
|
|
|
onOK(e) {
|
|
|
- // 后退
|
|
|
+ // 点击后退按钮
|
|
|
if (e.target.con.classList.contains('goback')) {
|
|
|
this.hideScene({id: this.courseId}, 'CourseScene');
|
|
|
return;
|
|
|
}
|
|
|
+ // 拦截音频控制相关事件单独处理
|
|
|
const leaf = FocusEngine.getFocusedLeaf();
|
|
|
- switch (leaf.id) {
|
|
|
- case 'view-video-start':
|
|
|
- if (this.curWareType == Consts.TYPE_VIDEO) {
|
|
|
- if (this.videoPlayer.playStatus()) {
|
|
|
- this.videoPlayer.pause();
|
|
|
- document.getElementById('view-video-start').innerHTML = '播放';
|
|
|
- } else {
|
|
|
- this.videoPlayer.start();
|
|
|
- document.getElementById('view-video-start').innerHTML = '暂停';
|
|
|
- }
|
|
|
- }
|
|
|
- //添加播放记录
|
|
|
- this.postPlayRecord(this.curWareId, this.courseId);
|
|
|
- break;
|
|
|
- case 'view-full-screen':
|
|
|
+ if (leaf.id && leaf.id.startsWith('audio')) {
|
|
|
+ this.audioPlayControl(leaf.id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ switch (leaf.id) {
|
|
|
+ case 'view-video-start':
|
|
|
+ if (this.curWareType == Consts.TYPE_VIDEO) {
|
|
|
+ if (this.videoPlayer.playStatus()) {
|
|
|
+ this.videoPlayer.pause();
|
|
|
+ document.getElementById('view-video-start').innerHTML = '播放';
|
|
|
+ } else {
|
|
|
+ this.videoPlayer.start();
|
|
|
+ document.getElementById('view-video-start').innerHTML = '暂停';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //添加播放记录
|
|
|
+ this.postPlayRecord(this.curWareId, this.courseId);
|
|
|
+ break;
|
|
|
+ case 'view-full-screen':
|
|
|
if (this.curWareType === Consts.TYPE_IMAGE) {
|
|
|
- this.showScene(require('./ImageWareFullScreenScene.js'), {
|
|
|
- wareList: this.wareList,
|
|
|
- curWareIndex: this.curWareIndex,
|
|
|
- curImageList: this.curImageList,
|
|
|
- curImageIndex: this.curImageIndex,
|
|
|
+ this.showScene(require('./ImageWareFullScreenScene.js'), {
|
|
|
+ wareList: this.wareList,
|
|
|
+ curWareIndex: this.curWareIndex,
|
|
|
+ curImageList: this.curImageList,
|
|
|
+ curImageIndex: this.curImageIndex,
|
|
|
+ });
|
|
|
+ } else if (this.curWareType === Consts.TYPE_VIDEO) {
|
|
|
+ let video = document.getElementById('hls-video');
|
|
|
+ if (video) {
|
|
|
+ document.getElementById('view-content').removeChild(video);
|
|
|
+ }
|
|
|
+ this.showScene(require('./VideoWareFullScreenScene.js'), {
|
|
|
+ isFull: true,
|
|
|
+ wareList: this.wareList,
|
|
|
+ curWareIndex: this.curWareIndex,
|
|
|
+ });
|
|
|
+ } else if (this.curWareType === Consts.TYPE_AUDIOBOOK) {
|
|
|
+ // 全屏前移除audio标签
|
|
|
+ let audio = document.getElementById('courseware-audio');
|
|
|
+ let controls = document.querySelector('.audio-controls');
|
|
|
+ if (audio) {
|
|
|
+ document.getElementById('view-content').removeChild(audio);
|
|
|
+ }
|
|
|
+ if (controls) {
|
|
|
+ document.getElementById('view-content').removeChild(controls);
|
|
|
+ }
|
|
|
+ this.showScene(require('./AudioWareFullScreenScene.js'), {
|
|
|
+ wareList: this.wareList,
|
|
|
+ curWareIndex: this.curWareIndex,
|
|
|
+ curAudioList: this.curAudioList,
|
|
|
+ curAudioIndex: this.curAudioIndex,
|
|
|
isDownload: this.isDownload,
|
|
|
- });
|
|
|
+ });
|
|
|
}
|
|
|
- this.postPlayRecord(this.cur_item_id, this.courseId);
|
|
|
- break;
|
|
|
- case 'view-previous':
|
|
|
- if (this.curWareType === Consts.TYPE_IMAGE && this.curImageIndex - 1 >= 0) {
|
|
|
- this.curImageIndex -= 1;
|
|
|
- this.renderImageView();
|
|
|
- }
|
|
|
- this.postPlayRecord(this.curWareId, this.courseId);
|
|
|
- break;
|
|
|
- case 'view-next':
|
|
|
- if (this.curWareType === Consts.TYPE_IMAGE && this.curImageIndex + 1 < this.curImageList.length) {
|
|
|
- this.curImageIndex += 1;
|
|
|
- this.renderImageView();
|
|
|
- }
|
|
|
- this.postPlayRecord(this.curWareId, this.courseId);
|
|
|
- break;
|
|
|
+ this.postPlayRecord(this.cur_item_id, this.courseId);
|
|
|
+ break;
|
|
|
+ case 'view-previous':
|
|
|
+ if (this.curWareType === Consts.TYPE_IMAGE && this.curImageIndex - 1 >= 0) {
|
|
|
+ this.curImageIndex -= 1;
|
|
|
+ this.renderImageView();
|
|
|
+ }
|
|
|
+ if (this.curWareType === Consts.TYPE_AUDIOBOOK && this.curAudioIndex - 1 >= 0) {
|
|
|
+ this.curAudioIndex -= 1;
|
|
|
+ this.renderAudioView();
|
|
|
+ }
|
|
|
+ this.postPlayRecord(this.curWareId, this.courseId);
|
|
|
+ break;
|
|
|
+ case 'view-next':
|
|
|
+ if (this.curWareType === Consts.TYPE_IMAGE && this.curImageIndex + 1 < this.curImageList.length) {
|
|
|
+ this.curImageIndex += 1;
|
|
|
+ this.renderImageView();
|
|
|
+ }
|
|
|
+ if (this.curWareType === Consts.TYPE_AUDIOBOOK && this.curAudioIndex + 1 < this.curAudioList.length) {
|
|
|
+ this.curAudioIndex += 1;
|
|
|
+ this.renderAudioView();
|
|
|
+ }
|
|
|
+ this.postPlayRecord(this.curWareId, this.courseId);
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|