#跟着若城学鸿蒙# UI组件篇-Slider及其属性

前言

在现代的用户界面设计中,交互性和直观性是至关重要的。为了实现这些目标,各种 UI 组件应运而生,其中滑块(Slider)组件因其简单直观的操作方式而被广泛应用于各种场景,如音量调节、亮度调节、进度指示等。ArkUI 作为一个强大的 UI 框架,提供了丰富的组件库,其中的 Slider 组件更是以其灵活性和可定制性受到了开发者的青睐。

本文将详细介绍 ArkUI 中的 Slider 组件,包括其基本概念、使用方法、属性配置、事件处理以及在实际应用中的最佳实践。通过对这些内容的深入探讨,希望能够帮助开发者更好地理解和使用 Slider 组件,从而提升应用的用户体验。

Slider 组件的基本概念

Slider 组件,顾名思义,是一种用于快速调节设置值的用户界面元素。它通常表现为一个水平的或垂直的轨道,用户可以通过拖动轨道上的滑块来选择一个值。这种交互方式不仅直观,而且能够提供即时的视觉反馈,使用户能够清楚地了解当前选择的值。

在 ArkUI 中,Slider 组件不仅支持基本的滑动功能,还提供了丰富的样式和交互方式的自定义选项。开发者可以根据具体需求,通过配置不同的属性和事件,实现各种复杂的滑动条功能,以满足各种应用场景的需求。

Slider 组件的使用方法

基本用法

在 ArkUI 中使用 Slider 组件非常简单。首先,需要在项目的依赖中引入 Slider 组件所在的模块。然后,在需要使用 Slider 组件的地方,通过相应的标签或 API 调用即可。

以下是一个基本的 Slider 组件使用示例:


@Entry
@Component
struct SliderExample {
  @State value: number = 50;

  build() {
    Column() {
      Slider({ value: this.value }).onChange((value: number) => {
        this.value = value;
      });
      Text(`当前值: ${this.value}`);
    }.width('100%').height('100%');
  }
}

在这个示例中,我们创建了一个 Slider 组件,并将其初始值设置为 50。当用户拖动滑块时,Slider 组件会触发 onChange 事件,我们将事件回调中返回的新值赋给 this.value,并通过 Text 组件显示出来。

属性配置

Slider 组件提供了丰富的属性,开发者可以通过这些属性来定制 Slider 的外观和行为。以下是一些常用的属性:

  • value: 当前进度值。默认值与 min 参数一致。
  • min: 设置最小值。默认值为 0。
  • max: 设置最大值。默认值为 100。
  • step: 设置滑动步长。默认值为 1。
  • style: 设置 Slider 的滑块与滑轨显示样式。默认值为 SliderStyle.OutSet
  • direction: 设置滑动条滑动方向为水平或竖直方向。默认值为 Axis.Horizontal
  • reverse: 设置滑动条取值范围是否反向。默认值为 false

以下是一个配置了多个属性的 Slider 组件示例:

 
@Entry
@Component
struct SliderExample {
  @State value: number = 50;

  build() {
    Column() {
      Slider({
        value: 50,
        min: 0,
        max: 100,
        step: 5,
        style: SliderStyle.InSet,
        direction: Axis.Vertical,
        reverse: true
      }).onChange((value: number) => {
        console.log(`当前值: ${value}`);
      });
      Text(`当前值: ${this.value}`);
    }.width('100%').height('100%');
  }
}

在这个示例中,我们设置了一个垂直方向的 Slider 组件,取值范围为 0 到 100,步长为 5,并且取值范围反向。当用户拖动滑块时,会在控制台输出当前值。

事件处理

Slider 组件支持多种事件,开发者可以通过监听这些事件来实现更复杂的交互逻辑。以下是一些常用的事件:

  • onChange: Slider 拖动或点击时触发事件回调。回调函数接收两个参数:当前滑动进度值和事件触发的相关状态值。

以下是一个监听 onChange 事件的示例:

 
@Entry
@Component
struct SliderExample {
  @State value: number = 50;

