小程序 - 音乐播放器

微信小程序常用API练习 - 音乐播放器小程序开发笔记

目录

音乐播放器

准备工作

创建项目

配置导航栏

资源文件准备

服务器准备

音乐播放器首页

首页页面

音乐推荐页

播放器页面

播放列表

首页样式

首页脚本实现

功能截图

总结


音乐播放器

“音乐播放器”微信小程序可以让用户随时随地享受音乐,给用户带来了便捷的音乐体验,且支持后台播放,用户可以在听音乐的同时进行其他操作。下面将对“音乐播放器”微信小程序进行详细讲解。只是简单的实现音乐播放和推荐音乐列表渲染及音乐播放列表渲染。

准备工作

在开发本案例前,需要先完成一些准备工作,主要包括创建项目、配置页面、配置导航栏、复制素材和启动服务器,具体步骤如下。

创建项目

在微信开发者工具创建一个新的小程序项目,名称为“音乐播放器”,选择“不使用模板”。

配置页面

本项目需要配置多个页面,配置页面如下:

实际只有一个页面,即pages/index/index页面,整体的页面结构在index.wxml文件中编写。

由于内容区域中3个标签页的内容较多,为了避免页面嵌套层级过多,

所以拆分到info.wxml、play.wxml、playlist.wxml文件中,使代码容易阅读、便于维护。 

配置导航栏

在pages/index/index.json文件中配置页面导航栏,具体代码如下。

{"usingComponents": {"navigation-bar": "/components/navigation-bar/navigation-bar"},"navigationBarTitleText": "音乐","navigationBarBackgroundColor": "#17181a","navigationBarTextStyle": "white"
}

资源文件准备

本项目所需图片文件,需创建images文件夹,包含:

banner图切换图片

功能按钮图片

歌曲封面图片

服务器准备

因为本地服务器,所以设置不检验域名。

我采用的是apache+php。在项目路径下创建music文件夹,

准备4个mp3音乐文件,等待音乐播放器访问。

音乐播放器首页

音乐播放器的结构上分为:首页结构、音乐推荐、播放器、播放器列表四个页面。

首页页面

在pages/index/index.wxml文件中,设置标签、标签页、播放器等内容。

具体代码如下:

<!--index.wxml-->
<navigation-bar title="音乐" back="{{false}}" color="white" background="#17181a"></navigation-bar>
<view class="tab"><view class="tab-item {{ tab == 0 ? 'active' : '' }}" bindtap="changeItem" data-item="0">音乐推荐</view><view class="tab-item {{ tab == 1 ? 'active' : '' }}" bindtap="changeItem" data-item="1">播放器</view><view class="tab-item {{ tab == 2 ? 'active' : '' }}" bindtap="changeItem" data-item="2">播放列表</view>
</view>
<view class="content"><swiper current="{{ item }}" bindchange="changeTab" style="height:{{windowHeight}}px"><swiper-item><!-- 音乐推荐 --><include src="info.wxml" /></swiper-item><swiper-item><!-- 播放器 --><include src="play.wxml" /></swiper-item><swiper-item><!-- 播放列表 --><include src="playlist.wxml" /></swiper-item></swiper>
</view>
<!-- 最下方音乐播放器 -->
<view class="player"><image class="player-cover" src="{{ play.coverImgUrl }}" data-item="1" bindtap="changeItem" /><view class="player-info"><view class="player-info-title" data-item="1" bindtap="changeItem">{{ play.title }}</view><view class="player-info-singer" data-item="1" bindtap="changeItem">{{ play.singer }}</view></view><view class="player-controls"><!-- 切换到播放列表 --><image src="/images/list.png" data-item="2" bindtap="changeItem" /><!-- 播放/暂停 --><image wx:if="{{ state == 'paused' }}" src="/images/play.png" bindtap="play" /><image wx:else src="/images/pause.png" bindtap="pause" /><!-- 下一曲 --><image src="/images/right.png" bindtap="next" /></view>
</view>

 

音乐推荐页

在pages/index/info.wxml文件中编写,

主要内容包括:轮播图、功能按钮列表和推荐歌曲列表,

