LinearIndicator

线性导航条组件,可以包含多个进度条,用于显示内容加载或操作处理等进度。

说明:

该组件从API Version 18开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

子组件

不包含子组件。

接口

LinearIndicator(count?: number, controller?: LinearIndicatorController)

线性导航条组件的构造函数,可配置该组件的进度条个数与控制器。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

名称 类型 必填 说明
count number 指定进度条个数。
改变进度条个数时,从尾部开始增加或删除指定个数的进度条。
默认值为5,最小值为2,小于2时按2处理。
指定值有小数时,向下取整。
controller LinearIndicatorController 设置控制器,可通过该参数控制进度条播放、暂停、停止、设置进度条的当前索引以及在该索引下进度条的进度。

属性

除支持通用属性外,还支持以下属性:

indicatorStyle

indicatorStyle(style: Optional<LinearIndicatorStyle>)

设置导航条样式属性。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

名称 类型 必填 说明
style Optional<LinearIndicatorStyle> 导航条样式。
可通过该参数控制进度条之间的间隔、高度、圆角半径以及已完成播放的进度条颜色与剩余未播放的进度条颜色。

indicatorLoop

indicatorLoop(loop: Optional<boolean>)

设置是否支持循环播放。循环播放为true时,当最后一个进度条播放完成,会等待预先设置的间隔毫秒数后,从第一个进度条重新开始播放。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

名称 类型 必填 说明
loop Optional<boolean> 是否支持循环播放。
true:支持循环播放。false:不支持循环播放。
默认值:true。

事件

除支持通用事件外,还支持以下事件:

onChange

onChange(callback: Optional<OnLinearIndicatorChangeCallback>)

设置进度条变化时的回调函数,当进度发生变化时会触发该回调。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

名称 类型 必填 说明
callback Optional<OnLinearIndicatorChangeCallback> 回调函数。
通过该回调函数可获取当前进度条的索引值与进度值。

LinearIndicatorController

LinearIndicator的控制器。可控制进度条的播放、暂停、停止以及设置指定进度条的指定进度。

constructor

constructor()

LinearIndicatorController的构造函数。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

setProgress

setProgress(index: number, progress: number): void

为与index相对应的进度条设定进度值。所有小于index的进度条进度将统一调整至100%。而所有大于index的进度条进度则统一调整为0%。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

名称 类型 必填 说明
index number 进度条序号。
取值范围:[0, 进度条数量-1]。
默认值:0。
设置取值范围外的数值时,直接返回不做任何处理。指定值有小数时,向下取整。
当设置为undefined或null时,使用默认值。
progress number 播放进度。
取值范围:[0, 100]。
默认值:0。
设置范围外的数值时直接返回不做任何处理。
当设置为undefined或null时,使用默认值。

start

start(options?: LinearIndicatorStartOptions): void

开始自动播放,可以指定自动播放参数,每一个进度条的自动播放参数相同。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

名称 类型 必填 说明
options LinearIndicatorStartOptions 开始播放,指定自动播放参数。

pause

pause(): void

暂停播放。如果当前为自动播放状态,将切换至暂停播放状态。若已处于暂停播放状态,则维持现状。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

stop

stop(): void

停止播放。调用后将恢复成初始状态(当前索引值为0,进度值为0)。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

LinearIndicatorStyle

组件内置进度条属性信息。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 类型 必填 说明
space LengthMetrics 进度条之间的间隔。
不支持百分比的值。
当设置为undefined或null时,使用默认值。
默认值:4vp。
strokeWidth LengthMetrics 进度条的高度。
不支持百分比的值。
大于进度条长度时取值为进度条长度。
当设置为undefined或null时,使用默认值。
默认值:2vp。
strokeRadius LengthMetrics 进度条的圆角半径。
不支持百分比的值。
大于"strokeWidth/2"时,按"strokeWidth/2"处理。小于0时按默认值处理。
取值范围:[0, strokeWidth/2]
当设置为undefined或null时,使用默认值。
默认值:1vp。
trackBackgroundColor ColorMetrics 进度条未播放时的颜色。
当设置为undefined或null时,使用默认值。
默认值:comp_background_tertiary。
trackColor ColorMetrics 进度条播放时的颜色。
当设置为undefined或null时,使用默认值。
默认值:comp_background_emphasize

LinearIndicatorStartOptions

自动播放参数。

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

名称 类型 必填 说明
interval number 自动播放时两个进度条切换间隔的时间。默认值为0毫秒,小于0时按默认值处理。
duration number 每个进度条从0%到100%消耗的时间。默认值为4000毫秒,小于0时按1毫秒处理。

OnLinearIndicatorChangeCallback

进度条变化时的回调函数。

type OnLinearIndicatorChangeCallback = (index: number, progress: number) => void

原子化服务API: 从API Version 18开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

名称 类型 必填 说明
index number 进度条的当前序号。
progress number 进度条的当前进度。

示例

示例1(控制进度条的播放状态)

该示例通过创建LinearIndicatorController对象并将该对象与LinearIndicator绑定,实现了控制线性导航条的交互功能。

import { LengthMetrics } from '@kit.ArkUI'
import { ColorMetrics } from '@kit.ArkUI'