  build() {
    Column() {
      Slider({
        value: 50,
        min: 0,
        max: 100,
        step: 5
      }).onChange((value: number, mode: SliderChangeMode) => {
        if (mode === SliderChangeMode.Begin) {
          console.log('开始滑动');
        } else if (mode === SliderChangeMode.Moving) {
          console.log(`滑动中: ${value}`);
        } else if (mode === SliderChangeMode.End) {
          console.log(`滑动结束: ${value}`);
        }
      });
      Text(`当前值: ${this.value}`);
    }.width('100%').height('100%');
  }
}

在这个示例中,我们监听了 onChange 事件,并根据事件触发的状态值输出不同的日志信息。

Slider 组件的属性详解

常用属性

  • value: 当前进度值。默认值与 min 参数一致。从 API version 10 开始,该参数支持双向绑定变量。取值范围:[min, max]。小于 min 时取 min,大于 max 时取 max。
  • min: 设置最小值。默认值:0。
  • max: 设置最大值。默认值:100。说明:min >= max 异常情况,min 取默认值 0,max 取默认值 100。value 不在 [min, max] 范围之内,取 min 或者 max,靠近 min 取 min,靠近 max 取 max。
  • step: 设置 Slider 滑动步长。默认值:1。取值范围:[0.01, max - min]。说明:若设置的 step 值小于 0 或大于 max 值时,则按默认值显示。
  • style: 设置 Slider 的滑块与滑轨显示样式。默认值:SliderStyle.OutSet。
  • direction: 设置滑动条滑动方向为水平或竖直方向。默认值:Axis.Horizontal。
  • reverse: 设置滑动条取值范围是否反向。默认值:false。值为 true 时,横向 Slider 从右往左滑动,竖向 Slider 从下往上滑动。值为 false 时,横向 Slider 从左往右滑动,竖向 Slider 从上往下滑动。

样式属性

  • blockColor: 设置滑块的颜色。当滑块形状设置为 SliderBlockType.DEFAULT 时,blockColor 可设置默认圆形滑块颜色。当滑块形状设置为 SliderBlockType.IMAGE 时,滑块无填充,设置 blockColor 不生效。当滑块形状设置为 SliderBlockType.SHAPE 时,blockColor 可设置自定义形状的填充颜色。
  • trackColor: 设置滑轨的背景颜色。从 API version 12 开始支持利用 LinearGradient 设置滑轨的渐变色。
  • selectedColor: 设置滑轨的已滑动部分颜色。
  • showSteps: 设置当前是否显示步长刻度值。值为 true 时显示刻度值,值为 false 时不显示刻度值。默认值:false。
  • showTips: 设置滑动时是否显示气泡提示。当 direction 的值为 Axis.Horizontal 时,tip 显示在滑块上方,如果上方空间不够,则在下方显示。值为 Axis.Vertical 时,tip 显示在滑块左边,如果左边空间不够,则在右边显示。不设置周边边距或者周边边距比较小时,tip 会被截断。tip 的绘制区域为 Slider 自身节点的 overlay。

形状属性

  • blockBorderColor: 设置滑块描边颜色。当滑块形状设置为 SliderBlockType.DEFAULT 时,blockBorderColor 可设置默认圆形滑块描边颜色。当滑块形状设置为 SliderBlockType.IMAGE 时,滑块无描边,设置 blockBorderColor 不生效。当滑块形状设置为 SliderBlockType.SHAPE 时,blockBorderColor 可设置自定义形状中线的颜色。
  • blockBorderWidth: 设置滑块描边粗细。当滑块形状设置为 SliderBlockType.DEFAULT 时,blockBorderWidth 可设置默认圆形滑块描边粗细。当滑块形状设置为 SliderBlockType.IMAGE 时,滑块无描边,设置 blockBorderWidth 不生效。当滑块形状设置为 SliderBlockType.SHAPE 时,blockBorderWidth 可设置自定义形状中线的粗细。
  • stepColor: 设置刻度颜色。
  • trackBorderRadius: 设置底板圆角半径。原子化服务 API:从 API version 11 开始,该接口支持在原子化服务中使用。系统能力:SystemCapability.ArkUI.ArkUI.Full。
  • selectedBorderRadius: 设置已滑动部分(高亮)圆角半径。原子化服务 API:从 API version 12 开始,该接口支持在原子化服务中使用。系统能力:SystemCapability.ArkUI.ArkUI.Full。

