Implemented in the WeChat applet——【Music Player】

Article Directory

1. Learning objectives

1. Master the use of swiper components and scroll-view components

2. Master the use of image components

3. Master the use of audio API

4. Master the use of slider components

2. Preparation before development

Music applet project effect display:
insert image description here

1. Page structure diagram

tab navigation bar
content content area
player music playback control
insert image description here

2. Project initialization

Developer tools create a blank project:

{"pages:["pages/index/index"
]
}

“navigationBarBackgroudColor”:"#fff,
“navigationBartitletext”:“音乐,”
“navigationBarBackgroudColor”:“black”,
insert image description here

3. Task Analysis

Tabs and pages info.wxml, play.wxml, palylist.wxml

4. Preliminary knowledge

The swiper component writes the sliding page structure

<swiper>
<swiper-item style="background:#ccc">0</swiper-item>
<swiper-item style="background:#ddd">1</swiper-item>
<swiper-item style="background:#eee">2</swiper-item>
</swiper-item>

The swiper component writes the sliding page structure index.wxml:

<swiper current-item-id="c">
< swiper-item item-id="a"> <image
src= "https://assets.lexus.com.cn/images/index/kv/2880x1480. newes. 1.jpg?x-Oss-
process=image/resize,w. 1898/quality.q. 80" mode= "widthFix" > </image> </swiper-item>
<swiper-item item-id="b"> <image src= https://assets.exus.com.cn/images/models/s/s -kv-1 2880.jpg?x-oss-
process=image/resize,w. 1898/quality.q. 80" mode= "widthFix" > </image> </swiper-item>
<swiper-item item-id="c"> <image src="https://assets.lexus.com.cn/images/index/kv/ux. 300e-kv-1-2880.jpg?x-
oss-process= image/resize,w 1898/quality,q 80" mode="widthFix"> </image> </swiper-item>
</swiper>

The swiper component writes the sliding page structure index.wxss:

image{
width:100%;
}

The main purpose of include:
1. Split the code into multiple files, making it easier to find the code.
2. Extract the common part of the code. Introduced via external files.

<include src="header.wxml />
<view>body</view>
<include src="footer.wxml " />

insert image description here

3. Tab switching

1. Page and style:

<view class="tab>
<view class="tab-item">音乐推荐</view>
</view>
<!---内容区域--->
<view class="content"></view>
<!---底部播放器--->
<view class="player"></view>

2. The basic page and style of the music applet:

<!--标签页标题-->
<view class=" tab">
<view class= "tab-item {
   
   {tab==0? active':' }}" bindtap=”changeItem"
