基于JS卡片实现功能丰富的HarmonyOS鸿蒙Next音乐播放器

基于JS卡片实现功能丰富的HarmonyOS鸿蒙Next音乐播放器 #HarmonyOS征文#基于JS卡片实现功能丰富的音乐播放器

一、文章简介

这是一款基于JS卡片打造的音乐播放卡片应用,我们可以通过桌面卡片来获取音乐播放的信息,也可以进行播放、暂停、歌曲切换等功能。

效果展示

效果展示.gif

  • 2X2卡片展示歌曲封面、播放状态、播放进度、歌曲名称等信息。
  • 4X4卡片增加歌词展示。
  • 通过卡片即可操作音乐播放、暂停、切换等操作。

二、搭建HarmonyOS环境

  1. 安装DevEco Studio,详情请参考DevEco Studio下载

  2. 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,可以根据如下两种情况来配置开发环境:

    • 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
    • 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。
  3. 本程序需要在真机运行,需要提前申请证书:

三、音乐卡片开发

1. 功能设计

卡片的功能有三部分:

  • 信息展示
  • 页面跳转
  • 数据交互

因此我们可以实现的功能有:

  • 歌曲名称、歌手名称、歌曲封面等信息展示
  • 卡片跳转至播放器主页,并且数据同步
  • 播放、暂停、歌曲切换
  • 播放进度展示

2. Java卡片与JS卡片选型

确定了我们要实现的功能后,再进行Java卡片与JS卡片选型,如图所示,java卡片支持的组件比较少,无法满足我们的功能需求。

卡片选型.png

3. 代码结构

代码结构.png

包名 功能
bean 歌词、柱状图数据实体类
customcomponent 自定义组件柱状图
database 数据库和数据表
provider 列表数据提供者
service 播放器服务类
slice 启动页和主页面
utils 数据库、log、歌词解析、线程切换工具类

4. JS界面实现

4.1 新建卡片

新建卡片.png

4.2 选择模板

工具为我们提供了多个模板,我们选择一个音乐播放模板

选择模板.png

4.3 卡片配置

创建完成后,config.json文件中会自动生成卡片配置的参数,我们可以在此处设置卡片的名称、规格、类型等参数,详细配置请参考:卡片配置参数详解

Java Ability中的jsComponentName和js模块下的name相对应。

卡片配置.png

4.4 JS page

创建完成后有三个文件,js文件为卡片提供数据,hml文件编写布局属性,css文件编写控件样式

JS page.png

4.5 布局编写

js为卡片提供数据,配置跳转事件和message事件

export default {
    data: {
        //歌曲封面
        picName: "/common/music.png",
        //进度条的值
        progressValue: 0,
        //按钮点击发送message
        last: "last",
        play: "play",
        next: "next",
        //歌曲名
        songName: "未播放",
        //歌手名
        singer: "未知歌手",
        //歌词列表
        lyric: [{
            fontColor: "#9C9C9C",
            fontSize: "14px",
            Lrc: "",
        }],
        actions: {
            //跳转事件
            routerEvent: {
                action: "router",
                bundleName: "com.example.wryproject",
                abilityName: "com.example.wryproject.MusicAbility"
            },
            //message事件
            lastEvent: {
                action: "message",
                params: {
                    message: this.last
                }
            },
            playEvent: {
                action: "message",
                params: {
                    message: this.play
                }
            },
            nextEvent: {
                action: "message",
                params: {
                    message: this.next
                }
            },
        }
    }
}

hml代码:

<div class="container">
    <div class="title_container">
        <image src="{{ picName }}" @click="routerEvent" class="music-img"></image>
        <div class="songData">
            <text class="songName">{{ songName }}</text>
            <text class="singer">{{ singer }}</text>
        </div>
    </div>
    <list class="lyric_list">
        <list-item class="lyric_list_item" for="{{ lyric }}">
            <text class="lyric_text" style="color : {{ $item.fontColor }}; font-size : {{ $item.fontSize }};">{{ $item.Lrc }}</text>
        </list-item>
    </list>
    <div class="button_container">
        <progress class="progress" type="ring" percent="{{ progressValue }}"></progress>
        <image src="{{ lastImage }}" @click="lastEvent" class="last-img"></image>
        <image src="{{ playImage }}" @click="playEvent" class="play-img"></image>
        <image src="{{ nextImage }}" @click="nextEvent" class="next-img"></image>
    </div>