尺寸属性

  • blockSize: 设置滑块大小。当滑块形状设置为 SliderBlockType.DEFAULT 时,取宽高的最小值作为圆形半径。当滑块形状设置为 SliderBlockType.IMAGE 时,用于设置图片的尺寸大小,图片采用 ObjectFit.Cover 策略进行缩放。当滑块形状设置为 SliderBlockType.SHAPE 时,用于设置自定义形状的大小,自定义形状也会采用 ObjectFit.Cover 策略进行缩放。
  • trackThickness: 设置滑轨的粗细。设置为小于等于 0 的值时,取默认值。为保证滑块和滑轨的 SliderStyle 样式,blockSize 跟随 trackThickness 同比例增减。当 style 为 SliderStyle.OutSet 时,trackThickness :blockSize = 1 :4,当 style 为 SliderStyle.InSet 时,trackThickness :blockSize = 5 :3。在变更 trackThickness 过程中,若 trackThickness 的大小或者 blockSize 的大小超过 slider 组件的 width 或者 height(SliderStyle.OutSet 时可能 trackThickness 没超过,但是 blockSize 超过了),取默认值。

交互属性

  • sliderInteractionMode: 设置用户与滑动条组件交互方式。默认值:SliderInteraction.SLIDE_AND_CLICK。
  • minResponsiveDistance: 设置滑动响应的最小距离。单位与参数 min 和 max 一致。当 value 小于 0、大于 MAX-MIN 或非法值时,取默认值。默认值:0。

内容定制属性

  • contentModifier: 定制 Slider 内容区的方法。原子化服务 API:从 API version 12 开始,该接口支持在原子化服务中使用。系统能力:SystemCapability.ArkUI.ArkUI.Full。

Slider 组件的事件详解

常用事件

  • onChange: Slider 拖动或点击时触发事件回调。回调函数接收两个参数:当前滑动进度值和事件触发的相关状态值。

事件回调参数

  • value: 当前滑动进度值,变化范围为对应步长 steps 数组。若返回值有小数,可使用 number.toFixed() 方法将数据处理为预期的精度。
  • mode: 事件触发的相关状态值。包括 Begin(手势/鼠标接触或者按下滑块)、Moving(正在拖动滑块过程中)、End(手势/鼠标离开滑块)、Click(点击滑动条使滑块位置移动)。

Slider 组件的最佳实践

响应式设计

在实际应用中,Slider 组件通常需要适应不同的屏幕尺寸和设备类型。为了实现响应式设计,开发者可以通过配置 style 属性和 blockSize 属性来调整 Slider 的外观。例如,在小屏幕设备上,可以将 blockSize 设置得较小,以提高操作的便利性。

 
@Entry
@Component
struct SliderExample {
  @State value: number = 50;

  build() {
    Column() {
      Slider({
        value: 50,
        min: 0,
        max: 100,
        step: 5,
        style: SliderStyle.InSet,

      }).blockSize({ width: 30, height: 30 })
        .onChange((value: number) => {
          console.log(`当前值: ${value}`);
        });
      Text(`当前值: ${this.value}`);
    }.width('100%').height('100%');
  }
}

自定义样式

Slider 组件提供了丰富的样式属性,开发者可以根据具体需求自定义 Slider 的外观。例如,可以通过设置 trackColorselectedColor 来改变滑轨的颜色,或者通过设置 blockColorblockBorderColor 来改变滑块的颜色和描边颜色。

 
@Entry
@Component
struct SliderExample {
  @State value: number = 50;

  build() {
    Column() {
      Slider({
        value: 50,
        min: 0,
        max: 100,
        step: 5,
        style: SliderStyle.OutSet,

      }).onChange((value: number) => {
        console.log(`当前值: ${value}`);
      }).trackColor(Color.Blue).selectedColor(Color.Green).blockColor(Color.White).blockColor(Color.Black)
      Text(`当前值: ${this.value}`);
    }.width('100%').height('100%');
  }
}

事件处理

在实际应用中,Slider 组件的事件处理是非常重要的。开发者可以通过监听 onChange 事件来实现对滑块值的实时监控和处理。例如,在音量调节场景中,可以通过监听 onChange 事件来实时调整音量大小。

 
@Entry
@Component
struct SliderExample {
  @State value: number = 50;

