「Mac畅玩鸿蒙与硬件41」UI互动应用篇18 - 多滑块联动控制器

简介: 本篇将带你实现一个多滑块联动的控制器应用。用户可以通过拖动多个滑块,动态控制不同参数(如红绿蓝三色值),并实时显示最终结果。我们将以动态颜色调节为例,展示如何结合状态管理和交互逻辑,打造一个高级的滑块控制器应用。

本篇将带你实现一个多滑块联动的控制器应用。用户可以通过拖动多个滑块,动态控制不同参数(如红绿蓝三色值),并实时显示最终结果。我们将以动态颜色调节为例,展示如何结合状态管理和交互逻辑,打造一个高级的滑块控制器应用。

20241201_013405.gif


关键词
  • UI互动应用
  • 自定义滑块
  • 多滑块联动
  • 状态管理
  • 用户交互

一、功能说明

多滑块联动控制器应用允许用户通过调整多个滑块来控制参数,并实时显示结果。本示例以 RGB 三色调节为例,用户可以:

  1. 分别调整红、绿、蓝三个滑块的值。
  2. 实时查看滑块组合后的颜色结果。
  3. 点击按钮重置滑块值。

二、所需组件

  • @Entry@Component 装饰器
  • ColumnRow 布局组件
  • Slider 组件用于滑块交互
  • Text 组件用于显示滑块值和结果提示
  • Button 组件用于重置滑块值
  • @State 修饰符用于状态管理

三、项目结构

  • 项目名称MultiSliderApp
  • 自定义组件名称MultiSliderPageMultiSlider
  • 代码文件MultiSliderPage.etsIndex.etsMultiSlider.ets

四、代码实现

// 文件名:MultiSliderPage.ets
import {
    MultiSlider } from "./MultiSlider";

@Component
export struct MultiSliderPage {
   
  @State colors: number[] = [128, 128, 128]

  build() {
   
    Column({
    space: 20 }) {
   
      // 显示当前颜色结果
      Text(`当前颜色: rgb(${
     this.colors[0]}, ${
     this.colors[1]}, ${
     this.colors[2]})`)
        .fontSize(20)
        .alignSelf(ItemAlign.Center);

      // 显示颜色预览框
      Row() {
   
        Image($r('app.media.cat'))
          .width(85)
          .height(100)
          .borderRadius(5); // 增加猫的圆角效果
      }
      .width('100%')
      .height(120)
      .backgroundColor(this.getRGBColor())
      .borderRadius(10)
      .justifyContent(FlexAlign.Center);

      // 调用颜色滑块组件,直接传递 @State 的值
      MultiSlider({
   
        label: '红色',
        value: this.colors[0], // 传递父组件的值
        color: Color.Red,
        colors: this.colors
      });

      MultiSlider({
   
        label: '绿色',
        value: this.colors[1], // 传递父组件的值
        color: Color.Green,
        colors: this.colors
      });

      MultiSlider({
   
        label: '蓝色',
        value: this.colors[2], // 传递父组件的值
        color: Color.Blue,
        colors: this.colors
      });

      // 重置按钮
      Button('重置')
        .onClick(() => this.resetValues())
        .backgroundColor(Color.Gray)
        .fontColor(Color.White)
        .width('50%')
        .alignSelf(ItemAlign.Center);
    }
    .padding(20)
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center);
  }

  // 获取 RGB 颜色字符串
  private getRGBColor(): string {
   
    return `rgb(${
     this.colors[0]}, ${
     this.colors[1]}, ${
     this.colors[2]})`;
  }

  // 重置滑块值
  private resetValues() {
   
    this.colors[0] = 128;
    this.colors[1] = 128;
    this.colors[2] = 128;
  }
}
// 文件名:Index.ets
import {
    MultiSliderPage } from "./MultiSliderPage";  // 引入 MultiSliderPage

@Entry
@Component
export struct Index {
   
  build() {
   
    Column({
    space: 20 }) {
   
      // 这里渲染 MultiSliderPage 组件
      MultiSliderPage();  // 使用 MultiSliderPage 组件
    }
    .padding(20)
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center);
  }
}
// 文件名:MultiSlider.ets
@Component
export struct MultiSlider {
   
  @Prop label: string = '';  // 标签
  @Prop value: number = 0;
  @Prop color: Color = Color.White; // 滑块颜色
  @State colors: number[] = [128, 128, 128]

