HarmonyOS鸿蒙Next中进度条组件进度条动画怎么优化得更好,或者怎么修改我的代码顺序呢

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS鸿蒙Next中进度条组件进度条动画怎么优化得更好,或者怎么修改我的代码顺序呢 我使用progress进度条组件展示任务进度。每一个任务都有已完成或未完成的状态。当任务状态修改时,任务进度也修改,但是,我删除未完成的任务时,组件是顺时针变化,这没有问题,因为总任务大于等于已完成任务数。但是,我删除已完成的任务时,任务进度先是增加然后又减少到当前任务进度。我想把它修改成删除已完成任务后从0%到当前进度。

任务列表主体:

@Entry
@Component
struct TaskList {
  @State finishedtask:number = 0 //已完成任务
  @State totaltask:number = 0 //总任务
  @State tasks:TaskInfo[] = []
  @State deletebuttonbgcolor:string|Color = Color.Red
  @State istouched:boolean = false
  //删除任务
  @Builder DeleteTask(index:number,item:TaskInfo){
    Column(){
      Image($r('app.media.ic_public_delete'))
        .draggable(false)
        .margin({left:10})
        .padding(8)
        .width(50)
        .borderRadius(25)
        .fillColor(Color.White)
        .backgroundColor(this.deletebuttonbgcolor)
        .onTouch((event?:TouchEvent)=>{
          if(event){
            if(event.type === TouchType.Down){
              this.deletebuttonbgcolor = '#ffe70000'
            } else if(event.type === TouchType.Up||event.type === TouchType.Cancel){
              this.deletebuttonbgcolor = Color.Red
            }
          }
        })
        .onClick(()=>{
          //提示将要删除任务
          console.log('TaskListTag',`将删除第${index+1}个任务`)
          //删除此任务
          this.tasks.splice(index,1)
          //提示删除成功
          console.log('TaskListTag','删除成功')
          console.log('TaskListTag',JSON.stringify(this.tasks))
          //重新确认已完成任务数和总任务数,需要优化,因为删除已完成的任务时进度条从100%减少到当前进度,而不是从0开始,删除未完成的任务没有问题,所以需要优化
          //首先,确保总任务数大于等于已完成任务数,因为已完成任务数小于等于总任务数,先修改已完成任务数,再修改总任务数
            this.finishedtask = this.tasks.filter((item): boolean => item.isfinished).length//过滤isfinished为true的数据,长度就是已完成任务数
            this.totaltask = this.tasks.length//当前数组长度就是总任务数
        })
    }
  }
  aboutToAppear(): void {
    //查询任务列表
  }
  build() {
    RelativeContainer() {
      Column(){
        List(){
          ListItem(){
            //自定义组件。任务进度以及新增任务
            TaskProgress({
              finishedtask:this.finishedtask,
              totaltask:this.totaltask,
              tasks:this.tasks
            })
          }
          //遍历输出任务列表
          ForEach(this.tasks,(item:TaskInfo,index:number)=>{
            ListItem(){
              //自定义组件。任务列表中的每一项任务
              TaskInList({
                item:item,
                index:index,
                finishedtask:this.finishedtask,
                tasks:this.tasks
              })
            }
            .swipeAction({end:this.DeleteTask(index,item)})//左滑出现删除按钮
          })
        }
        .scrollBar(BarState.Off)
        .width('100%')
        .height('100%')
      }
      .padding(10)
      .height('100%')
      .width('100%')
      .backgroundColor('#efefef')
    }
    .height('100%')
    .width('100%')
  }
}

任务进度组件:

//任务进度
@Component
struct TaskProgress{
  @Link finishedtask:number
  @Link totaltask:number
  @Link tasks:TaskInfo[]
  dialogController: CustomDialogController = new CustomDialogController({
    builder: TaskCustomDialog({tasks:this.tasks,totaltask:this.totaltask}),
  })
  build() {
    Column({space:10}){
      //任务进度
      Row(){
        Text('任务进度:')
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
        Row(){
          //使用Stack堆叠容器,将进度条和进度展示层叠显示
          Stack(){
            //进度条
            Progress({
              value:this.finishedtask,//当前进度
              total:this.totaltask,//进度总长
              type:ProgressType.Ring,//圆形
            })
              .width(90)
            Text(`${this.finishedtask} / ${this.totaltask}`)
              .fontSize(25)
          }
        }
      }
      .borderRadius(10)
      .height(110)
      .justifyContent(FlexAlign.Center)
      .backgroundColor(Color.White)
      .width('100%')
      Button('新增任务')
        .width('60%')
        .margin(10)
        .onClick(()=>{
          this.dialogController.open()//自定义弹窗
        })
    }
    .width('100%')
  }
}

每一项任务:

//任务列表中的每一项任务
@Component
struct TaskInList{
  @State item:TaskInfo = new TaskInfo(1,'',false)
  @State index:number = 0
  @Link finishedtask:number
  @Link tasks:TaskInfo[]
  build(){
    Row(){
      Column(){
        Image($r('app.media.ic_public_edit'))
          .width(30)
          .fillColor('#FF33A1')
          .draggable(false)
      }
      .borderRadius({topLeft:10,bottomLeft:10})
      .justifyContent(FlexAlign.Center)
      .backgroundColor('#87CEEB')
      .width(60)
      .height('100%')
      .margin({right:10})
      Row(){
        Text(this.item.name)
          .fontSize(25)
          .maxLines(1)
          .textOverflow({
            overflow:TextOverflow.Ellipsis
          })
        Checkbox()
          .width(30)
          .shape(CheckBoxShape.ROUNDED_SQUARE)
          .borderRadius(0)
          .select(this.item.isfinished)
          .onChange((value:boolean)=>{
            this.item.isfinished = value
            console.log('TaskListTag',`第${this.index+1}个任务:${this.item.name}——${this.item.isfinished}`)
            this.finishedtask = this.tasks.filter((item): boolean => item.isfinished).length
          })
      }
      .width('100%')
      .layoutWeight(1)
      .justifyContent(FlexAlign.SpaceBetween)
    }
    .margin(2)
    .borderRadius(10)
    .justifyContent(FlexAlign.SpaceBetween)
    .padding({right:20 })
    .backgroundColor(Color.White)
    .width('100%')
    .height(80)
  }
}

以上是相关的代码,问题情景举例:

总任务数totaltask = 5,已完成任务数finishedtask = 3,此时进度条是3/5,我删除一条已完成的任务,此时出现的问题:

任务进度先是变成了75%(3/4),然后又变成了50%(2/4),也就是进度条先增长再减少。

可能是我的代码顺序的问题,但是我的代码是先修改的已完成任务数,然后修改的总任务数,按理来说不应该先变成3/4,而是2/5,因此百思不得其解。

恳请大佬们解惑


更多关于HarmonyOS鸿蒙Next中进度条组件进度条动画怎么优化得更好,或者怎么修改我的代码顺序呢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,优化进度条动画可以通过以下几种方式实现:

  1. 使用Animator组件:通过Animator组件控制进度条动画的播放,可以更精确地控制动画的时长、速度曲线等。Animator提供了startpauseresume等方法,可以根据需要灵活控制动画的播放状态。

  2. 设置动画插值器:通过设置Animator的插值器(Interpolator),可以改变动画的速度曲线。例如,使用LinearInterpolator实现匀速动画,或使用AccelerateDecelerateInterpolator实现先加速后减速的效果。

  3. 优化UI线程:确保动画的更新操作在UI线程执行,避免在主线程中进行耗时操作,导致动画卡顿。可以通过TaskDispatcher将耗时操作分配到其他线程,保持UI线程的流畅性。

  4. 减少不必要的重绘:在进度条更新时,避免频繁调用invalidate()方法,减少不必要的重绘。可以通过postInvalidate()方法在合适的时机触发重绘。

  5. 使用硬件加速:启用硬件加速可以提高动画的流畅性。可以通过在布局文件中设置android:hardwareAccelerated="true"来启用硬件加速。

以下是一个简单的代码示例,展示如何使用Animator组件优化进度条动画:

import animator from '@ohos.animator';

let progressBar = ...; // 获取进度条组件
let animator = animator.createAnimator({
  duration: 1000, // 动画时长
  interpolator: 'linear', // 插值器
  from: 0, // 起始值
  to: 100 // 结束值
});

animator.onUpdate((value) => {
  progressBar.setProgress(value); // 更新进度条
});

animator.start(); // 启动动画

通过以上方法,可以有效优化HarmonyOS鸿蒙Next中的进度条动画。

更多关于HarmonyOS鸿蒙Next中进度条组件进度条动画怎么优化得更好,或者怎么修改我的代码顺序呢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,优化进度条动画可以通过以下几点:

  1. 减少UI线程阻塞:将耗时操作放在子线程,避免主线程卡顿。

  2. 使用硬件加速:确保CanvasAnimation启用硬件加速,提升渲染性能。

  3. 合理设置刷新频率:避免频繁调用invalidate(),根据需求调整刷新间隔。

  4. 优化绘制逻辑:减少不必要的绘制操作,如避免重复计算。代码顺序上,建议先初始化组件,再启动动画,确保资源加载完成后再执行动画逻辑。

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