WY音乐播放器制作(2)

首页完善

实现效果

首页

详情页

最新专辑和歌单详情差不多,可以封装成一个组件

详情页

头部功能

  1. 换肤换背景,前面写过
  2. 可返回,back
头部

中间图片功能:

  1. 下拉图片变大
  2. 上拉图片变模糊
  3. 注意:高斯模糊效果十分消耗性能的,不推荐使用,非要使用,建议只设置一次
if (offsetY < 0) {
  // 向上滚动,图片变淡
  let opacity = Math.abs(offsetY) / defaultHeight;
  this.$refs.top.changeMask(opacity);
  // let scale = 1 + Math.abs(offsetY) / defaultHeight;
  // this.$refs.top.$el.style.filter = `blur(${scale}px)`
} else {
  // 向上滚动,图片变大
  let scale = 1 + offsetY / defaultHeight;
  this.$refs.top.$el.style.transform = `scale(${scale})`;
}

底部播放列表功能

播放列表
  1. 实现滚动效果

    使用自己编写的滚动组件
    <ScrollView ref="scrollView">
     <DetailBottom :tracks="tracks" />
    </ScrollView>
    
  1. 点击某一首歌,跳转到播放界面,歌曲详情展示

    // 映射Actions
    ...mapActions(["setFullScreen", "setSongDetail"])
        
    selectMusic(id) {
        // 修改vuex的数据,展示全局的播放器并且请求数据、渲染数据
       this.setFullScreen(true);
       this.setSongDetail([id]);
    }
    
  1. 点击播放全部,跳转到播放界面,默认播放第一首

    selectAllMusic() {
      this.setFullScreen(true);
      let ids = this.tracks.map(item => item.id);
      this.setSongDetail([ids]);
    }
    

主播放界面

播放界面

使用插件:vue-awesome-swiper

头部封装,点击向下箭头,能关闭主播放界面

头部
...mapActions(["setFullScreen", "setMiniPlayer"]),
hiddenNormalPlayer() {
  this.setFullScreen(false);
  this.setMiniPlayer(true);
}

中间,可左滑,切换成歌词界面

左边
右边
  1. 搭建vue-awesome-swiper结构(三层结构)

    <template>
      <swiper :options="swiperOption" class="PlayerMiddle">
        <swiperSlide class="cd">
        </swiperSlide>
        <swiperSlide class="lyric">
          <ScrollView>
            <ul>
            </ul>
          </ScrollView>
        </swiperSlide>
        <div class="swiper-pagination" slot="pagination"></div>
      </swiper>
    </template>
    
    import { Swiper, SwiperSlide } from "vue-awesome-swiper";
    import "swiper/css/swiper.css";
    
  2. vue-awesome-swiper配置

      data() {
        return {
          swiperOption: {
            // 分页器
            pagination: {
              el: ".swiper-pagination",
              bulletClass: "my-bullet", // 自定义默认类名
              bulletActiveClass: "my-bullet-active" // 自定义默认类名
            },
            // 异步加载
            observer: true,
            observeParents: true,
            observeSlideChildren: true
          }
        };
      }
    
  3. 踩坑:前面已经使用过vue-awesome-swiper默认激活的类名,这里要自定义类名

    并且style不能加 scoped 属性,建议新建一个style标签

设置播放键切换(watch,vuex)