@Entry
@Component
struct PageIndicatorStyle {
  controller: LinearIndicatorController = new LinearIndicatorController()
  @State count:number= 5
  @State spaceValue: number|undefined = 4
  @State width1Value: number|undefined = 2
  @State radiusValue: number|undefined = 1
  @State space: LengthMetrics | undefined= LengthMetrics.vp(this.spaceValue)
  @State width1: LengthMetrics | undefined = LengthMetrics.vp(this.width1Value)
  @State radius: LengthMetrics | undefined = LengthMetrics.vp(this.radiusValue)
  @State trackBgColor: ColorMetrics | undefined = ColorMetrics.resourceColor("#19182431")
  @State trackColor1: ColorMetrics | undefined = ColorMetrics.resourceColor("#ff007dff")
  @State loop: boolean = true
  @State interval:number = 0
  @State duration:number = 4000
  @State onChangeIndex : number = 0
  @State onChangeProgress : number = 0
  @State progress:number = 50
  @State index:number = 4

  build() {
    Row() {
      Column() {
        LinearIndicator(this.count,this.controller)
          .indicatorLoop(this.loop)
          .onChange((index:number,progress:number)=>{
            this.onChangeIndex = index;
            this.onChangeProgress = progress;
          })
          .indicatorStyle({
            space:this.space,
            strokeWidth: this.width1,
            strokeRadius: this.radius,
            trackBackgroundColor: this.trackBgColor,
            trackColor: this.trackColor1
          })
          .border({
            width:1,
            color:Color.Red
          })
          .margin({top:20})
        Text("onChangeIndex:"+this.onChangeIndex).width("100%").margin(20)
        Text("onChangeProgress:"+this.onChangeProgress.toFixed(2)).width("100%").margin({bottom:20})
        Row({space:10}){
          Button('开始播放').onClick(() => {
            this.controller.start({interval:Number(this.interval),duration:Number(this.duration)})
          })
          Button('暂停').onClick(() => {
            this.controller.pause()
          })
          Button('停止').onClick(() => {
            this.controller.stop()
          })
        }.margin({bottom:10})
        Row({space:10}){
          Button('设置进度').onClick(() => {
            this.controller.setProgress(Number(this.index),Number(this.progress))
          })
          Button('循环').onClick(() => {
            this.loop = true;
          })
          Button('不循环').onClick(() => {
            this.loop = false;
          })
        }
      }
      .height("100%")
      .justifyContent(FlexAlign.Start)
      .width('100%')
    }
    .height('100%')
  }
}

linearindicator

示例2(与Swiper联动)

该示例通过Swiper的onChange回调函数控制LinearIndicator的控制器,实现在Swiper页面变动时LinearIndicator的进度条也会随之变化的联动效果。

import { ColorMetrics, LengthMetrics } from '@kit.ArkUI'

class MyDataSource implements IDataSource {
  private list: number[] = []

  constructor(list: number[]) {
    this.list = list
  }

  totalCount(): number {
    return this.list.length
  }

  getData(index: number): number {
    return this.list[index]
  }

  registerDataChangeListener(listener: DataChangeListener): void {
  }

  unregisterDataChangeListener() {
  }
}

@Entry
@Component
struct SwiperAndLinearIndicator {
  private  controller: LinearIndicatorController = new LinearIndicatorController()
  private swiperController: SwiperController = new SwiperController()
  private data: MyDataSource = new MyDataSource([])
  @State autoPlay:boolean = true

  aboutToAppear(): void {
    let list: number[] = []
    for (let i = 1; i <= 5; i++) {
      list.push(i);
    }
    this.data = new MyDataSource(list)
  }

  onPageShow(): void {
    this.controller.start({ interval: 0, duration: 2500})
  }

  build() {
    Column({ space: 5 }) {
      Swiper(this.swiperController) {
        LazyForEach(this.data, (item: string) => {
          Text(item.toString())
            .width('90%')
            .height(160)
            .backgroundColor(0xAFEEEE)
            .textAlign(TextAlign.Center)
            .fontSize(30)
        }, (item: string) => item)
      }
      .indicator(false)
      .interval(3000)
      .loop(true)
      .autoPlay(this.autoPlay)
      .itemSpace(10)
      .onChange((index)=>{
        this.controller.setProgress(index, 0)
        this.controller.start({ interval:0, duration:2500})
      })
      LinearIndicator(this.data.totalCount(), this.controller)
        .indicatorLoop(true)
        .onChange((index: number, progress:number)=>{
          if (progress == 100) {
            this.controller.pause()
          }
        })
        .indicatorStyle({
          strokeWidth: LengthMetrics.vp(4),
          space: LengthMetrics.vp(20),
          strokeRadius:LengthMetrics.vp(2),
          trackBackgroundColor: ColorMetrics.resourceColor(Color.Blue),
          trackColor: ColorMetrics.resourceColor(Color.Pink)
        })
        .margin({ top:5 })
        .width(300)
      Button('播放')
        .onClick(() => {
          this.autoPlay = true
          this.controller.start({ interval: 0, duration: 2500 })
        })
        .margin(10)
      Button('暂停')
        .onClick(() => {
          this.autoPlay = false
          this.controller.pause()
        })
        .margin(10)
    }
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
  }
}

linearindicatorAndSwiper