HarmonyOS鸿蒙Next中进度条组件进度条动画怎么优化得更好,或者怎么修改我的代码顺序呢
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
在HarmonyOS鸿蒙Next中,优化进度条动画可以通过以下几种方式实现:
-
使用
Animator
组件:通过Animator
组件控制进度条动画的播放,可以更精确地控制动画的时长、速度曲线等。Animator
提供了start
、pause
、resume
等方法,可以根据需要灵活控制动画的播放状态。 -
设置动画插值器:通过设置
Animator
的插值器(Interpolator),可以改变动画的速度曲线。例如,使用LinearInterpolator
实现匀速动画,或使用AccelerateDecelerateInterpolator
实现先加速后减速的效果。 -
优化UI线程:确保动画的更新操作在UI线程执行,避免在主线程中进行耗时操作,导致动画卡顿。可以通过
TaskDispatcher
将耗时操作分配到其他线程,保持UI线程的流畅性。 -
减少不必要的重绘:在进度条更新时,避免频繁调用
invalidate()
方法,减少不必要的重绘。可以通过postInvalidate()
方法在合适的时机触发重绘。 -
使用硬件加速:启用硬件加速可以提高动画的流畅性。可以通过在布局文件中设置
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中,优化进度条动画可以通过以下几点:
-
减少UI线程阻塞:将耗时操作放在子线程,避免主线程卡顿。
-
使用硬件加速:确保
Canvas
或Animation
启用硬件加速,提升渲染性能。 -
合理设置刷新频率:避免频繁调用
invalidate()
,根据需求调整刷新间隔。 -
优化绘制逻辑:减少不必要的绘制操作,如避免重复计算。代码顺序上,建议先初始化组件,再启动动画,确保资源加载完成后再执行动画逻辑。