在这里插入图片描述

一、前言

心晴驿站已正式稳定上架华为应用市场,作为主打「轻治愈、零负担、高隐私」的鸿蒙原生心理健康应用,区别于传统心理工具类APP的枯燥单一,项目内置多款轻量化解压小游戏,以柔和交互、舒缓动画、极简操作帮助用户缓解焦虑、释放情绪压力。

在前九篇专栏中,我们完成了项目架构搭建、路由封装、组件化落地、隐私树洞、本地存储、双量表心理测评等核心能力,项目基础底座与核心测评业务已完全闭环。本篇我们聚焦项目治愈交互核心模块——轻量解压游戏体系,完整落地四大特色功能:解压泡泡、彩虹收集、雨声冥想、涂色填图。

不同于传统重度游戏开发,本模块基于ArkTS原生动画+触摸事件开发,主打轻量化、低功耗、低操作门槛,全程无复杂渲染、无后台驻留、无资源冗余,完美契合心理健康应用的治愈调性,同时通过华为应用市场性能与功耗审核标准。

二、治愈游戏模块产品定位与设计理念

2.1 产品核心定位

市面上多数解压APP存在动画卡顿、广告冗余、操作复杂、功耗过高的问题,违背情绪放松的初衷。心晴驿站四大治愈游戏严格遵循三大设计原则,适配情绪舒缓场景:

  • 极简无负担:无积分、无任务、无排行榜,随时打开、随时退出,零使用压力;

  • 轻动画低功耗:柔和渐变动画、低速动态效果,避免频闪、强光刺激,适配情绪放松场景;

  • 沉浸式治愈:搭配静态柔和配色、轻交互反馈、白噪音冥想,实现身心双重舒缓。

2.2 四大核心功能能力拆解

  • 解压泡泡:点击屏幕生成浮动泡泡,触摸破碎消散,模拟解压宣泄的交互体验;

  • 彩虹收集:屏幕随机飘落彩虹光点,点击收集累积数量,轻互动治愈碎片化情绪;

  • 雨声冥想:静态治愈背景+循环雨声白噪音,无多余交互,专注放松、静心舒缓;

  • 涂色填图:极简色块涂色功能,自由配色填充,专注手部操作,缓解焦虑内耗。

三、鸿蒙原生动画开发痛点与解决方案

3.1 原生开发常见问题

在初期开发调试中,原生ArkUI动画开发极易出现各类问题,也是轻交互项目上架被驳回、体验扣分的核心原因:

  • 动画内存残留:页面退出后动画未销毁,后台持续运行,导致功耗升高、内存泄漏;

  • 触摸事件冲突:多层组件叠加,点击、滑动事件穿透冲突,交互反馈错乱;

  • 动画卡顿掉帧:频繁创建动画实例、未做帧控,低端机型卡顿严重;

  • 资源未释放:音频、动画定时器未销毁,页面驻留后台持续耗电;

  • 多机型适配错乱:固定坐标、固定尺寸动画,折叠屏、小屏机型展示异常。

3.2 整体技术解决方案

针对以上痛点,项目搭建轻量化动画管控架构,从生命周期、动画实例、事件监听、资源释放四层彻底优化:

  • 所有动画绑定页面生命周期,页面隐藏/销毁即刻停止、清空实例;

  • 统一封装动画工具类,复用动画实例,避免频繁创建销毁;

  • 分层拦截触摸事件,杜绝事件穿透与冲突;

  • 音频、定时器、动画资源统一回收,实现零后台功耗;

  • 采用相对坐标与弹性布局,适配全机型屏幕尺寸。

四、轻量动画工具类全局封装

新建 utils/animate_utils.ets,全局封装通用浮动、渐变、位移动画,统一动画参数、复用实例、简化页面代码,保证全站动画风格统一。


/**
 * 全局治愈系动画工具类
 * 适配四大解压游戏轻交互动画
 * 低功耗、可复用、支持主动销毁
 */
import animate from '@ohos.animate'

// 动画默认时长:柔和低速,适配治愈场景
const DEFAULT_DURATION: number = 2000

/**
 * 浮动动画(上下缓慢浮动)
 * @param target 动画绑定组件
 * @param range 浮动偏移量
 */
export function createFloatAnimate(target: any, range: number = 15) {
  return animate.createAnimator(target, [
    {
      transform: 'translateY(0px)',
      duration: DEFAULT_DURATION,
      curve: animate.Curve.EaseInOutSine
    },
    {
      transform: `translateY(-${range}px)`,
      duration: DEFAULT_DURATION,
      curve: animate.Curve.EaseInOutSine
    }
  ]).repeat(-1)
}

/**
 * 渐变显现动画
 * @param target 动画绑定组件
 */
export function createFadeAnimate(target: any) {
  return animate.createAnimator(target, [
    { opacity: 0, duration: 300 },
    { opacity: 1, duration: 500 }
  ])
}

/**
 * 缩放消失动画(泡泡破碎效果)
 * @param target 动画绑定组件
 */
export function createScaleHideAnimate(target: any) {
  return animate.createAnimator(target, [
    { scale: 1, opacity: 1, duration: 200 },
    { scale: 1.5, opacity: 0, duration: 300 }
  ])
}

/**
 * 销毁动画实例,释放内存
 * @param animator 动画实例
 */
export function destroyAnimate(animator: animate.Animator | null) {
  if (animator) {
    animator.stop()
    animator.clear()
  }
}
    

五、四大治愈游戏核心功能落地

本节基于 ArkTS 原生语法、全局动画工具、生命周期管控,落地四大轻量游戏核心代码,所有代码均为上架线上稳定版本。

5.1 解压泡泡功能实现

核心逻辑:点击屏幕随机生成泡泡,自带浮动动画,点击泡泡触发破碎缩放动画,自动销毁节点,零内存残留。


/**
 * 解压泡泡治愈页面
 * 点击生成泡泡、触摸破碎消散、自动资源释放
 */
import { createFloatAnimate, createScaleHideAnimate, destroyAnimate } from '../utils/animate_utils'

interface BubbleItem {
  id: number
  x: number
  y: number
  scale: number
  floatAnim: any
}

@Entry
@Component
struct BubbleGamePage {
  @State bubbleList: BubbleItem[] = []
  private bubbleId: number = 0
  // 存储所有动画实例,用于统一销毁
  private animList: any[] = []

  // 生成随机泡泡
  createBubble(event: TouchEvent) {
    // 相对屏幕坐标,适配全机型
    const x = event.touches[0].screenX % 300
    const y = event.touches[0].screenY % 400
    const scale = 0.8 + Math.random() * 0.4

    let floatAnim = createFloatAnimate(this)
    floatAnim.play()
    this.animList.push(floatAnim)

    this.bubbleList.push({
      id: this.bubbleId++,
      x, y, scale,
      floatAnim
    })
  }

  // 泡泡破碎销毁
  breakBubble(item: BubbleItem, index: number) {
    let hideAnim = createScaleHideAnimate(this)
    hideAnim.play()
    // 动画结束后移除节点、销毁动画
    hideAnim.onFinish(() => {
      destroyAnimate(item.floatAnim)
      this.bubbleList.splice(index, 1)
    })
  }

  // 页面销毁,清空所有动画与节点
  aboutToDisappear() {
    this.animList.forEach(anim => destroyAnimate(anim))
    this.animList = []
    this.bubbleList = []
  }

  build() {
    Column() {
      Text('点击屏幕生成泡泡,点击泡泡即可消散解压')
        .fontSize(14)
        .fontColor('#666')
        .margin({ top: 20 })

      // 泡泡渲染区域
      Stack() {
        ForEach(this.bubbleList, (item: BubbleItem, index: number) => {
          Circle()
            .width(60 * item.scale)
            .height(60 * item.scale)
            .fillColor('rgba(127, 184, 247, 0.6)')
            .position({ x: item.x, y: item.y })
            .onClick(() => this.breakBubble(item, index))
        })
      }
      .width('100%')
      .layoutWeight(1)
      .onTouch((event: TouchEvent) => {
        if (event.type === TouchType.Down) {
          this.createBubble(event)
        }
      })
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F8FAFF')
  }
}
    

5.2 彩虹收集功能实现

核心逻辑:定时随机生成彩虹光点,自动飘落动画,点击收集计数,页面退出清空定时器与动画资源。


/**
 * 彩虹收集治愈页面
 * 随机飘落光点、点击收集计数、低功耗定时刷新
 */
import { createFloatAnimate, destroyAnimate } from '../utils/animate_utils'

interface RainbowItem {
  id: number
  x: number
  anim: any
}

@Entry
@Component
struct RainbowGamePage {
  @State rainbowList: RainbowItem[] = []
  @State collectCount: number = 0
  private itemId: number = 0
  private timer: number | null = null
  private animList: any[] = []

  aboutToAppear() {
    // 定时生成彩虹光点,低速刷新降低功耗
    this.timer = setInterval(() => {
      this.createRainbow()
    }, 1500)
  }

  // 生成随机彩虹光点
  createRainbow() {
    const x = Math.random() * 300
    let anim = createFloatAnimate(this)
    anim.play()
    this.animList.push(anim)

    this.rainbowList.push({
      id: this.itemId++,
      x,
      anim
    })

    // 5秒自动销毁,避免节点堆积
    setTimeout(() => {
      this.removeItemById(this.itemId - 1)
    }, 5000)
  }

  // 点击收集
  collectItem(item: RainbowItem) {
    this.collectCount++
    this.removeItemById(item.id)
  }

  // 根据ID移除节点
  removeItemById(id: number) {
    const index = this.rainbowList.findIndex(item => item.id === id)
    if (index > -1) {
      destroyAnimate(this.rainbowList[index].anim)
      this.rainbowList.splice(index, 1)
    }
  }

  // 页面销毁释放所有资源
  aboutToDisappear() {
    if (this.timer) clearInterval(this.timer)
    this.animList.forEach(anim => destroyAnimate(anim))
    this.animList = []
    this.rainbowList = []
  }

  build() {
    Column() {
      Text(`已收集彩虹光点:${this.collectCount} 个`)
        .fontSize(16)
        .fontWeight(FontWeight.Medium)
        .margin({ top: 20 })

      Stack() {
        ForEach(this.rainbowList, (item: RainbowItem) => {
          Ellipse()
            .width(20)
            .height(20)
            .fillColor('rgba(255, 183, 197, 0.7)')
            .position({ x: item.x, y: 100 })
            .onClick(() => this.collectItem(item))
        })
      }
      .width('100%')
      .layoutWeight(1)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F8FAFF')
  }
}
    

5.3 雨声冥想功能实现

核心逻辑:静态治愈背景+循环白噪音播放,支持开关控制,页面退出自动停止音频,杜绝后台耗电。


/**
 * 雨声冥想治愈页面
 * 白噪音循环播放、页面退出自动停播
 */
import audio from '@ohos.multimedia.audio'

@Entry
@Component
struct RainMeditationPage {
  @State isPlay: boolean = false
  private audioPlayer: audio.AudioPlayer | null = null

  // 初始化音频
  async initAudio() {
    if (!this.audioPlayer) {
      this.audioPlayer = await audio.createAudioPlayer()
      // 配置本地雨声资源,支持离线播放
      this.audioPlayer.src = 'rawfile:rain_sound'
      this.audioPlayer.loop = true
    }
  }

  // 切换播放状态
  async togglePlay() {
    await this.initAudio()
    if (this.isPlay) {
      this.audioPlayer?.pause()
    } else {
      this.audioPlayer?.play()
    }
    this.isPlay = !this.isPlay
  }

  // 页面销毁停止音频,释放资源
  aboutToDisappear() {
    if (this.audioPlayer) {
      this.audioPlayer.stop()
      this.audioPlayer.release()
      this.audioPlayer = null
    }
  }

  build() {
    Column() {
      Text('雨声冥想放松')
        .fontSize(20)
        .fontWeight(FontWeight.Medium)
        .margin({ top: 30 })

      Text('轻柔雨声白噪音,舒缓焦虑、静心放松')
        .fontSize(14)
        .fontColor('#666')
        .margin({ top: 10 })

      Blank().layoutWeight(1)

      // 播放开关按钮
      Button(this.isPlay ? '关闭雨声' : '播放雨声')
        .width(180)
        .height(44)
        .borderRadius(22)
        .backgroundColor('#7FB8F7')
        .onClick(() => this.togglePlay())
        .margin({ bottom: 50 })
    }
    .width('100%')
    .height('100%')
    .padding(20)
    .backgroundColor('#F0F7FF')
  }
}
    

5.4 涂色填图功能简化实现

核心逻辑:极简色块点击涂色,多配色切换,操作舒缓,无复杂交互,适配静心解压场景。


/**
 * 涂色填图治愈页面
 * 极简配色、点击填色、静心解压
 */
@Entry
@Component
struct ColorGamePage {
  @State colorList: string[] = ['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF']
  private colorSource: string[] = ['#7FB8F7', '#B6D8FF', '#FFC8D8', '#C8E6C9']

  // 填充色块
  fillColor(index: number) {
    this.colorList[index] = this.colorSource[index]
  }

  build() {
    Column() {
      Text('随心涂色 · 治愈静心')
        .fontSize(18)
        .fontWeight(FontWeight.Medium)
        .margin({ top: 30 })

      Grid() {
        ForEach(this.colorList, (item: string, index: number) => {
          Rect()
            .width(120)
            .height(120)
            .radius(12)
            .fillColor(item)
            .onClick(() => this.fillColor(index))
        })
      }
      .columns(2)
      .gutter(15)
      .margin({ top: 30 })

      Blank().layoutWeight(1)
    }
    .width('100%')
    .height('100%')
    .padding(20)
    .backgroundColor('#F8FAFF')
  }
}
    

六、低功耗与上架核心优化点

6.1 动画资源全生命周期管控

所有动画实例、定时器、音频资源全部绑定页面生命周期,页面隐藏/销毁即刻停止、清空、释放,彻底杜绝后台驻留、内存泄漏、异常耗电问题,通过华为应用市场功耗检测。

6.2 低频率刷新机制

光点生成、动画刷新采用低速间隔,避免高频帧刷新导致的CPU占用过高,全程保持低负载运行,适配老年机、低配机型。

6.3 无频闪柔和动画

所有动画采用慢曲线插值、低对比度配色,无快速闪烁、无强光切换,符合心理健康应用视觉规范,护眼且治愈。

6.4 纯离线无流量消耗

所有游戏资源本地静态存储,无需联网、无图片/音频网络加载,零流量消耗,完美适配离线使用场景。

七、开发踩坑复盘(上架避坑)

7.1 动画后台持续运行耗电

问题:初期未主动销毁动画实例,页面退至后台后动画持续循环,导致功耗飙升。

解决方案:统一封装动画销毁方法,页面销毁强制清空所有实例与定时器。

7.2 触摸事件穿透冲突

问题:泡泡、光点多层组件叠加,点击底层区域触发上层穿透,交互错乱。

解决方案:使用Stack分层渲染,组件独立拦截点击事件,杜绝事件穿透。

7.3 节点堆积导致页面卡顿

问题:无限生成泡泡、光点,不主动销毁节点,DOM节点堆积导致页面卡顿。

解决方案:设置自动销毁倒计时,限制最大节点数量,保持页面轻量渲染。

7.4 音频后台残留播放

问题:雨声冥想页面退出后音频继续播放,影响使用体验。

解决方案:页面销毁强制停止并释放音频实例,彻底终止播放。
在这里插入图片描述

八、本篇总结与下篇预告

本篇我们完整落地了心晴驿站四大治愈轻量游戏模块,基于标准 ArkTS 原生语法,封装全局治愈系动画工具,实现解压泡泡、彩虹收集、雨声冥想、涂色填图全功能闭环。同时从动画管控、资源释放、功耗优化、事件拦截多维度解决了鸿蒙轻交互开发的常见痛点,完全满足上架性能、功耗、体验规范。

至此,项目隐私功能、测评功能、治愈游戏三大核心业务模块全部落地,产品核心功能体系完整成型,具备完整的上线使用能力。

下篇预告(第十一篇):个人中心与设置模块实战,实现用户数据可视化、一键隐私清空、关于页面、版本适配、隐私声明展示,完成项目全部页面闭环与合规收尾。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