鸿蒙Next数据面板组件DataPanel介绍

数据面板组件,用于将多个数据占比情况使用占比图进行展示。

本文介绍,环形、线性、自定义柱状面板。 可根据实际需求选取合适的面板类型。

注意:最多包含9个数据,数据面板的类型(不支持动态修改)

看一下演示效果和源码:

kotlin 复制代码
@Entry
@ComponentV2
struct DataPanelTest{
  public color1: string = "#65ff00dd"
  public color2: string = "#6500ff99"
  public color3: string = "#65ffe600"
  public color4: string = "#6595ff00"
  public color5: string = "#65000dff"
  public color6: string = "#650099ff"
  @Local values:number[]=[]  //数据值列表,最多包含9个数据,大于9个数据则取前9个数据
  @Local max:number=512  //表示数据的最大值
  @Local type:DataPanelType=DataPanelType.Line //数据面板 圆形/直线

  @Local closeEffect:boolean = false //数据占比图表旋转动效和投影效果
  //设置各数据段颜色 支持渐变色
  @Local valueColors:Array<ResourceColor | LinearGradient>=[this.color1, this.color2, this.color3, this.color4, this.color5, this.color6]
  @Local trackBackgroundColor:ResourceColor='#08182431' //设置底板颜色
  @Local strokeWidth:Length = 24 //设置圆环粗细
  @Local offsetX: number = 15
  @Local offsetY: number = 15 //X轴的偏移量
  @Local radius: number = 5  //投影模糊半径

  @Local trackShadow:DataPanelShadowOptions|null = {
    radius: this.radius,
    colors: this.valueColors,
    offsetX: this.offsetX,
    offsetY: this.offsetY
  }
  aboutToAppear(): void {
    this.values=[]
    for (let index = 0; index < 6; index++) {
      this.values.push(Math.random()*100)
    }
  }

  build() {
    Column({space:10}){
      DataPanel({ values: this.values, max: this.max, type: DataPanelType.Circle })
        .width(200)
        .height(200)
        .closeEffect(this.closeEffect)
        .valueColors(this.valueColors)
        .trackShadow(this.trackShadow)
        .strokeWidth(this.strokeWidth)
        .trackBackgroundColor(this.trackBackgroundColor)

      DataPanel({ values: this.values, max: this.max, type: DataPanelType.Line })
        .width(300)
        .height(20)
        .closeEffect(this.closeEffect)
        .valueColors(this.valueColors)
        .trackShadow(this.trackShadow)
        .strokeWidth(this.strokeWidth)
        .trackBackgroundColor(this.trackBackgroundColor)

      DataPanel({ values:this.values, max: this.max })
        .width('100%')
        .height(300)
        .contentModifier(new DataPanelBuilder()) //定制DataPanel内容区的方法

      Row({space:10}){

        Button('修改数据').onClick(()=>{
          this.values=[]
          for (let index = 0; index < 6; index++) {
            this.values.push(Math.random()*100)
          }
        })
      }
    }
  }
}
@Builder
function buildDataPanel(config: DataPanelConfiguration) {
  Column() {
    Row({space:10}) {
      ForEach(config.values, (item: number, index: number) => {
        ChildItem({ item: item, index: index, max: config.maxValue })
      }, (item: string) => item)
    }.alignItems(VerticalAlign.Bottom)

    Column() {
      Line().width("100%").backgroundColor("#ff373737").margin({ bottom: 5 })
    }.padding({ left: 20, right: 20 })

    Row() {
      Text('Length=' + config.values.length + '    ').margin({ left: 10 }).align(Alignment.Start)
      Text('Max=' + config.maxValue).margin({ left: 10 }).align(Alignment.Start)
    }
  }
}
@Component
struct ChildItem {
  @Prop item: number;
  @Prop index: number;
  @Prop max: number;
  public color1: string = "#65ff00dd"
  public color2: string = "#6500ff99"
  public color3: string = "#65ffe600"
  public color4: string = "#6595ff00"
  public color5: string = "#65000dff"
  public color6: string = "#650099ff"
  public colorArray: Array<string> = [this.color1, this.color2, this.color3, this.color4, this.color5, this.color6]

  build() {
    Column() {
      Text(" " + this.item.toFixed(2))
        .fontSize(17)
      Rect()
        .height(this.item * 300 / this.max)
        .width(25)
        .foregroundColor(this.colorArray[this.index])
        .radius(5)
        .align(Alignment.Start)

    }.justifyContent(FlexAlign.End)
  }
}
class DataPanelBuilder implements ContentModifier<DataPanelConfiguration> {
  constructor() {
  }
  applyContent(): WrappedBuilder<[DataPanelConfiguration]> {
    //将数据面板的 values 和 maxValue 传递给 自定义组件
    return wrapBuilder(buildDataPanel)
  }
}
相关推荐
高心星4 小时前
鸿蒙5.0项目开发——V2装饰器@Event的使用
harmonyos
ChinaDragon5 小时前
HarmonyOS:创建ArkTS卡片
harmonyos
高心星5 小时前
HarmonyOS 5.0应用开发——V2装饰器@once的使用
harmonyos
程序员潘Sir9 小时前
鸿蒙应用开发从入门到实战(六):ArkTS声明式UI和组件化
harmonyos·鸿蒙
猫林老师11 小时前
HarmonyOS数据持久化:Preferences轻量级存储实战
华为·harmonyos
Devil枫15 小时前
鸿蒙深链落地实战:从安全解析到异常兜底的全链路设计
安全·华为·harmonyos
低调小一1 天前
Android传统开发 vs Android Compose vs HarmonyOS ArkUI 对照表
android·华为·harmonyos
程序员江同学1 天前
ovCompose + AI 开发跨三端的 Now in Kotlin App
android·kotlin·harmonyos