VUE项目实现音乐播放器(四)------- 设计播放进度条 + 播放控制按钮

2020.3.31 9:18

好的,早上好各位,今天我们来进行一个很炫酷的页面开发——播放器控制页面( src\components\Play.vue ),如下图:

我们可以看到,该页面有很多元素组成,歌曲的封面、左上角的页面隐藏按钮,中间的播放进度条、歌词栏、下方的播放控制按钮、右下角的显示播放列表按钮,这些元素完美的结合在一起,整个页面有没有一种很高大上的感觉!好了,让我们来亲自动手实现它吧!

1、 歌曲封面&隐藏按钮

首先通过 getters 获取到歌曲的封面:

computed: {
  imgUrl: function() {
    return this.$store.getters.coverImgUrl                //PlayService.js 中的 Getters
  },
}

目前的 HTML 结构如下:

<div id="play" class="music-play-page">
  <div class="music-album">
    <div class="hide-icon">
      <img src="../assets/icon-jiantou.png">
    </div>
    <img v-lazy="imgUrl">
  </div>
 </div>

此时设置 CSS:

.music-play-page {
    width: 100%;
    max-width: 68vh;
    height: 100%;
    position: fixed;
    top: 0;
    z-index: 5;
  }

                  

你会发现,尽管根元素 设置了 width:100% ,但是歌曲的封面仍然只有一点,宽度根本没有填充到100%,上右图。没关系,只需要将 .music-album img 设置 width: 100% 即可,如上左图。

原因其实很简单,父元素 width 设置了 100%,但是子元素的内容并没有填充满100%,为了方便调试,我们在这种情况下,可以先设置 父元素 的背景颜色,比如蓝色,即可查看到父元素的 width 没有问题, 就会意识到 是 子元素 的 width 不够。

下一步,我们来实现播放进度条,效果如图:

实现起来很简单,关键点是我们需要一个 随歌曲的播放时间的更新,而不断更新的变量,作为 进度条指针移动 的参考, 我们将这个变量命名为: indicatorPosition,

首先在 Vuex 里获取 currentTime(歌曲播放当前时间) 和 duration(歌曲时长),两个变量的比,就是 indicatorPosition:

computed: {         //Vue计算属性
  ...mapState({
    indicatorPosition: state => state.PlayService.currentTime / state.PlayService.duration * 100,
  }),
}

有了 indicatorPosition,我们就可以进行下一步,在 组件中 添加 html:

<div class="progress-bar-group">  <div class="progress-bar">        //进度条及红色刻度
    <div class="progress" :style="{width:indicatorPosition+‘%‘}"></div>     //已播放部分进度条颜色加深
    <div class="indicater" :style="{left:indicatorPosition+‘%‘}"></div>     //红色刻度移动代码
  </div>
  <div class="time-indicater">
    <span>{{currentTime}}</span>   //当前时间
    <span>{{duration}}</span>      //歌曲时长
  </div>
</div>

由于QMplayer返回的时间是以秒为单位,我们需要在 PlayService.js 里将秒转化为 --分 : --秒的形式,Vuex 的 getters 就相当于 Vue 的 computed(计算属性)

getters: {
    currentTime: state =>
    parseInt(state.currentTime / 60) + ‘:‘ + (Array(2).join(0) + (state.currentTime % 60)).slice(-2) //Array(2).join(0) 表示两个数组元素,以0作为间隔,所以其输出为 ‘0’
    ,
    duration: state =>
    parseInt(state.duration / 60) + ‘:‘ + (Array(2).join(0) + (state.duration % 60)).slice(-2),
}

为进度条部分添加 CSS :

.progress-bar-group {
    height: 30px;
}

.progress-bar-group .progress-bar {
    height: 4px;
    background: #cccccc;
    position: relative;
}

.progress-bar-group .progress-bar .progress {
    height: 100%;
    background: #7f7f7f;
    /*width: 20%;*/
}

.progress-bar-group .progress-bar .indicater {
    position: absolute;
    width: 2px;
    height: 12px;
    background: #ff2d55;
    top: 0;
    /*left: 20%;*/
}

此时,我们的页面效果:

是不是已经有模有样了呢,很好,下一步我们接着完成播放控制按钮。

我们用列表元素,将五个 控制按钮陈列出来:

<div class="music-ctrl">
  <ul>
    <li><img src="../assets/icon-like.png"></li>
    <li><img src="../assets/icon-shangyiqu.png"></li>
    <li><img :src="playing?$parent.iconPause:$parent.iconPlay"></li>
    <li><img src="../assets/icon-xiayiqu.png"></li>
    <li><img src="../assets/icon-list.png"></li>
  </ul>
</div>

重点 CSS :

.music-ctrl ul li {
    float: left;        /*将按钮排列成一行*/
    width: 20%;         /*设置每个 按钮 宽度均等*/
    height: 100%;
  }

.music-ctrl ul li img {
    display: block;
    width: 35px;       /*设置每个按钮大小*/
    margin: 0 auto;    /*设置每个按钮相对父元素框 居中显示*/
  }