具体代码如下:

<scroll-view scroll-top="{{scrollTop}}" style="height:{{windowHeight}}px" scroll-y="true" bindscroll="scroll" class="content-info"><!-- 轮播图 --><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_1.jpg" mode="aspectFill"/></swiper-item><swiper-item><image src="/images/banner_2.jpg" mode="aspectFill"/></swiper-item><swiper-item><image src="/images/banner_3.jpg" mode="aspectFill"/></swiper-item></swiper><!-- 功能按钮 --><view class="content-info-portal"><view><image src="/images/1.png" /><text>私人FM</text></view><view><image src="/images/2.png" /><text>每日歌曲推荐</text></view><view><image src="/images/3.png" /><text>云音乐新歌榜</text></view></view><!-- 推荐歌曲列表 --><view class="content-info-list"><view class="list-title">推荐歌曲</view><view class="list-inner"><view class="list-item"><image src="/images/1.jpg" /><view>lemon tree</view></view><view class="list-item"><image src="/images/2.jpg" /><view>NOW BOY</view></view><view class="list-item"><image src="/images/3.jpg" /><view>爱就一个字</view></view><view class="list-item"><image src="/images/1.jpg" /><view>白天不懂夜的黑</view></view><view class="list-item"><image src="/images/2.jpg" /><view>清明雨上</view></view><view class="list-item"><image src="/images/3.jpg" /><view>有何不可</view></view></view></view>
</scroll-view>

播放器页面

在pages/index/play.wxml文件中编写,

内容为展示当前播放的音乐名称、歌手、封面和播放进度,

具体代码如下:

<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 bindchanging="sliderChanging" bindchange="sliderChange" activeColor="#d33a31" block-size="12" backgroundColor="#dadada" value="{{ play.percent }}" /></view><text>{{ play.duration }}</text></view>
</view>

播放列表

在pages/index/playlist.wxml文件中编写,

主要渲染音乐的播放列表,展示封面、音乐名称、歌手,

可点击进行播放。具体代码如下:

<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>

首页样式

因为整体页面就一个index.wxml文件,故样式文件也只有pages/index/index.wxss。

具体代码如下:

/**index.wxss**/
/* 标签页 */
.tab {background-color: #17181a;color: white;display: flex;flex-direction: row;
}.tab .tab-item {padding: 0 8vw;
}.tab .active {font-weight: bold;color: red;border-bottom: 2rpx solid red;
}.content {background-color: #17181a;
}/* 轮播图 */
.content-info-slide image {width: 100%;
}/* 功能按钮 */
.content-info-portal {display: flex;flex-direction: row;
}.content-info-portal view {width: 28vw;height: 10vh;color: white;margin: 3vh 4vw 1vh 4vw;text-align: center;
}.content-info-portal image {width: 16vw;height: 5vh;display: flex;margin: 0 auto;
}/* 推荐歌曲列表 */
.content-info-list {color: white;
}.content-info-list .list-title {font-weight: bold;font-size: 40rpx;margin-bottom: 2vh;margin-left:2vw;
}.list-inner {display: flex;flex-direction: row;flex-wrap: wrap;width: 100%;
}.list-inner .list-item {width: 29%;height: 30%;text-align: center;margin: 0 2vw;
}.list-inner .list-item image {height: 120px;width: 120px;
}/* 播放器 */
/* 播放器歌曲名称 歌手 */
.content-play {color: white;text-align: center;
}.content-play-info {margin-top: 2vh;margin-bottom: 4vh;
}.content-play-info text {font-size: 20px;
}.content-play-info view {color: #ccc;
}/* 歌曲专辑封面 */
.content-play-cover image {width: 70%;border-radius: 60% 60%;
}/* 歌曲进度 */
.content-play-progress {display: flex;flex-direction: row;margin-left:1vw;
}.content-play-progress text {width: 10%;
}.content-play-progress view {width: 78%;
}/* 播放列表 */
.content-playlist {color:white;
}.playlist-item {margin-left:2vw;margin-right:2vw;display: flex;flex-direction: row;padding-top:2vh;padding-bottom: 2vh;border-bottom: 1rpx solid rgb(172, 162, 162);
}.playlist-item .playlist-cover{width:20%;height:80px;
}.playlist-info {margin-top:2vh;width:40%;margin-left:2vw;
}.playlist-info .playlist-info-singer{color:rgb(172, 162, 162);
}.playlist-controls {margin-left:10%;width:20%;text-align: right;
}.playlist-controls text {line-height: 60px;color:#d35f31;
}/* 最下方播放器 */
.player {position: fixed;bottom:0;left:0;color:white;width:100%;height:80px;z-index: 999;display: flex;flex-direction: row;padding-top:2vh;background-color: rgba(68, 66, 66, 0.8);border-top:2px solid rgba(68, 66, 66, 0.8);
}.player .player-cover{width:10%;height:55%;margin-left:2vw;margin-right:2vw;
}.player-info {width:40%;
}.player-info .player-info-singer{color:rgb(172, 162, 162);
}.player-controls image {margin: 1vh 2vw;width:10vw;height: 5vh;
}

