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

布局王
• 阅读 4

前些天发现一个问题,鸿蒙官方的进度条组件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##工具效率#

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章教会你使用JS+CSS实现一个简单加载进度条的效果
大家好,我是前端进阶者,今天给大家来做个小项目,一起来看看吧一、前言我们经常在网页上,游戏界面加载时会看到加载进度条的效果,我们往往会以为这些加载进度条的效果,很难实现。今天教大家JSCSS结合做简单一个加载进度条的效果。二、项目准备软件:HBuilderX。三、项目实现1\.body创建2个div,外部div添加id"progress"属
Easter79 Easter79
3年前
vue+element UI + axios封装文件上传及进度条组件
1.前言之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人。项目用的是Vue框架,UI库使用的是elementUI,前后端交互请求使用的是Vue官方推荐的axios。其中,UI方面主要使用了elementUI库中的Upload文件上传组件、Progress
Wesley13 Wesley13
3年前
java eleven进度条
一个矩形组件MethodDescribleJProgrssBar()不带进度字符,最小值0最大值100的水平进度条JProgressBar(intorient)VERTICAL/HORIZONTALJProgressBar(intin,intmax)指定最大最小的水平进度条JProgressBar(intorien
Stella981 Stella981
3年前
PhoneGAP实现带进度条的文件上传(支持任意类型文件)
由于公司的业务需要,要实现PhoneGAP文件上传并显示进度条。一开始没有仔细看PhoneGAPAPI就草草开工,后来通过logcat才发现,上传过程中居然有动态刷新上传的字节数据。顿时泪奔,我手动实现的上传进度监听啊,不过既然写了,多少就有收获,详情见:http://blog.csdn.net/herestay/article/details/85679
Stella981 Stella981
3年前
React Native (一) react
ReactNative(一)reactnativevideo实现音乐播放器和进度条的功能功能:1.卡片滑动切歌2.显示进度条效果图:!(https://oscimg.oschina.net/oscnet/3c
Stella981 Stella981
3年前
HarmonyOS应用开发项目实战
鸿蒙2.0已经发布了有段时间了,目前网上也有些小demo了,但是缺乏稍微大点的项目代码。我准备计划开发一个稍微正式点的项目,我写了个初略的项目需求清单,来体验鸿蒙应用开发。目前我已经着手实现了其中的一些重要功能,某些功能发现鸿蒙暂时不支持,但是还是先写上吧,后面慢慢摸索。我会陆续更新连载此贴,一步步从0基础讲解项目开发过程,然后巩固鸿蒙应用开发知识点。有错误
陈杨 陈杨
2天前
鸿蒙5开发宝藏案例分享---Grid性能优化案例
发现鸿蒙宝藏:优化Grid组件性能的实战技巧!大家好呀!最近在鸿蒙开发者社区挖到一个超实用的性能优化案例——​​解决Grid组件加载慢、滚动卡顿的问题​​。官方其实藏了不少宝藏案例,但很多人可能没注意到。今天我就带大家拆解这个案例,加上详细讲解和代码分析,
布局王 布局王
13小时前
详解HarmonyOS NEXT系统中ArkTS和仓颉的混合开发
连续分享了很多天鸿蒙仓颉语言的开发教程,大家现在应该都知道鸿蒙开发有ArkTs和仓颉两种开发语言,这两种语言有些相似,而且还支持混合开发,今天就分享一下怎么实现ArkTs和仓颉的混合开发,分不清这两种语言的友友今天可能要头疼了。官方文档对这两种语言的混合开
GeorgeGcs GeorgeGcs
4小时前
【HarmonyOS NEXT】鸿蒙使用ScanKit实现自定义扫码 (一)之业务流程和扫码
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言鸿蒙官方提供了ScanKit来实现自定义扫码的功能诉求。但是对于扫码业务的讲解缺失,所以这篇文章主要是通过扫码业务路程,串连官方Kit的接口。让大家能更深刻的理解自定义扫码业务。官
GeorgeGcs GeorgeGcs
2小时前
【HarmonyOS 5】鸿蒙中进度条的使用详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、HarmonyOS中Progress进度条的类型HarmonyOS的ArkUI框架为开发者提供了多种类型的进度条,每种类型都有其独特的样式,以满足不同的设计需求。以下是几种常见的进度条