微信小程序有旋转动画效果的音乐组件实例代码


Posted in Javascript onAugust 22, 2018

在微信开发中,写过的一个简单的音乐播放组件,记录下。

music

音乐播放组件。

属性

属性名 类型 默认值 说明
music String   传入的音乐资源地址
musicStyle String (随便写了个) 音乐组件的样式
rotate Boolean true 播放时是否有旋转效果
iconOn String (随便写了个) 音乐播放时的icon地址
iconOff String (随便写了个) 音乐暂停时的icon地址

代码

properties: {
  // 音乐路径
  music: {
   type: String,
   value: '',
   observer: function (newVal) {
    this._initMusic(newVal)
   }
  },
  // 样式
  musicStyle: {
   type: String,
   value: 'position: absolute; right: 20rpx; top: 20rpx; width: 100rpx; height: 100rpx;'
  },
  // 播放时是否有旋转效果
  rotate: {
   type: Boolean,
   value: true
  },
  // 播放时的icon路径
  iconOn: {
   type: String,
   value: '/resources/img/music-on.png' // 请填写默认的图片地址
  },
  // 暂停时的icon路径
  iconOff: {
   type: String,
   value: '/resources/img/music-off.png' // 请填写默认的图片地址
  }
 }

初始化音乐

首先,在properties中接收页面传来的音乐文件地址,

music: {
 type: String,
 value: '',
 observer: function (newVal) {
  this._initMusic(newVal)
 }
}

这里的处理是,一旦接收到页面传来的 music 地址,就初始化音乐:

_initMusic: function (newVal) {
 // 当页面传来新的music时,先销毁之前的audioCtx,否则页面会很嗨
 if (this.data.audioCtx) {
  this.data.audioCtx.destroy()
 }
 if (newVal) {
  var audioCtx = wx.createInnerAudioContext()
  this.setData({
    audioCtx: audioCtx
  })
  if (this.data.audioStatus == '1') {
    audioCtx.autoplay = true
  }
  audioCtx.loop = true
  audioCtx.src = newVal
 }
}

 audioStatus 用来记录音乐播放状态,在data中默认设置为1:

data: {
  icon: '',
  audioStatus: 1,
  audioCtx: '',
  musicClass: 'music-on'
}

wxml文件里,只用一个 <image> 标签:

<image class='music {{ rotate && musicClass }}' 
    style="{{ musicStyle }}" 
    src="{{ icon }}" 
    bindtap='_switch' 
    wx:if="{{ music }}"></image>

其中, icon 在组件ready()时赋值成播放状态的icon:

ready() {
  this.setData({
   icon: this.data.iconOn
  })
}

音乐旋转效果

音乐播放时的旋转效果,是用css动画实现的,wxss文件如下:

.music {
 position: absolute;
 z-index: 99;
 -webkit-animation-iteration-count: infinite;
}
/* 旋转class */
.music-on {
 animation: music-rotate 4s linear infinite;
}
/* 旋转动画 */
@keyframes music-rotate {
 0% {
  transform: rotateZ(0deg);
 }
 
 100% {
  transform: rotateZ(360deg);
 }
}

当 rotate 为true时,使 musicClass 的值为 music-on,就能实现旋转了。

当然, musicClass 需要用 this.setData 的方式来切换值。

爆丑照:

微信小程序有旋转动画效果的音乐组件实例代码

音乐控制

手动切换

手动点击时,用取反的逻辑控制音乐的播放和暂停:

_switch: function () {
 // 如果是播放就停止 
 if (this.data.audioStatus) {
  this.setData({
   audioStatus: 0,
   icon: this.data.iconOff,
   musicClass: ''
  })
  this.data.audioCtx.pause()
 // 如果是停止就播放
 } else {
  this.setData({
   audioStatus: 1,
   icon: this.data.iconOn,
   musicClass: 'music-on'
  })
  this.data.audioCtx.play()
 }
}

其它情况

同时,还要对下列情况做处理:

  • 分享时,进入选好友界面、音乐停止,分享回来后,音乐没有继续播放
  • 从此页面跳转到下一个页面时,音乐还在继续
  • 从此页面撤回到上一个页面时,音乐还在继续

解决的方法,是在组件的methods中又写了两个方法:

// 写在组件的methods中:
 
// 在引用组件页面的onShow()中调用
// 否则,如果当发生分享页面行为并返回时,音乐不会自动播放
onShow: function () {
 if (this.data.music && this.data.audioStatus) {
  this.data.audioCtx.play()
 }
},
// 在引用组件页面的onHide()中调用
// 否则,在跳转到下一个页面后,音乐还在继续
onHide: function () {
 if (this.data.music && this.data.audioStatus) {
  this.data.audioCtx.pause()
 }
 this.setData({
  animationData: {}
 })
}

这两个方法分别在页面中的 onShow 和 onHide 中调用,调用方式就是父组件获取到子组件实例对象:

例如,给<music>组件加id为"music-componet",调用时就是:

// 写在调用页面中
 
onShow: function () {
  this.selectComponent('#music-component').onShow()
},
onHide: function () {
  this.selectComponent('#music-component').onHide()
}

最后,在组件的detached中也调用一下 onHide 方法:

// 页面关闭时销毁音乐
detached() {
  this.onHide()
}

使用

你可以

通过阅读本文,根据自身实际情况写一个

或者,直接凑合用

总结

以上所述是小编给大家介绍的微信小程序有旋转动画效果的音乐组件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery 点击图片跳转上一张或下一张功能的实现代码
Mar 12 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
Nov 11 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
JS清除选择内容的方法
Jan 29 Javascript
JS控制按钮10秒钟后可用的方法
Dec 22 Javascript
第一次动手实现bootstrap table分页效果
Sep 22 Javascript
DOM 事件的深入浅出(一)
Dec 05 Javascript
jQuery Ajax File Upload实例源码
Dec 12 Javascript
vue弹窗插件实战代码
Sep 08 Javascript
详解Eslint 配置及规则说明
Sep 10 Javascript
Nuxt.js 数据双向绑定的实现
Feb 17 Javascript
JavaScript代码异常监控实现过程详解
Feb 17 Javascript
vue2.0 下拉框默认标题设置方法
Aug 22 #Javascript
VUE中v-on:click事件中获取当前dom元素的代码
Aug 22 #Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
Aug 21 #jQuery
js动态设置select下拉菜单的默认选中项实例
Aug 21 #Javascript
Canvas实现微信红包照片效果
Aug 21 #Javascript
Vue开发实现吸顶效果的示例代码
Aug 21 #Javascript
js canvas实现红包照片效果
Aug 21 #Javascript
You might like
重置版战役片段
2020/04/09 魔兽争霸
多重?l件?合查?(一)
2006/10/09 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
php中上传文件的的解决方案
2018/09/25 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
如何编写高质量JS代码
2014/12/28 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
使用express获取微信小程序二维码小记
2019/05/21 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Python中用Spark模块的使用教程
2015/04/13 Python
Python数据类型详解(二)列表
2016/05/08 Python
Python进程间通信之共享内存详解
2017/10/30 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Python 串口读写的实现方法
2019/06/12 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
C面试题
2015/10/08 面试题
写出一个方法实现冒泡排序
2016/07/08 面试题
大学毕业生求职自荐书
2014/06/05 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL