HarmonyOS 鸿蒙Next 当应用切到后台时应用动画被打断

发布于 1周前 作者 zlyuanteng 最后一次编辑是 5天前 来自 鸿蒙OS

请求大佬解答,为何另一个动画会打断,这里的web动画正常执行:

Web({
  src: $rawfile('rpl_in_plan_back_left.html'),
  controller: this.controller
})
  .height('57%')
  .width('80%')
  .zIndex(3)
  .backgroundColor(Color.Transparent)
  .onAppear(() => {
    this.webControllerAttached()
  })
  .alignRules({
    bottom: { anchor: '__container__', align: VerticalAlign.Bottom },
    end: { anchor: '__container__', align: HorizontalAlign.End },
    start: { anchor: '__container__', align: HorizontalAlign.Start },
    top: { anchor: '__container__', align: VerticalAlign.Top },
    bias: { vertical: 0.712, horizontal: 0.493 }
  })
如上是xml动画转的web动画,下面动画会被打断:
private webControllerAttached() {
  if (!(this.animationStart)) {
    this.animationStart = true
    this.startAnimation()
  }
}

/*

  • アニメーション開始 */
private startAnimation() {
 if (!(this.parentViewModel.openDialogCheck())) {
   //アニメーションの決定
   let it = this.parentViewModel.btReceivedPlnParkInInfo.value
   if (it) {
     this.viewModel.useAnimation(it.moveDirection)
     this.viewModel.animationDirect(it.recommendDirection)
   }

   // TODO viewModel.animationSet.cancel()
   // アニメーションの開始
   setTimeout(() => {
     this.getUIContext()
       .keyframeAnimateTo({ iterations: CarAnimatorConst.MAX_NUM },
         this.genKeyframe(this.viewModel.animation!))
   })
 }
}
genKeyframe(data: Array<CarAnimator.KeyFrame>): Array<KeyframeState> {
 return data.map<KeyframeState>((values) => ({
   duration: this.currentKeyTime(data, values) * 1000,
   event: () => {
     this.trX = this.viewModel.animationDir.first * this.dpToPercentWidth(values.position.x)
     this.trY = this.viewModel.animationDir.second * this.dpToPercentHeight(values.position.y)
     this.rot = this.viewModel.animationDir.third * values.degreeRotationAngle
   },
   curve: Curve.Linear
 } as KeyframeState))
}

currentKeyTime(data: Array<CarAnimator.KeyFrame>, current: CarAnimator.KeyFrame): number {
 let time = current.keyTime
 if (data.indexOf(current) == 0) {
   return time
 }
 let beforeTime = data[data.indexOf(current) - 1].keyTime
 return time - beforeTime
}

dpToPercentWidth(dp: number) {
 return dp * CarAnimatorConst.STANDARD_DENSITY * this.percentWidthFactor;
}

dpToPercentHeight(dp: number) {
 return dp * CarAnimatorConst.STANDARD_DENSITY * this.percentHeightFactor;
}

why???


更多关于HarmonyOS 鸿蒙Next 当应用切到后台时应用动画被打断的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复
很正常啊,都进入后台了,动画自然就不会执行了。你应该在再次进入前台的时候开始动画就行了。

更多关于HarmonyOS 鸿蒙Next 当应用切到后台时应用动画被打断的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个怎么判断呢?

在HarmonyOS鸿蒙Next系统中,当应用切换到后台时,应用动画被打断的问题通常与系统的资源管理策略有关。鸿蒙系统为了提升整体性能和用户体验,会优化后台应用的行为,包括暂停或限制后台动画的播放。

这一机制确保了前台应用能够流畅运行,同时减少了后台应用对系统资源的占用。因此,当应用进入后台时,其动画可能会被系统自动暂停或取消,以释放资源供前台应用使用。

开发者可以通过以下方式处理这一问题:

  • 优化动画逻辑:确保动画在后台时不需要持续运行,或者设计成在后台时自动调整为低功耗模式。
  • 使用系统API:利用鸿蒙系统提供的API,检测应用状态变化,并在应用进入后台时适当调整动画行为。
  • 管理应用生命周期:在应用生命周期的不同阶段,合理管理动画的启动和停止,以减少不必要的资源消耗。

如果开发者需要确保某些动画在后台也能持续运行(尽管这通常不推荐),可能需要深入了解鸿蒙系统的资源管理策略,并考虑与系统策略进行协调。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部