为 播放上一曲 按钮添加 事件点击:

<li><img src="../assets/icon-shangyiqu.png"
         @touchend.prevent="playFront"
         @click="playFront"></li>

PlayService.js 添加 mutations :

playFront (state) {
  state.index = (state.index - 1 + state.playList.length) % state.playList.length
  state.song = state.playList[state.index]
  player.play(state.song.mid);},

好了,到这里我们的 播放界面基本完成,效果图:

还是很炫酷的。

原文地址:https://www.cnblogs.com/Fcode-/p/12603125.html

时间: 2024-10-08 04:11:23

VUE项目实现音乐播放器(四)------- 设计播放进度条 + 播放控制按钮的相关文章

[课程设计]任务进度条&amp;开发日志目录

[课程设计]任务进度条&开发日志目录 任务进度条&开发日志目录         周    期          时     间       任       务   Sprint One    11.14     ●  Scrum团队分工及明确任务1.0    Sprint One     11.15      ● Sprint One    11.16     ● Sprint One    11.17     ●

如何写一个正经的音乐播放器 四 意外情况

四,意外情况的控制. 在音频播放时候,容易遇到一些意外情况,这时候,我们就要处理这些意外情况,这时候,我们需要针对不同的意外情况进行处理.大概可以分成两种情况. 1,失去audio_focus的控制. 造成我们的播放器失去焦点的情况很多,主要是其他声音请求了焦点,例如说,其他音乐播放器开始播放音乐,突然来电,短息等. 以上的焦点失去,都可以用AudioManager.OnAudioFocusChangeListener中的回调来处理.先取得AudioManager AudioManager au

ios开发:一个音乐播放器的设计与实现

github地址:https://github.com/wzpziyi1/MusicPlauer 这个medo,关于歌曲播放的主要功能都实现了的.下一曲.上一曲,暂停,根据歌曲的播放进度动态滚动歌词,将当前正在播放的歌词放大显示,拖动进度条,歌曲跟着变化,并且使用Time Profiler进行了优化,还使用XCTest对几个主要的类进行了单元测试. 已经经过真机调试,在真机上可以后台播放音乐,并且锁屏时,显示一些主要的歌曲信息. 首页: 歌曲内部播放: 当拖动小的进度条的时候,歌曲也会随之变化.

linux下播放器的设计和开发

本文根据DawnLightPlayer的开发经验写成.DawnLithtPlayer是今天3月份开始,和maddrone一起在业余时间开发的一个跨平台,多线程的播放器,主要是在Linux下面开发的,文中所用示例代码均截自其中.DawnLightPlayer目前可以运行在Linux和Windows系统上,并使用VC和Python开发了GUI,支持大部分的音视频文件格式和网络流,另外新增对CMMB协议的支持,不支持 RMVB, SWF 等尚未公开协议的视频文件格式. 目录:一. 播放器的流程   1

基于&lt;MediaElement&gt;的WPF视频播放器(可拖拽进度条播放)

一.前言       前两天上峰要求做一个软件使用向导,使用WPF制作.这不,这两天从一张白纸开始学起,做一个播放演示视频的使用向导.以下是粗设计的原型代码: 二.效果图 三.代码 前台代码: 1 <Window 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

videojs修改播放器样式并实现四路动态播放rtmp流视频

接了个无人机的项目,负责视频播放这一块,选用的是video.js这个视频插件,本以为可以开开心心的开发,谁怎料网上有关这部分的资料如此之少,给我这个伸手党给予了重大压力.好了,不说废话了. 项目的需求为实现一个能四路播放的播放器,能播放无人机拍摄的实时画面,并且能够做到局部刷新而不影响整个页面,并且要能够动态的切换视频流的来源,比方说有一架无人机在你播放视频时起飞了,那么你所能切换的视频流中就应该具备该无人机的rtmp流. 实现过程,化大为小,不断迭代,先实现一路播放,再扩展为四路,再实现无刷新

html5播放器 —— willesPlay.js,支持手机播放

之前介绍了不少视频播放器,但是很多是基于flash的,现在已经很明显,flash被很彻底的干掉了,收藏一两个html5播放器 (可以手机播放,手机都支持html5),以备做项目之需. 源码地址 https://www.html5tricks.com/download/html5-video-player-mobile.rar 原文地址:http://blog.51cto.com/13710865/2105405

android 项目学习随笔十六( 广告轮播条播放)

广告轮播条播放 if (mHandler == null) {//在此初始化mHandler , 保证消息不重复发送 mHandler = new Handler() { public void handleMessage(android.os.Message msg) { int currentItem = mViewPager.getCurrentItem(); if (currentItem < mTopNewsList.size() - 1) { currentItem++; } els

openCV1.0 播放AVI视频并实现进度条

#include "cv.h"#include "highgui.h" int g_slider_position = 0;CvCapture* g_capture = NULL; void onTrackbarSlide(int pos) { cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);} int main(int argc, char **argv){ cvNamedWindow(&q