首页脚本实现

在pages/index/index.js文件中编写。

具体代码如下:

// index.js
// 格式化时间
function formatTime(time) {var minute = Math.floor(time / 60) % 60;var second = Math.floor(time) % 60return (minute < 10 ? '0' + minute : minute) + ':' + (second < 10 ? '0' + second : second)
}Page({data: {item: 0,tab: 0,// 播放器列表playlist: [{id: 1,title: '! (也许是爱!) ',singer: '蔡妍',src: 'http://127.0.0.1/mini/music/1.mp3',coverImgUrl: '/images/1.jpg'}, {id: 2,title: '123木头人',singer: '黑Girl',src: 'http://127.0.0.1/mini/music/2.mp3',coverImgUrl: '/images/2.jpg'}, {id: 3,title: 'Bazzaya',singer: '蔡妍',src: 'http://127.0.0.1/mini/music/3.mp3',coverImgUrl: '/images/3.jpg'}, {id: 4,title: 'Fade',singer: 'Alan Walker',src: 'http://127.0.0.1/mini/music/4.mp3',coverImgUrl: '/images/4.jpg'}],// 记录音乐播放状态state: 'running',playIndex: 0,play: {currentTime: '00:00',duration: '00:00',percent: 0,title: '',singer: '',coverImgUrl: '/images/re_3.jpg',}},scrollTop: 0,// 标签栏标签切换事件changeItem: function (e) {this.setData({item: e.target.dataset.item})},// 设置tab的值changeTab: function (e) {this.setData({tab: e.detail.current})},// 定位数据scroll: function (event) {var that = this;that.setData({scrollTop: event.detail.scrollTop});},/*** 生命周期函数--监听页面加载*/onLoad(options) {var that = this;wx.getSystemInfo({success: function (res) {that.setData({windowHeight: res.windowHeight,windowWidth: res.windowWidth})}});},// 实现在页面初次渲染时,自动选择播放列表中的第1个曲目audioBam: null,onReady: function () {this.audioBam = wx.getBackgroundAudioManager()// 默认选择第1曲this.setMusic(0)// 播放失败检测this.audioBam.onError(() => {console.log('播放失败:' + this.audioBam.src)})// 播放完成自动换下一曲,监听音频自然播放结束的事件this.audioBam.onEnded(() => {this.next()})// 监听音频播放进度更新事件,获取音乐状态信息var updateTime = 0 // 记录上次更新的时间,用于限制1秒只能更新1次进度this.audioBam.onTimeUpdate(() => {var currentTime = parseInt(this.audioBam.currentTime)if (!this.sliderChangeLock && currentTime !== updateTime) {updateTime = currentTimethis.setData({'play.duration': formatTime(this.audioBam.duration || 0),'play.currentTime': formatTime(currentTime),'play.percent': currentTime / this.audioBam.duration * 100})}})},setMusic: function (index) {// 设置当前播放的曲目,在后面的步骤中实现var music = this.data.playlist[index]this.audioBam.src = music.srcthis.audioBam.title = music.titlethis.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,state: 'running'})},// 播放事件play: function () {this.audioBam.play()this.setData({state: 'running'})},// 暂停播放事件pause: function () {this.audioBam.pause()this.setData({state: 'paused'})},// 播放下一曲功能next: function () {var index = this.data.playIndex >= this.data.playlist.length - 1 ? 0 : this.data.playIndex + 1this.setMusic(index)},// 用于在用户操作slider组件时阻止播放进度自动更新,并显示用户选择的时间sliderChangeLock: false,sliderChanging: function (e) {var second = e.detail.value * this.audioBam.duration / 100this.sliderChangeLock = truethis.setData({'play.currentTime': formatTime(second),})},sliderChange: function (e) {var second = e.detail.value * this.audioBam.duration / 100// 调节音乐的播放进度this.audioBam.seek(second)// 在延迟1秒后允许播放进度自动更新setTimeout(() => {this.sliderChangeLock = false}, 1000)},// 播放列表点击播放事件change: function (e) {this.setMusic(e.currentTarget.dataset.index)}
})

功能截图

总结

微信小程序常用API练习 - 音乐播放器小程序开发笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据分享】2014-2024年我国AOI兴趣面数据(免费获取/来源于OSM地图)

AOI是Area of Interest的简称&#xff0c;顾名思义&#xff0c;指的是互联网电子地图中的兴趣面&#xff0c;主要用于在地图中表达区域状的地理实体&#xff0c;如一个居民小区、一所大学、一个产业园区、一个综合商场、一个医院、一个景区的矢量边界。对于AOI数据&#xff0c;…

R学习——因子

目录 1 定义因子&#xff08;factor函数&#xff09; 2因子的作用 一个数据集中的 只需要考虑可以用哪个数据来进行分类就可以了&#xff0c;可以用来分类就可以作为因子。 Cy1这个因子对应的水平level是4 6 8&#xff1a; 1 定义因子&#xff08;factor函数&#xff09; 要…

Zemax 中的 LED 阵列模型

LED 阵列的光学特性 LED 阵列由多个发光二极管 &#xff08;LED&#xff09; 组成&#xff0c;这些二极管以特定模式或配置排列&#xff0c;以实现均匀照明、更高强度或特定照明特性。这些阵列广泛用于显示器、照明系统、光通信和传感等应用。 LED 阵列的光学特性对于了解它如…

如何解决samba服务器共享文件夹不能粘贴文件

sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效&#xff1a; sudo service smbd restart

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

切换至低特权级

x86权限简介 x86芯片支持四种特权级&#xff1a;第0级权限最高&#xff0c;用于运行操作系统&#xff1a;第3级权限最低&#xff0c;用于运行应用程序&#xff1b;其它两级用于运行操作系统服务&#xff08;可选&#xff09;。 2&#xff0c;3等级用的少 权限检查时&#xff0…

游戏如何应对模拟器作弊

模拟器是指能在PC端模拟出安卓手机系统的软件&#xff0c;市面上比较常见的安卓模拟器有&#xff1a;雷电模拟器、MuMu模拟器、夜神模拟器等。 市面上常见的模拟器 模拟器既可以节省手机内存空间&#xff0c;避免长时间玩游戏手机发烫发热的尴尬&#xff0c;也可以用键盘鼠标对…

我们来对接蓝凌OA --报文格式

题记 数智化办公专家、国家高新技术企业、知识管理国家标准制定者、信创供应商10强…等等&#xff0c;这些和咱们有关系吗&#xff01;&#xff01;不好意思&#xff0c;走错片场了&#xff0c;刚和项目经理在甲方那边吹牛B想想刚刚的大饼&#xff0c;看看支付宝余额&#xff…

GFPS扩展技术原理(一)消息流

消息流作用 Google fast pair service要求Provider提供一个额外得通道以便seeker寻求建立连接&#xff0c;连接建立后&#xff0c;Seeker就可以向Provider发送一串数据流&#xff0c;这样做的目的是为了支持GFPS Extension&#xff0c;也就是扩展的GFPS&#xff0c;主要涉及一…

海康萤石摄像机接入EasyNVR流程:开启RTSP-》萤石视频添加到EasyNVR-》未来支持海康SDK协议添加到EasyNVR

EasyNVR目前支持GB28181、RTSP、ONVIF、RTMP&#xff08;推流&#xff09;这几种协议接入&#xff0c;目前正在增加海康HIKSDK、大华DHSDK等几种SDK的接入&#xff0c;我们今天就介绍一下萤石摄像机怎么通过RTSP接入到EasyNVR。 第一步&#xff1a;萤石摄像机开启 萤石设备默…

【EthIf-03】 EthernetInterface软件栈的文件组织结构

上图为《AUTOSAR_SWS_EthernetInterface【v2.2.0 】》给出的EthernetInterface软件栈的文件组织结构,本文主要关注arccore代码中已存在的文件的功能和作用,不知道的小伙伴可以查看🔗EthIf的文件结构中的src和inc目录下的文件有哪些: 1. 文件结构 1.1 EthIf_Cbk.h 头文…

Docker 中使用 PHP 通过 Canal 同步 Mysql 数据到 ElasticSearch

一、Mysql 的安装和配置 1.使用 docker 安装 mysql&#xff0c;并且映射端口和 root 账号的密码 # 获取镜像 docker pull mysql:8.0.40-debian# 查看镜像是否下载成功 docker images# 运行msyql镜像 docker run -d -p 3388:3306 --name super-mysql -e MYSQL_ROOT_PASSWORD12…

【深度学习量化交易6】优化改造基于miniQMT的量化交易软件,已开放下载~(已完成数据下载、数据清洗、可视化模块)

我是Mr.看海&#xff0c;我在尝试用信号处理的知识积累和思考方式做量化交易&#xff0c;应用深度学习和AI实现 股票自动交易&#xff0c;目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易软件。 之前写到&#xff0c;目前我已经完成了数据下载、数据清洗和数据可视化…

Ubuntu18安装后基本配置操作

1. 关掉自动更新 不关掉自动更新&#xff0c;会将你的ubuntu系统更新到更高版本&#xff0c;一些配置就不能用了&#xff0c;所以要关掉自动更新。在“软件和更新”中将“自动检查更新”设置为从不。 2. ubuntu换国内源 参考链接换源 按照这个换源这个换源好使 &#xff0c;…

Hadoop一课一得

Hadoop作为大数据时代的奠基技术之一&#xff0c;自问世以来就深刻改变了海量数据存储与处理的方式。本文将带您深入了解Hadoop&#xff0c;从其起源、核心架构、关键组件&#xff0c;到典型应用场景&#xff0c;并结合代码示例和图示&#xff0c;帮助您更好地掌握Hadoop的实战…

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长

2024153读书笔记|《春烂漫&#xff1a;新平摄影作品选》——跳绳酷似人生路&#xff0c;起落平常&#xff0c;进退平常&#xff0c;莫惧征途万里长 《春烂漫&#xff1a;新平摄影作品选》作者新平&#xff0c;2019.12.25年读完的小书&#xff0c;当时就觉得挺不错&#xff0c;今…

JAVA:建造者模式(Builder Pattern)的技术指南

1、简述 建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构造过程与表示分离,使得相同的构造过程可以创建不同的表示。建造者模式尤其适用于创建复杂对象的场景。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 本文将详细介绍建…

GESP202412 四级【Recamán】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202412 四级] Recamn 题目描述 小杨最近发现了有趣的 Recamn 数列&#xff0c;这个数列是这样生成的&#xff1a; 数列的第一项 a 1 a_1 a1​ 是 1 1 1&#xff1b;如果 a k − 1 − k a_{k-1}-k ak−1​−k 是正整数并且没有在数…

「数据结构详解·十五」树状数组

「数据结构详解一」树的初步「数据结构详解二」二叉树的初步「数据结构详解三」栈「数据结构详解四」队列「数据结构详解五」链表「数据结构详解六」哈希表「数据结构详解七」并查集的初步「数据结构详解八」带权并查集 & 扩展域并查集「数据结构详解九」图的初步「数据结构…

如何通过python实现一个web自动化测试框架?

一、首先你得知道什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver和Selenium Grid。 Selenium IDE&#…