</div>

css代码较长,这里只贴出一部分:

.container {
    width: 100%;
    height: 100%;
}
.title_container {
    height: 70%;
    width: 100%;
    flex-direction: row;
    position: absolute;
    top: 5;
}
.music-img {
    background-color: #0F000000;
    height: 50%;
    width: 40%;
    object-fit: contain;
    border-radius: 10px;
    margin-left: 8%;
    margin-top: 8%;
    position: absolute;
}
.songData {
    height: 50%;
    width: 50%;
    position: absolute;
    flex-direction: column;
    align-items: center;
    padding-right: 10%;
    right: 3%;
    top: 8%;
}

初始预览效果:

预览效果.png

四、开发总结

此项目的开发,使我们掌握了:

  • JS卡片的布局编写:JS编写布局相对于JAVA更加高效。例如 JS 组件list,只需三五行代码即可实现列表的基本展示,大大提升了我们的开发效率,JS+JAVA的混合开发模式是一个很不错的开发方案。
  • 卡片的跳转和交互:通过卡片快速直达我们需要的页面,减少层级交互,应用的使用场景更加丰富,操作也更加便捷高效。
  • 卡片数据的实时更新:卡片成为应用信息展示的直接载体,真正做到“信息直达”,只需解锁手机即可获取到我们需要的信息。
  • Player的简单使用:音视频播放作为手机的常用功能之一,有相当多的用武之地,掌握Player的使用是各位开发者的必经之路。
  • 本地音频资源的获取:数据是一个应用的基础,学会合理使用这些数据、资源也是各位开发者需要掌握的基础。

开发过程中遇到的问题:

  1. 直接传入音频地址封面获取失败

    • 解决方案:通过传入文件描述符获取封面
  2. 网络获取歌词失败

    • 解决方案:在config.json中添加网络明文请求设置为true
  3. 卡片封面更新无效

    • 解决方案:考虑到定时器中更新封面代价较大,我们可以分为两种方案:

      • 计时器定时更新文字、进度条等占用性能较小的组件。
      • 返回桌面时应用失去焦点,在onInactive方法中更新卡片的图片数据即可减少性能损耗。
  4. 卡片歌词列表如何实现

    • 解决方案:定时刷新列表数据,我们只给列表设置5条数据,然后定时更新不同的歌词传入列表,达到列表伪滚动效果。
  5. 音乐在后台播放,几秒钟后音乐自动暂停,进入应用后音乐又开始自动播放。

    • 解决方案:在手机自带的手机管家–>应用启动管理–>找到自己的应用关闭自动管理–>打开允许后台活动,应用就不会被冻结了。

以上就是本人遇到的一些问题,希望可以给各位开发者提供参考。由于篇幅有限,文章有很多细节并不能面面俱到,感兴趣的小伙伴可以通过文章末尾链接下载项目,文中写的不好的地方欢迎大家提出建议,大家也可以在评论区多多交流,共同进步~

代码奉上:gitee

9 回复

大佬厉害,经验丰富,感谢分享!

更多关于基于JS卡片实现功能丰富的HarmonyOS鸿蒙Next音乐播放器的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


大佬,你这个用的是哪个版本呀

这篇文章是很早的了,你问的是什么版本呢

deveco studio的版本,

  • v1.0.1
  • v1.5.0
  • v2.0.0

我可以加一个你的联系方式,请教几个问题吗?有偿,

楼主,请收下我的膝盖

感谢分享,收藏了,支持

感谢分享,收藏了,牛的一笔

基于JS卡片实现HarmonyOS鸿蒙Next音乐播放器,可以通过以下步骤实现:

  1. 卡片布局设计:使用JS和CSS设计卡片布局,包括播放控制按钮、歌曲信息展示和进度条等组件。

  2. 音乐播放控制:通过HarmonyOS的媒体服务API,实现播放、暂停、上一首、下一首等控制功能,并在卡片上实时更新播放状态。

  3. 歌曲信息展示:利用数据绑定技术,将歌曲的标题、艺术家、封面等信息动态展示在卡片上。

  4. 进度条更新:通过定时器或事件监听,实时更新播放进度条,并支持用户拖动进度条跳转播放位置。

  5. 交互优化:添加触摸事件处理,提升用户交互体验,如点击封面切换全屏播放等。

通过这些步骤,可以打造一个功能丰富、界面美观的HarmonyOS音乐播放器卡片应用。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!