底部
  1. 进度条设置

        <div class="bottom-progress">
          <span>00:00</span>
          <div class="progress-bar">
            <div class="progress-line">
              <div class="progress-dot"></div>
            </div>
          </div>
          <span>00:00</span>
        </div>
    
  2. 点击图标切换

    // vuex设置全局的播放状态
    import { mapGetters, mapActions } from "vuex";
      methods: {
        ...mapActions(["setIsPlaying", "setModeType"]),
        play() {
            // 播放暂停切换
          this.setIsPlaying(!this.isPlaying);
        },
        mode() {
            // 循环模式的切换
          if (this.modeType === modeType.loop) {
            this.setModeType(modeType.one);
          } else if (this.modeType === modeType.one) {
            this.setModeType(modeType.random);
          } else if (this.modeType === modeType.random) {
            this.setModeType(modeType.loop);
          }
        }
      },
      computed: {
        ...mapGetters(["isPlaying", "modeType"])
      }
    
    /**************************改变图标*****************************/
    // 通过类名
      watch: {
        isPlaying(newValue, oldValue) {
          if (newValue) {
            this.$refs.play.classList.add("active");
          } else {
            this.$refs.play.classList.remove("active");
          }
        },
        modeType(newValue, oldValue) {
          if (newValue === modeType.loop) {
            this.$refs.mode.classList.remove("random")
            this.$refs.mode.classList.add("loop")
          } else if (newValue === modeType.one) {
            this.$refs.mode.classList.remove("loop")
            this.$refs.mode.classList.add("one")
          } else if (newValue === modeType.random) {
            this.$refs.mode.classList.remove("one")
            this.$refs.mode.classList.add("random")
          }
        }
      }
    
    

列表播放器

  1. 使用插件: velocity-animate

    使用Vue动画

播放列表
  1. 播放模式和主要播放器同步

    前面一样的功能: 通过watch观察模式/播放的状态,在同步到vuex中

  2. velocity-animate的使用

    // 导入
    import Velocity from "velocity-animate";
    import "velocity-animate/velocity.ui";
    // 使用
    /** 
    * el:元素 Dom,
    * 第二个参数: 动画名称 String
    * 第三个参数: 动画配置
    * 第四个参数: 回调函数
    */
    Velocity(el, "transition.perspectiveUpIn", { duration: 500 }, function() {});
    
  3. velocity-animate配合Vue自定义动画使用

      <transition :css="false" @enter="enter" @leave="leave">
          内容
      </transition>
    
    
     methods: {
         // 进入动画
       // done 调用该函数,告诉vue,该动画执行完毕
       enter(el, done) {
         Velocity(el, "transition.perspectiveUpIn", { duration: 500 }, function() {
           done();
         });
       },
       leave(el, done) {
         Velocity(
           el,
           "transition.perspectiveUpOut",
           { duration: 500 },
           function() {
             done();
           }
         );
       },
    }
    
  4. 踩坑:歌曲列表不能滚动

    原因:一开始就初始化,但是数据后面过来,导致高度不正确

    解决:IScroll中的refresh()刷新高度

    // ScrollView 组件
      methods: {
        // 重新获取高度
        refresh() {
            // 停留100ms刷新
          setTimeout(() => {
            this.iscroll.refresh();
          }, 100);
        }
      },
    
    // 列表播放组件,每次数据变化,刷新高度
    watch: {
       isShowListPlayer(newValue, oldValue) {
          if (newValue) {
            // 刷新高度
            this.$refs.ScrollView.refresh();
          }
        }
     }
    
  5. 删除所有歌曲后,退出该列表播放器、主播放器、底部播放器

    // 通过设置vue的state属性,来清空列表
    delAll() {
        this.setDelSong();
    }
    
      // 播放列表删除歌曲
      [SET_DEL_SONG](state, index) {
        if (index !== undefined) {
          state.songs.splice(index, 1)
        } else {
          // 清空
          state.songs = []
        }
        if (state.songs.length === 0) {
          state.isFullScreen = false,
            state.isShowMiniPlayer = false,
            state.isShowListPlayer = false
        }
      }
    
  6. 有坑:删除所有歌曲后,页面报错

    原因:每次列表歌曲变化,去设置当前播放歌曲的详情,删除完后,没有歌曲去获取详情

    解决:修改监听歌曲变化的函数

    // 主播放界面  
    // 只要歌曲一变化,就切换歌词
      watch: {
        currentSong(newValue, oldValue) {
          if (newValue.id === undefined) {
              // 没有歌曲时,不操作
            return;
          }
            // 切换歌词
          this.setSongLyric(newValue.id);
        }
      }
    
END
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容