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


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引擎指南
Dec 04 Javascript
原生js实现百叶窗效果及原理介绍
Apr 12 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
Apr 18 Javascript
React-native桥接Android原生开发详解
Jan 17 Javascript
bing Map 在vue项目中的使用详解
Apr 09 Javascript
在iFrame子页面里实现模态框的方法
Aug 17 Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
Jan 24 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
Mar 04 Javascript
微信小程序实现选择地址省市区三级联动
Jun 21 Javascript
js和jquery判断数据类型的4种方法总结
Aug 28 jQuery
javascript实现智能手环时间显示
Sep 18 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
pw的一个放后门的方法分析
2007/10/08 PHP
PHP 输出简单动态WAP页面
2009/06/09 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
PHP学习笔记之session
2018/05/06 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
11款基于Javascript的文件管理器
2009/10/25 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
Python实现不规则图形填充的思路
2020/02/02 Python
浅谈Python 函数式编程
2020/06/20 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
python RSA加密的示例
2020/12/09 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
Unix如何添加新的用户
2014/08/20 面试题
舞蹈毕业生的自我评价
2014/03/05 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
租房协议书范文
2014/08/20 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang