动动小手学鸿蒙 HarmonyOS APP(03)电子木鱼

前言


想象一下,当你身心疲惫的时候,拿出随身电子木鱼,轻轻一敲,那清脆的木鱼声立刻会穿透你的心灵,让你瞬间感到轻松愉快。

自动挡的开启,更是让你的双手得到解放,你可以在敲打木鱼的同时做其他事情,比如刷刷抖音、看看微博,让你的生活更加丰富多彩。

随身电子木鱼不仅是你解压的好帮手,还是你积累功德的得力助手。

每一次敲击木鱼,都是在积累功德。而在这个过程中,你可以感受到来自木鱼的声音和动画特效的双重愉悦。

总之,随身电子木鱼是一款集解压、积攒功德、娱乐于一体的神器。它轻便小巧,方便携带,是你日常生活中的最佳伴侣!

本篇的大致内容如下

  1. 效果展示
  2. 知识点分解
  3. 具体实现
  4. 最后总结

本例使用开发环境

Hamony OS 3.1.0(API 9)

IDE: DevEco Studio 4.0 Release

一. 效果展示

二. 知识点分解

1. 定时器使用

使用定时器的serInterval实现开启自动挡。

开启自动挡后,通过启动一个定时器来自动定时执行一次敲击。

将敲击抽成一个方法,供手动点击木鱼和自动挡执行敲击使用。

2. 动画效果

敲击方法中,将在木鱼上方的'功德+1'文本进行一个向上移动叠加变大的动画

这里用到的是显示动画

animateTo(value: AnimateParam, event: () => void): void

提供全局animateTo显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。

3. 声音播放

通过系统提供的声音播放方法来播放木鱼敲击声。

这里使用的是AVPlayer方法,根据官方文档,AVPlayer比较适合用于播放完整的音乐。

但是更适合播放短音频的SoundPool目前在API 9中并没有支持。

SoundPool模块首批接口从API version 10开始支持。

这里我们就凑合一下,简单了解下AVPlayer:

使用AVPlayer可以实现端到端播放原始媒体资源。 播放的全流程包含:创建AVPlayer,设置播放资源,设置播放参数(音量/倍速/焦点模式),播放控制(播放/暂停/跳转/停止),重置,销毁资源。

在进行应用开发的过程中,开发者可以通过AVPlayer的state属性主动获取当前状态或使用on('stateChange')方法监听状态变化。如果应用在音频播放器处于错误状态时执行操作,系统可能会抛出异常或生成其他未定义的行为。

状态的详细说明请参考AVPlayerState。当播放处于prepared / playing / paused / completed状态时,播放引擎处于工作状态,这需要占用系统较多的运行内存。当客户端暂时不使用播放器时,调用reset()或release()回收内存资源,做好资源利用。

简单讲,本例中使用AVPlayer播放木鱼敲击声分如下几步:

创建实例createAVPlayer() => 设置业务需要的监听事件 => 设置资源 => 准备播放 => 音频播控 => 退出播放

三. 具体实现

定时器

ts 复制代码
this.intervalID = setInterval(() => {
  this.knock();
}, this.speed);

单次敲木鱼方法

ts 复制代码
private knock() {
  this.totalGongDe++;
  // 点击后先中断上次播放,再重新放
  this.avPlayer.stop(() => {
    this.avPlayer.prepare(() => {
      this.avPlayer.play();
    });
  });

  this.showGongDe = false;
  animateTo({ duration: this.speed }, () => {
    this.showGongDe = true;
  })
}

功德+1 文字动效

ts 复制代码
if (this.showGongDe) {
  Text('功德+1')
    .fontSize(28)
    .fontWeight(FontWeight.Bold)
    .fontColor(Color.White)
    .margin({ top: 150 })
    .textAlign(TextAlign.Center)
    .width('100%')
    .transition({ type: TransitionType.All, translate: { y: 100 } , scale: { x: 0, y: 0 }})
}

播放音乐AVPlayer初始化以及释放

ts 复制代码
aboutToAppear() {
  // 初始化音乐播放用动avPlayer
  this.avPlayerFdSrcInit();
}

aboutToDisappear() {
  this.avPlayer.release();
  clearInterval(this.intervalID);
}

async avPlayerFdSrcInit() {
  // 创建avPlayer实例对象
  this.avPlayer = await media.createAVPlayer();
  // 通过UIAbilityContext的resourceManager成员的getRawFd接口获取媒体资源播放地址
  // 返回类型为{fd,offset,length},fd为HAP包fd地址,offset为媒体资源偏移量,length为播放长度
  let context = getContext(this) as common.UIAbilityContext;
  let fileDescriptor = await context.resourceManager.getRawFd('dong.mp3');
  // 为fdSrc赋值触发initialized状态机上报
  this.avPlayer.fdSrc = fileDescriptor;
}

四. 最后总结

大家可以下载代码尝试增加一些新功能,比如敲击速度设置,木鱼样式替换,音效选择等。来丰富用户的体验。

github.com/kainbro/MuY...

通过本例可以熟悉这些知识:显示动画音乐播放定时器等常用开发知识。

祝大家在增加功德的同时快速掌握鸿蒙开发技巧!

相关推荐
运维Z叔1 小时前
云安全 | AWS S3存储桶安全设计缺陷分析
android·网络·网络协议·tcp/ip·安全·云计算·aws
冯志浩1 小时前
Harmony NEXT:如何给数据库添加自定义分词
harmonyos·掘金·金石计划
Reese_Cool3 小时前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言
平凡シンプル3 小时前
安卓 uniapp跨端开发
android·uni-app
elina80133 小时前
安卓实现导入Excel文件
android·excel
严文文-Chris3 小时前
【设计模式-享元】
android·java·设计模式
爱桥代码的程序媛3 小时前
鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之瑞芯微RK3568移植案例
嵌入式硬件·harmonyos·鸿蒙·鸿蒙系统·移植·openharmony·鸿蒙开发
AORO_BEIDOU3 小时前
防爆手机+鸿蒙系统,遨游通讯筑牢工业安全基石
5g·安全·智能手机·信息与通信·harmonyos
趋势大仙4 小时前
SQLiteDatabase insert or replace数据不生效
android·数据库
DS小龙哥4 小时前
QT For Android开发-打开PPT文件
android·qt·powerpoint