  build() {
    Column() {
      Slider({
        value: 50,
        min: 0,
        max: 100,
        step: 5
      }).onChange((value: number, mode: SliderChangeMode) => {
        if (mode === SliderChangeMode.End) {
          adjustVolume(value);
        }
      })

      Text(`当前值: ${this.value}`);
    }.width('100%').height('100%');
  }
}

function adjustVolume(value: number) {
  // 调整音量的逻辑
  console.log(`调整音量到: ${value}`);
} 

自定义内容

Slider 组件支持自定义内容,开发者可以通过 contentModifier 属性来自定义 Slider 的内容区。例如,可以在 Slider 的轨道上添加一些自定义的图形或文字。

 


@Builder function buildSlider(config: SliderConfiguration) {
  Row() {
    Column({space: 30}) {
      Progress({value: config.value, total: config.max, type:ProgressType.Ring})
        .margin({ top:20 })

      Button('增加').onClick(() => {
        config.value = config.value + config.step
        config.triggerChange(config.value, SliderChangeMode.Click)
      })
        .width(100)
        .height(25)
        .fontSize(10)
        .enabled(config.value<config.max)

      Button('减少').onClick(() => {
        config.value=config.value-config.step
        config.triggerChange(config.value, SliderChangeMode.Click)
      })
        .width(100)
        .height(25)
        .fontSize(10)
        .enabled(config.value>config.min)

      Slider({
        value: config.value,
        min: config.min,
        max: config.max,
        step:config.step,
      })
        .width(config.max)
        .visibility((config.contentModifier as MySliderStyle).showSlider?Visibility.Visible:Visibility.Hidden)
        .showSteps(true)
        .onChange((value: number, mode: SliderChangeMode) => {
          config.triggerChange(value, mode)
        })
      Text('当前状态:'+ ((config.contentModifier as MySliderStyle).sliderChangeMode==0?"Begin"
        :((config.contentModifier as MySliderStyle).sliderChangeMode==1?"Moving"
          :((config.contentModifier as MySliderStyle).sliderChangeMode==2?"End"
            :((config.contentModifier as MySliderStyle).sliderChangeMode==3?"Click":"无")))))
        .fontSize(10)
      Text('进度值:'+ config.value)
        .fontSize(10)
      Text('最小值:'+ config.min)
        .fontSize(10)
      Text('最大值:'+ config.max)
        .fontSize(10)
      Text('步长:'+ config.step)
        .fontSize(10)
    }
    .width('80%')

  }
  .width('100%')
}

class MySliderStyle implements ContentModifier<SliderConfiguration> {
  showSlider:boolean=true
  sliderChangeMode:number=0
  constructor(showSlider: boolean,sliderChangeMode:number) {
    this.showSlider = showSlider
    this.sliderChangeMode = sliderChangeMode
  }
  applyContent() : WrappedBuilder<[SliderConfiguration]> {
    return wrapBuilder(buildSlider)
  }
}


@Entry
@Component
struct SliderExample {
  @State showSlider:boolean=true
  @State sliderValue: number = 0
  @State sliderMin: number = 10
  @State sliderMax: number = 100
  @State sliderStep: number = 20
  @State sliderChangeMode: number = 0

  build() {
    Column({ space: 8 }) {

      Row() {
        Slider({
          value: this.sliderValue,
          min: this.sliderMin,
          max: this.sliderMax,
          step:this.sliderStep,
        })
          .showSteps(true)
          .onChange((value: number, mode: SliderChangeMode) => {
            this.sliderValue = value
            this.sliderChangeMode=mode
            console.info('【SliderLog】value:' + value + 'mode:' + mode.toString())
          })
          .contentModifier(new MySliderStyle(this.showSlider,this.sliderChangeMode))

      }
      .width('100%')

    }.width('100%')
  }
}

 

结论

Slider 组件作为 ArkUI 框架中的一个重要组件,提供了丰富的功能和灵活的定制选项。通过合理的配置和使用,Slider 组件可以满足各种应用场景的需求,提升应用的用户体验。希望本文的介绍能够帮助开发者更好地理解和使用 ArkUI 中的 Slider 组件,从而开发出更加优秀和高效的应用。

----

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值