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


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 相关文章推荐
javascript Keycode对照表
Oct 24 Javascript
js window.onload 加载多个函数的方法
Nov 02 Javascript
js换图片效果可进行定时操作
Jun 09 Javascript
关于jQuery判断元素是否存在的问题示例探讨
Jul 21 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
Mar 20 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
May 10 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
真正好用的js验证上传文件大小的简单方法
Oct 27 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
Mar 12 Javascript
clipboard.js在移动端复制失败的解决方法
Jun 13 Javascript
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
解决vuecli3中img src 的引入问题
Aug 04 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
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
PHP attributes()函数讲解
2019/02/03 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
JavaScript Accessor实现说明
2010/12/06 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
Python之父谈Python的未来形式
2016/07/01 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
奖学金自我鉴定范文
2013/10/03 职场文书
实习生个人的自我评价
2013/12/08 职场文书
项目合作协议书
2014/09/23 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
收入证明申请书
2015/06/12 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
在 Python 中利用 Pool 进行多线程
2022/04/24 Python