|
@@ -1,4 +1,4 @@
|
|
|
-import { defineComponent, onMounted, reactive, ref, onUnmounted } from 'vue';
|
|
|
+import { defineComponent, onMounted, reactive, ref, onUnmounted, watch } from 'vue';
|
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
|
import { browser } from "@/helpers/utils"
|
|
|
import styles from './index.module.less';
|
|
@@ -11,6 +11,7 @@ import backImg from "../images/back.png";
|
|
|
import {
|
|
|
postMessage
|
|
|
} from '@/helpers/native-message';
|
|
|
+import { usePageVisibility } from '@vant/use';
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'playCreation',
|
|
@@ -24,11 +25,25 @@ export default defineComponent({
|
|
|
const playType = resourceUrl.lastIndexOf('mp4') !== -1 ? 'Video' : 'Audio'
|
|
|
const lottieDom = ref()
|
|
|
const landscapeScreen = ref(false)
|
|
|
+ let _plrl:any
|
|
|
+ const loaded = ref(false)
|
|
|
+ const { registerDrag, unRegisterDrag } = landscapeScreenDrag()
|
|
|
+ watch(landscapeScreen, ()=>{
|
|
|
+ if(landscapeScreen.value){
|
|
|
+ registerDrag()
|
|
|
+ }else{
|
|
|
+ unRegisterDrag()
|
|
|
+ }
|
|
|
+ })
|
|
|
function initPlay(){
|
|
|
const id = playType === "Audio" ? "#audioMediaSrc" : "#videoMediaSrc";
|
|
|
- const _plrl = new Plyr(id, {
|
|
|
+ _plrl = new Plyr(id, {
|
|
|
controls: ["play-large", "play", "progress", "current-time", "duration"]
|
|
|
});
|
|
|
+ // 在微信中运行的时候,微信没有开放自动加载资源的权限,所以要等播放之后才显示播放控制器
|
|
|
+ _plrl.on('loadedmetadata', () => {
|
|
|
+ loaded.value = true
|
|
|
+ });
|
|
|
// 创建音波数据
|
|
|
if(playType === "Audio"){
|
|
|
const audioDom = document.querySelector("#audioMediaSrc") as HTMLAudioElement
|
|
@@ -44,7 +59,61 @@ export default defineComponent({
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
- /**
|
|
|
+ // 注册 横屏时候的自定义拖动事件 解决旋转时候拖动进度条坐标的问题
|
|
|
+ function landscapeScreenDrag() {
|
|
|
+ let progressBar: HTMLElement
|
|
|
+ function onDown(e: MouseEvent | TouchEvent) {
|
|
|
+ e.preventDefault();
|
|
|
+ e.stopPropagation();
|
|
|
+ // 记录拖动之前的状态
|
|
|
+ const playing = _plrl.playing
|
|
|
+ _plrl.pause()
|
|
|
+ const isTouchEv = isTouchEvent(e);
|
|
|
+ const event = isTouchEv ? e.touches[0] : e;
|
|
|
+ setProgress(event)
|
|
|
+ function onUp() {
|
|
|
+ document.removeEventListener(
|
|
|
+ isTouchEv ? 'touchmove' : 'mousemove',
|
|
|
+ onMove
|
|
|
+ );
|
|
|
+ document.removeEventListener(isTouchEv ? 'touchend' : 'mouseup', onUp);
|
|
|
+ playing && _plrl.play() // 之前是播放状态 就播放
|
|
|
+ }
|
|
|
+ function onMove(e: MouseEvent | TouchEvent){
|
|
|
+ e.preventDefault();
|
|
|
+ e.stopPropagation();
|
|
|
+ const event = isTouchEvent(e) ? e.touches[0] : e;
|
|
|
+ setProgress(event)
|
|
|
+ }
|
|
|
+ function setProgress(event: MouseEvent | Touch) {
|
|
|
+ const {top, height} = progressBar.getBoundingClientRect();
|
|
|
+ const progress = (event.clientY - top) / height;
|
|
|
+ const progressNum = Math.min(Math.max(progress, 0), 1);
|
|
|
+ _plrl.currentTime = progressNum * _plrl.duration
|
|
|
+ }
|
|
|
+ document.addEventListener(isTouchEv ? 'touchmove' : 'mousemove', onMove);
|
|
|
+ document.addEventListener(isTouchEv ? 'touchend' : 'mouseup', onUp);
|
|
|
+ }
|
|
|
+ function registerDrag() {
|
|
|
+ if(!progressBar){
|
|
|
+ progressBar = document.querySelector('#landscapeScreenPlay .plyr__progress__container') as HTMLElement;
|
|
|
+ }
|
|
|
+ progressBar.addEventListener('mousedown', onDown);
|
|
|
+ progressBar.addEventListener('touchstart', onDown);
|
|
|
+ }
|
|
|
+ function unRegisterDrag() {
|
|
|
+ progressBar.removeEventListener('mousedown', onDown);
|
|
|
+ progressBar.removeEventListener('touchstart', onDown);
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ registerDrag,
|
|
|
+ unRegisterDrag
|
|
|
+ }
|
|
|
+ }
|
|
|
+ function isTouchEvent(e: MouseEvent | TouchEvent): e is TouchEvent {
|
|
|
+ return window.TouchEvent && e instanceof window.TouchEvent;
|
|
|
+ }
|
|
|
+ /**
|
|
|
* 音频可视化
|
|
|
* @param audioDom
|
|
|
* @param canvasDom
|
|
@@ -72,7 +141,8 @@ export default defineComponent({
|
|
|
fillCanvasBackground(ctx, w, h, canvFillColor)
|
|
|
// 可视化
|
|
|
const dataLen = data.length
|
|
|
- const step = (w / 2 - lineGap * dataLen) / dataLen
|
|
|
+ let step = (w / 2 - lineGap * dataLen) / dataLen
|
|
|
+ step < 1 && (step = 1)
|
|
|
const midX = w / 2
|
|
|
const midY = h / 2
|
|
|
let xLeft = midX
|
|
@@ -157,15 +227,24 @@ export default defineComponent({
|
|
|
}
|
|
|
}
|
|
|
function updateLandscapeScreenState(){
|
|
|
- if(window.innerWidth > window.innerHeight){
|
|
|
- landscapeScreen.value = false
|
|
|
- }else{
|
|
|
- landscapeScreen.value = true
|
|
|
- }
|
|
|
+ // 下一帧 计算 横竖屏切换太快 获取的宽高不准
|
|
|
+ requestAnimationFrame(()=>{
|
|
|
+ if(window.innerWidth > window.innerHeight){
|
|
|
+ landscapeScreen.value = false
|
|
|
+ }else{
|
|
|
+ landscapeScreen.value = true
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
- handlerLandscapeScreen()
|
|
|
+ const pageVisibility = usePageVisibility();
|
|
|
+ watch(pageVisibility, value => {
|
|
|
+ if (value === 'hidden') {
|
|
|
+ _plrl?.pause();
|
|
|
+ }
|
|
|
+ });
|
|
|
onMounted(()=>{
|
|
|
initPlay()
|
|
|
+ handlerLandscapeScreen()
|
|
|
})
|
|
|
onUnmounted(()=>{
|
|
|
if(isApp){
|
|
@@ -180,7 +259,7 @@ export default defineComponent({
|
|
|
}
|
|
|
})
|
|
|
return () =>
|
|
|
- <div class={[styles.playCreation,landscapeScreen.value && styles.landscapeScreen]}>
|
|
|
+ <div id="landscapeScreenPlay" class={[styles.playCreation,landscapeScreen.value && styles.landscapeScreen,!loaded.value && styles.notLoaded]}>
|
|
|
<div class={styles.backBox}>
|
|
|
<img class={styles.backImg} src={backImg}onClick={handlerBack} />
|
|
|
<div class={styles.musicDetail}>
|