为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
鸿蒙

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


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


https://img1.sycdn.imooc.com/4f2b3368093ebb9a07680330.jpg


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


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


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##工具效率#


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
1
获赞与收藏
1

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消