data-item= "0" >音乐推荐< /view>
<view class=”tab item {
   
   {tab== 1? actie':"}}" bindtap=”changeItem”
data-item="1" >播放器< /view>
<view class=”tab item {
   
   {tab== 2? actie':"}}" bindtap=”changeItem”
data-item= "2" >播放列表< /view>
< /view>

Please add a picture description

Pages and styles:
insert image description here

3. The style of page and style tab navigation:

Please add a picture description
Tab navigation effect:

insert image description here

4. Test page info.wxml, page.wxml, play.wxml files:

<view style= "background:#ddd; color:#000; h
eight:100%"> play </view>
<view style= "background:#ccc; color:#000; he
ight:100%" > info< /view>
<view style= "background:#eee; color:#00O; he
ight:100%" > playlist</view>

Realize tab page switching
Click the navigation bar tab to realize tab page switching:

<view class="tab-item {
   
   {tab==0?'a
ctive':'}}"
bindtap=" changeltem" data-item
="0">
音乐推荐< /view>
changeltem: function(e) {
this.setData({
item: e.target.dataset.item,
tab:e.target.dataset.item
}},

Tab switching style

.tab -item.active {
color: #c25b5b;
border- bottom-color: #c25b5b;

5. Switch page effects by scrolling time

< swiper current= "{item}" bindchange="c
hangeTab"> 
< swiper- item>
<include src = ../index/info" > </include>
</swiper-item>
< swiper- item>
<include src= ../index/play" > </include>
</swiper-item>
< swiper- item>
<include src=”./index/playlist" > </include>
</swiper-item>
</swiper>

(1) Scroll event

change Tab: function(e) {
this.setData({
tab: e.detail.current
.tab-item.active {
color: #c25b5b;
border- bottom-color: #c25b5b;}

(2) Switch page effects through scrolling events:

insert image description here

4. Music recommendation

1. Properties and description of the scroll-view component:

< scroll-view scroll-x scroll-y style="hei
ght:200px" bindscroll- "scroll">
<view style ="width:200%;height:400p
x;background:#ccc" > </view>
</scroll-view>
scroll: function(e) {
console.log(e.detail)
},

insert image description here

2. Image component scaling mode and cropping mode test:

content area scrolling

(1) scroll-view component:

< scroll-view class= "content-info" scroll-y>
<view style= "background:#eee;height:10
00px" > </view>
<view>已到达底部< /view>
< /scroll-view>

insert image description here

3. The swiper component realizes the carousel image:

<swiper class="content-info-slide" indicator-color="rgba(255,255,255,.5)" indicator-active-color="#fff" indicator-dots circular autoplay>
    <swiper-item>
      <image src="/images/banner.jpg" />
    </swiper-item>
    <swiper-item>
      <image src="/images/banner.jpg" />
    </swiper-item>
    <swiper-item>
      <image src="/images/banner.jpg" />
    </swiper-item>
  </swiper>

insert image description here
insert image description here

4. Flex layout implements function buttons:

<view class="content-info-portal">
    <view>
      <image src="/images/04.png" />
      <text>私人FM</text>
    </view>

insert image description here

(1) Flex layout realizes function buttons:

.content-info-portal {
  display: flex;
  margin-bottom: 15px;
}
.content-info-portal > view {
  flex: 1;
  font-size: 11pt;
  text-align: center;
}
.content-info-portal image {
  width: 120rpx;
  height: 120rpx;
  display: block;
  margin: 20rpx auto;
}

insert image description here

(2) Flex layout realizes page layout:

  <view class="content-info-list">
    <view class="list-title">推荐歌曲</view>
    <view class="list-inner">
      <view class="list-item">
        <image src="/images/cover.jpg" />
        <view>紫罗兰</view>
      </view>

insert image description here
hit music

.content-info-list > .list-inner > .list-item {
  flex: 1;
}
.content-info-list > .list-inner > .list-item > image {
  display: block;
  width: 200rpx;
  height: 200rpx;
  margin: 0 auto;
  border-radius: 10rpx;
  border: 1rpx solid #555;
}
.content-info-list > .list-inner > .list-item > view {
  width: 200rpx;
  margin: 10rpx auto;
  font-size: 10pt;
}

insert image description here

5. Play at the bottom of the index page

<!-- 底部播放器 -->
<view class="player">
  <image class="player-cover" src="{
   
   {play.coverImgUrl}}" />
  <view class="player-info">
    <view class="player-info-title">{
   
   {play.title}}</view>
    <view class="player-info-singer">{
   
   {play.singer}}</view>
  </view>
  <view class="player-controls">
    <!-- 切换到播放列表 -->
    <image src="/images/01.png" bindtap="changePage" data-page="2" />
    <!-- 播放或暂停 -->
    <image wx:if="{
   
   {state=='paused'}}" src="/images/02.png" bindtap="play" />
    <image wx:else src="/images/02stop.png" bindtap="pause" />
    <!-- 下一曲 -->
    <image src="/images/03.png" bindtap="next" />
  </view>
</view>

insert image description here

insert image description here

.player {
  display: flex;
  align-items: center;
  background: #222;
  border-top: 1px solid #252525;
  height: 112rpx;
}

.player-cover {
  width: 80rpx;
  height: 80rpx;
  margin-left: 15rpx;
  border-radius: 8rpx;
  border: 1px solid #333;
}



insert image description here

.player-info {
  flex: 1;
  font-size: 10pt;
  line-height: 38rpx;
  margin-left: 20rpx;
  padding-bottom: 8rpx;
}

.player-info-singer {
  color: #888;
}

.player-controls image {
  width: 80rpx;
  height: 80rpx;
  margin-right: 15rpx;
}


insert image description here

5. Player

1. The way of audioctx object declaration:

var  audioctx = wx.createInnerAudioContext();

(1) InnerAudioContext case use:

onReady: function() {
var audioCtx = wx.createInnerAudioContext(
audioCtx.src = htt.:/....x.o.
audioCtx.onPlay(function() {
console.log('开始播放')
})
...
},

(2) Use of the slider component:

<slider bindchanging = "sliderChangeing" show-value />
sliderChanging:function(e){
console.log(e.detail.value)
},

insert image description here

(3) Music playlist and music status data:

   playlist: [{
      id: 1,
      title: '钢琴协奏曲',
      singer: '肖邦',
      src: 'http://localhost:3000/1.mp3',
      coverImgUrl: '/images/cover.jpg'
    },

insert image description here

(4) Realize music playback function

Music playback logic code:

 audioCtx: null,
  onReady: function() {
    this.audioCtx = wx.createInnerAudioContext()
    // 默认选择第1曲
    this.setMusic(0)
    var that = this
    // 播放进度检测
    this.audioCtx.onError(function() {
      console.log('播放失败:' + that.audioCtx.src)
    })
    // 播放完成自动换下一曲
    this.audioCtx.onEnded(function() {
      that.next()
    })
    // 自动更新播放进度
    this.audioCtx.onPlay(function() {})
    this.audioCtx.onTimeUpdate(function() {
      that.setData({
        'play.duration': formatTime(that.audioCtx.duration),
        'play.currentTime': formatTime(that.audioCtx.currentTime),
        'play.percent': that.audioCtx.currentTime / that.audioCtx.duration * 100
      })
    })
    // 格式化时间
    function formatTime(time) {
      var minute = Math.floor(time / 60) % 60;
      var second = Math.floor(time) % 60
      return (minute < 10 ? '0' + minute : minute) + ':' + (second < 10 ? '0' + second : second)
    }
  },
  // 音乐播放
  setMusic: function(index) {
    var music = this.data.playlist[index]
    this.audioCtx.src = music.src
    this.setData({
      playIndex: index,
      'play.title': music.title,
      'play.singer': music.singer,
      'play.coverImgUrl': music.coverImgUrl,
      'play.currentTime': '00:00',
      'play.duration': '00:00',
      'play.percent': 0
    })
  },

(5) The structural code of the bottom player:

<!-- 底部播放器 -->
<view class="player">
  <image class="player-cover" src="{
   
   {play.coverImgUrl}}" />
  <view class="player-info">
    <view class="player-info-title">{
   
   {play.title}}</view>
    <view class="player-info-singer">{
   
   {play.singer}}</view>
  </view>

insert image description here

Style code for bottom player:

.player {
  display: flex;
  align-items: center;
  background: #222;
  border-top: 1px solid #252525;
  height: 112rpx;
}

insert image description here

(6) The bottom player pause/play button controls the song:

   <image wx:if="{
   
   {state=='paused'}}" src="/images/02.png" bindtap="play" />
    <image wx:else src="/images/02stop.png" bindtap="pause" />

insert image description here

(7) Realize that the player switches to the next song:


    <image src="/images/03.png" bindtap="next" />
 next: function() {
    var index = this.data.playIndex >= this.data.playlist.length - 1 ? 0 : this.data.playIndex + 1
    this.setMusic(index)
    if (this.data.state === 'running') {
      this.play()
    }
  },

insert image description here

(8) Player page structure code:

<view class="content-play">
  <!-- 显示音乐信息 -->
  <view class="content-play-info">
    <text>{
   
   {play.title}}</text>
    <view>—— {
   
   {play.singer}} ——</view>
  </view>

insert image description here

6. Player

<!-- 播放器 -->
<view class="content-play">
  <!-- 显示音乐信息 -->
  <view class="content-play-info">
    <text>{
   
   {play.title}}</text>
    <view>—— {
   
   {play.singer}} ——</view>
  </view>
  <!-- 显示专辑封面 -->
  <view class="content-play-cover">
    <image src="{
   
   {play.coverImgUrl}}" style="animation-play-state:{
   
   {state}}" />
  </view>
  <!-- 显示播放进度和时间 -->
  <view class="content-play-progress">
    <text>{
   
   {play.currentTime}}</text>
    <view>
      <slider bindchange="sliderChange" activeColor="#d33a31" block-size="12" backgroundColor="#dadada" value="{
   
   {play.percent}}" />
    </view>
    <text>{
   
   {play.duration}}</text>
  </view>
</view>

insert image description here
insert image description here

1. Player style 1

.content-play {
  display: flex;
  justify-content: space-around;
  flex-direction: column;
  height: 100%;
  text-align: center;
}

.content-play-info > view {
  color: #888;
  font-size: 11pt;
}

insert image description here

2. Realize the rotation function of the poster through CSS3 animation:

  <!-- 显示专辑封面 -->
  <view class="content-play-cover">
    <image src="{
   
   {play.coverImgUrl}}" style="animation-play-state:{
   
   {state}}" />
  </view>

insert image description here

3. The slider structure at the bottom of the player page:

   <slider bindchange="sliderChange" activeColor="#d33a31" block-size="12" backgroundColor="#dadada" value="{
   
   {play.percent}}" />

insert image description here

3. Display the progress of music playback:

  onReady: function() {
    this.audioCtx = wx.createInnerAudioContext()
    // 默认选择第1曲
    this.setMusic(0)
    var that = this
    // 播放进度检测
    this.audioCtx.onError(function() {
      console.log('播放失败:' + that.audioCtx.src)
    })
    // 播放完成自动换下一曲
    this.audioCtx.onEnded(function() {
      that.next()
    })

4. Control the length of the progress bar to control the playback progress of the song:

< slider
bindchange= "sliderChange"
activeColor= " #d33a31 
block- size=”12"
backgroundColor= " #dadada"
value= "{
   
   {play.percent}}" />
sliderChange: function(e) {
var second = e.detail.value
*
this.audioCtx.duration / 100
this.audioCtx.seek(second)
},

Control the length of the progress bar to control the playback progress of the song:

<scroll-view class="content-playlist" scroll-y>
  <view class="playlist-item" wx:for="{
   
   {playlist}}" wx:key="id" bindtap="change" data-index="{
   
   {index}}">
    <image class="playlist-cover" src="{
   
   {item.coverImgUrl}}" />
    <view class="playlist-info">
      <view class="playlist-info-title">{
   
   {item.title}}</view>
      <view class="playlist-info-singer">{
   
   {item.singer}}</view>
    </view>
    <view class="playlist-controls">
      <text wx:if="{
   
   {index==playIndex}}">正在播放</text>
    </view>
  </view>
</scroll-view>

insert image description here

7. Playlist

1. Control the length of the progress bar to control the playback progress of the song:

.playlist-item {
display: flex;
align-items:
center;
border- bottom: 1rpx solid #333;
height: 112rpx;
}
...

insert image description here

2. Realize the song changing function:

change:function(e){
this.setMusic(e.currentTarget.dateset.index)
this.play()
},

insert image description here
insert image description here

Guess you like

Origin blog.csdn.net/py20010218/article/details/128263602