[UI动效] HarmonyOS鸿蒙Next数字滚动组件(没小数,没分隔符,可以加前缀后缀)

[UI动效] HarmonyOS鸿蒙Next数字滚动组件(没小数,没分隔符,可以加前缀后缀) 运行效果

cke_322.gif

思考:如果我要做分隔符,一定会做4位分隔符,符合中国人习惯。。。最好人家来适应我们。。。

@Entry
@Component
struct 滚动数字 {
  @State g滚:boolean=true

  build() {
    Column({space:20}) {
      Row(){
        Button('重置').type(ButtonType.Normal).borderRadius(6).fontSize(25)
          .onClick(async () =>{
            this.g滚=false
            await new Promise(resolve=>{
              setTimeout(()=>resolve(this.g滚=true),50)
            })
          })
      }.width('60%').height(60).justifyContent(FlexAlign.SpaceEvenly)
      .zIndex(200)

      if(this.g滚){
        szgd数字滚动({
          sz数字:'163',
          hz后缀:'%',
          ztdx字体大小:20,ztcx字体粗细:800,ztys字体颜色: '#fff30000'
        })

        szgd数字滚动({
          qz前缀:'¥',qzztdx前缀字体大小:20,
          sz数字:'82087',
          hz后缀:'元', hzztdx后缀字体大小:20,
          ztdx字体大小:40, ztcx字体粗细:800, ztys字体颜色: '#ffffffff'
        })

        szgd数字滚动({sz数字:'99287',hz后缀:' 千克', ztdx字体大小:15, ztcx字体粗细:200, ztys字体颜色: '#ff0099ff'})

        szgd数字滚动({
          qz前缀:'+',qzztdx前缀字体大小:30,
          sz数字:'19985654',
          ztdx字体大小:40, ztcx字体粗细:800, ztys字体颜色: '#ffff5009'
        })

      }

    }.width('100%').height('100%').backgroundColor('#000').padding({top:20,bottom:20}).justifyContent(FlexAlign.Start)

  }
}

//从高位到低位滚动
@Component
struct szgd数字滚动 {
  @State sz数字:string=''
  qz前缀:string=''
  qzztdx前缀字体大小:number=0
  hz后缀:string=''
  hzztdx后缀字体大小:number=0
  ztdx字体大小:number=20
  ztcx字体粗细:number=600
  ztys字体颜色:string='#ddd'
  @State tempsz:string = ''
  @State szsz数字数组:string[] = []
  @State tempszsz数字数组:string[]=[]
  @State py偏移数组:number=[]
  yc延迟:number=300
  nb:number[]=[0,1,2,3,4,5,6,7,8,9,0]
  @State kg开滚:boolean=false
  zg字高:number=0

  fgsz分割数字(sz:string){
    let szsz:string[]=[]
    let py:number[]=[]
    let temp:string[]=[]
    for (let i = 0; i < sz.length; i++) {
      szsz.push(sz.charAt(i))
      py.push(0)
      temp.push('')
    }
    this.szsz数字数组=szsz
    this.py偏移数组=py
    this.tempszsz数字数组=temp
    this.kg开滚=false
  }

  async gun正向滚(){
    this.zg字高=fp2px(this.ztdx字体大小 * 0.6)
    if(this.qzztdx前缀字体大小==0){this.qzztdx前缀字体大小=this.ztdx字体大小}
    if(this.hzztdx后缀字体大小==0){this.hzztdx后缀字体大小=this.ztdx字体大小}
    const gun = await new Promise(resolve =>{
      setTimeout(()=>{
        resolve(this.fgsz分割数字(this.sz数字));
      }, 100);
    }).then(()=>{
      setTimeout(()=>{
        this.kg开滚 = true
        for (let i = 0; i < this.szsz数字数组.length; i++) {
          setTimeout(()=>{
            this.tempszsz数字数组[i] = this.szsz数字数组[i].toString()
          }, 200)
        }
      },300)
    })
  }

  jspy计算偏移(i:number):number{
    let py
    animateTo({
      duration:800,
      curve:Curve.LinearOutSlowIn,
      delay:i*20
    },()=>{
      let nb=this.tempszsz数字数组[i]
      py=-nb*this.zg字高
    })
    return py
  }

  build() {
    Row({space:5}){
      if(this.kg开滚) {
        Text(this.qz前缀)
          .fontSize(this.qzztdx前缀字体大小).fontColor(this.ztys字体颜色)
          .fontWeight(this.ztcx字体粗细)
          .height(this.zg字高)

        ForEach(this.szsz数字数组,(nb:string,i:number)=>{
          Row () {
            Column () {
              ForEach(this.nb, (i: number) =>{
                Text(i.toString())
                  .fontSize(this.ztdx字体大小).fontColor(this.ztys字体颜色)
                  .fontWeight(this.ztcx字体粗细)
                  .height(this.zg字高)
              })
            }.justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Center)
            .translate({ y: this.jspy计算偏移(i) })
            .animation({
              duration: 500 * (i + 1),
              delay: 500 * i,
              curve: Curve.FastOutSlowIn
            })
          }.height(this.zg字高).justifyContent(FlexAlign.Center).clip(true)
          .transition({opacity:0})
        })

        Text(this.hz后缀)
          .fontSize(this.hzztdx后缀字体大小).fontColor(this.ztys字体颜色)
          .fontWeight(this.ztcx字体粗细)
          .height(this.zg字高)
      }

    }.justifyContent(FlexAlign.Center).zIndex(10)
    .onAppear(()=>this.gun正向滚())
    .onClick(()=>this.gun正向滚())
  }
}

更多关于[UI动效] HarmonyOS鸿蒙Next数字滚动组件(没小数,没分隔符,可以加前缀后缀)的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

HarmonyOS鸿蒙Next的数字滚动组件是一种用于在UI中展示数字动态变化效果的组件。该组件支持整数数字的滚动效果,不支持小数和分隔符,但可以添加前缀和后缀。开发者可以通过配置组件的属性来实现数字的动态变化,例如设置起始值、结束值、滚动速度等。该组件适用于需要展示数字变化的场景,如计数器、计时器等。

更多关于[UI动效] HarmonyOS鸿蒙Next数字滚动组件(没小数,没分隔符,可以加前缀后缀)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,实现数字滚动组件可以通过Text组件结合动画效果来实现。首先,使用Text组件显示数字,并通过State管理当前显示的数字。然后,使用Animation组件创建滚动效果,通过onFrame回调逐帧更新数字。可以添加前缀和后缀作为Text组件的子元素。确保动画平滑,避免卡顿,可通过Easing函数优化动画曲线。

回到顶部