写点什么

在鸿蒙开发中实现自定义进度条

作者:幽蓝计划
  • 2025-06-03
    山东
  • 本文字数:1728 字

    阅读完需:约 6 分钟

前些天发现一个问题,鸿蒙官方的进度条组件 Progress 虽然提供了比较丰富的功能,但是有时候还是不能满足开发的需要。


比如有时候我需要在进度条上有个圆点来控制进度,Progress 就没有提供这种样式,所以今天就跟大家分享一下自定义进度条的实现过程。



这里我使用层叠布局,将黑色的总长度部分和白色部分进行层叠,白色部分的直线和圆点使用横向布局,当进度变化时只需要修改白色直线部分的长度,圆点会自动跟随移动。


然后给圆点添加拖动手势,这样一个带圆点的进度条就完成了,比较简单,直接把封装好的完整代码贴在下面:


import { componentUtils } from "@kit.ArkUI"@Component export struct yl_progress{  @Prop total:number = 0  @Prop @Watch('valueChangeAction') value:number = 0  valueChange:(value:number)=>void=()=>{}  @State private  progressWidth:number = 200  @State private  positionX:number = 0  @State private offsetX: number = 0;  @State private paning: boolean = false;  valueChangeAction(){    this.positionX =  this.progressWidth *this.value/this.total    if(this.positionX >= this.progressWidth){      this.positionX = this.progressWidth    }    if(this.positionX <= 0){      this.positionX = 0    }  }  aboutToAppear(): void {    setTimeout(()=>{      this.progressWidth = px2vp(componentUtils.getRectangleById('ylprogress').size.width)      this.positionX =  this.progressWidth *this.value/this.total    },20) }  build() {    Stack({alignContent:Alignment.Start}){      Row(){      }      .width('100%')      .height(4)      .borderRadius(2)      .backgroundColor(Color.Black)      .opacity(0.5)      Row(){        Row()          .width(this.paning?this.offsetX:this.positionX)          .height(4)          .borderRadius(2)          .backgroundColor(Color.White)        Row(){        }        .width(15)        .height(15)        .borderRadius(7.5)        .backgroundColor(Color.White)        .margin({left:-7})        .gesture(          // 绑定拖动手势          PanGesture()            .onActionStart((event: GestureEvent|undefined) => {              console.info('Pan start');              this.paning = true            })              // 当触发拖动手势时,根据回调函数修改组件的布局位置信息            .onActionUpdate((event: GestureEvent|undefined) => {              if(event){                this.offsetX = this.positionX + event.offsetX;                if(this.offsetX >= this.progressWidth){                  this.offsetX = this.progressWidth                }                if(this.offsetX <= 0){                  this.offsetX = 0                }                let rate = this.offsetX/this.progressWidth                let currentValue = Math.round(this.total* rate)                this.valueChange(currentValue)              }            })            .onActionEnd(() => {              this.paning = false              this.positionX = this.offsetX;              if(this.positionX >= this.progressWidth){                this.positionX = this.progressWidth              }              if(this.positionX <= 0){                this.positionX = 0              }              this.value = Math.round(this.total*this.positionX/this.progressWidth)              this.valueChange(this.value)            })        )      }    }    .id('ylprogress')    .height(15)    .width(this.progressWidth)  }}
复制代码


使用的时候:

yl_progress({total:100,value:40,valueChange:(value)=>{  console.log('进度条拖拽事件:',value);  } }) .margin({top:100})
复制代码

以上就是今天的内容,感谢阅读。#HarmonyOS 语言 ##ArkTS##工具效率 #

发布于: 刚刚阅读数: 5
用户头像

幽蓝计划

关注

还未添加个人签名 2025-05-09 加入

还未添加个人简介

评论

发布
暂无评论
在鸿蒙开发中实现自定义进度条_幽蓝计划_InfoQ写作社区