  build() {
   
    Column({
    space: 10 }) {
   
      // 显示标签和当前值
      Text(`${
     this.label}: ${
     this.value}`)
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .fontColor(this.color);

      // 滑块组件
      Slider({
   
        min: 0,     // 最小值
        max: 255,   // 最大值
        value: this.value,  // 当前值
      })
        .blockColor(this.color)  // 设置滑块颜色
        .onChange((newValue: number) => {
   
          this.value = newValue;  // 更新 @State 的值
          if (this.color == Color.Red) {
   
            this.colors[0] = newValue
          }
          else if (this.color == Color.Green) {
   
            this.colors[1] = newValue
          }
          else if (this.color == Color.Blue) {
   
            this.colors[2] = newValue
          }
        })
        .width('90%')
        .alignSelf(ItemAlign.Center);
    }
    .margin({
    top: 10 });
  }
}

效果示例:用户可以通过拖动红、绿、蓝三个滑块调整颜色值,动态显示颜色预览,并通过重置按钮恢复初始值。

20241201_013405.gif


五、代码解读

  • 动态滑块联动:通过 @State 分别管理红、绿、蓝三个滑块的值,动态计算 rgb 颜色并更新预览框背景。
  • Slider 组件封装:使用 createSlider 方法简化滑块的创建逻辑,提高代码复用性。
  • 重置功能:点击重置按钮后,通过 resetValues 方法将滑块值重置为初始值。

六、优化建议

  1. 增加色彩渐变背景:为滑块添加渐变背景,帮助用户直观理解颜色值变化。
  2. 保存颜色历史记录:记录用户调整过的颜色值,方便快速恢复或对比。
  3. 支持多种颜色模式:增加 HSL 或 HEX 模式切换,扩展功能适用性。

七、相关知识点


小结

通过多滑块联动控制器的实现,用户可以体验到复杂交互场景中 Slider 组件的高级用法,并学习状态管理与动态界面更新的结合应用。本应用提供了实用的交互功能,是学习鸿蒙 UI 开发的重要案例。


下一篇预告

在下一篇「UI互动应用篇19 - 数字键盘应用」中,我们将探索如何实现一个数字键盘,支持用户输入数字并动态更新显示。


上一篇: 「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局

下一篇: 「Mac畅玩鸿蒙与硬件42」UI互动应用篇19 - 数字键盘应用


作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=343
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


目录
相关文章
|
9月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
311 15
|
9月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
347 11
|
9月前
|
开发者 容器
【HarmonyOS Next之旅】ArkTS语法(二) -> 动态构建UI元素
当开发者创建自定义组件,并想对该组件添加特定功能时(例如在自定义组件中添加一个点击跳转操作)。为解决此问题,引入了@BuilderParam装饰器,此装饰器修饰的属性值可为@Builder装饰的函数,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。@BuilderParam装饰器用于修饰自定义组件内函数类型的属性(例如:@BuilderParam noParam: () => void),并且在初始化自定义组件时被@BuilderParam修饰的属性必须赋值。
262 11
|
8月前
|
开发者 容器
44.[HarmonyOS NEXT RelativeContainer案例一] 掌握组件锚点布局:打造灵活精准的UI定位系统
在HarmonyOS NEXT的UI开发中,精确控制组件位置是构建复杂界面的关键。RelativeContainer作为一种强大的布局容器,通过锚点系统提供了精确定位能力,使开发者能够创建出灵活且精准的UI布局。本教程将详细讲解如何使用RelativeContainer的锚点布局功能,帮助你掌握这一核心技术。
270 4
|
8月前
|
设计模式 缓存 容器
06.HarmonyOS Next UI进阶:Text组件与视觉样式完全指南
在HarmonyOS Next应用开发中,Text组件是最基础也是最常用的UI元素之一。它不仅用于显示文本内容,还可以通过丰富的样式属性实现各种视觉效果。掌握Text组件的样式设置,是构建精美UI界面的基础技能。
423 1
|
5月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
462 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
5月前
|
JavaScript 前端开发 开发者
鸿蒙应用开发从入门到实战(六):ArkTS声明式UI和组件化
鸿蒙开发语言ArkTS在继承了Typescrip语法的基础上,主要扩展了声明式UI开发相关的能力。
281 1
|
8月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
301 56
|
8月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
444 55
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
796 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex