OpenHarmony - ArkUI(TS)声明式开发之故障轮播 原创 精华

中软HOS小鸿
发布于 2022-8-31 10:46
浏览
4收藏

作者:钟娟

前言

最近刚接触基于openHarmony开源框架的应用开发,特别是基于TS扩展的声明式开发。本文主要结合Harmony官网上的ETS相关组件及API实现日常开发中常见的故障循播效果,以此熟悉ETS下的一些基础组件的应用。

UI开发模式

OpenHarmony - ArkUI(TS)声明式开发之故障轮播-鸿蒙开发者社区

效果演示

OpenHarmony - ArkUI(TS)声明式开发之故障轮播-鸿蒙开发者社区

实现步骤

1. 新建项目

OpenHarmony - ArkUI(TS)声明式开发之故障轮播-鸿蒙开发者社区

2. 页面布局

创建弹性Flex布局,使用Swiper容器组件,Text、Image基础组件。

  build() {
    Flex() { //弹性布局
      Swiper() { //滑动容器,提供切换子组件显示的能力
          Flex() {
            Image($r('app.media.ic_warn'))//图片组件,用来渲染展示图片。
            Text() //文本,用于呈现一段信息。
            Image($r('app.media.ic_arrow'))//图片资源放于resource文件夹下的media文件夹下
          }
      }
    }
  }

3. 以“.”链式调用的方式配置UI结构及其属性、事件等

   build() {
    Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) { //弹性布局
      Swiper() { //滑动容器,提供切换子组件显示的能力
        Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
          //图片组件,用来渲染展示图片
          Image($r('app.media.ic_warn'))
            .width(24)
            .height(24)
            .margin({ top: 12, left: 12, bottom: 12 })
            .objectFit(ImageFit.Fill)
          //文本,用于呈现一段信息
          Text('电量低,请及时充电!')
            .width('75%')
            .textOverflow({ overflow: TextOverflow.None })
            .fontSize(16)
            .fontColor(0xd94838)
            .fontWeight(FontWeight.Medium)
            .margin({ top: 14, left: 16, })
            .padding({ bottom: 15 })
          //图片资源放于resource文件夹下的media文件夹下
          Image($r('app.media.ic_arrow')).width(12)
            .height(24)
            .margin({ top: 12, right: 12, bottom: 12 })
            .objectFit(ImageFit.Fill)
        }
      }
      .margin({ top: 30, right: 12, left: 12, })
      .height(48)
      .borderRadius(16)
      .backgroundColor(0xfce3df)
      .index(1)
      .autoPlay(true)
      .interval(1000)
      .indicator(false)
      .loop(true)
      .duration(1500)
      .vertical(true)
      .disableSwipe(true)
    }
  }

Swiper相关属性

名称 参数类型 默认值 描述
index number 0 设置当前在容器中显示的子组件的索引值。
autoPlay boolean false 子组件是否自动播放,自动播放状态下,导航点不可操作。
interval number 3000 使用自动播放时播放的时间间隔,单位为毫秒。
indicator boolean true 是否启用导航点指示器。
loop boolean true 是否开启循环。
duration number 400 子组件切换的动画时长,单位为毫秒。
vertical boolean false 是否为纵向滑动。
itemSpace Length 0 设置子组件与子组件之间间隙。
cachedCount number 1 设置预加载子组件个数。
disableSwipe boolean boolean 禁用组件滑动切换功能。
curve Curve Curve.Ease 设置Swiper的动画曲线,默认为淡入淡出曲线。
indicatorStyle 设置indicator样式

Image相关参数和属性

参数名 参数类型 必填 默认值 参数描述
src string| PixelMap|Resource - 图片的数据源,支持本地图片和网络图片,建议使用$r方式来管理需全局使用的图片资源。
alt string - 加载时显示的占位图。支持本地图片和网络路径。
objectFit ImageFit Cover 图片的缩放类型。
objectRepeat ImageRepeat NoRepeat 图片的重复样式,SVG类型图源不支持该属性。
interpolation ImageInterpolation None 设置图片的插值效果,仅针对图片放大插值。SVG类型图源和PixelMap资源不支持该属性。
renderMode ImageRenderMode Original 图片渲染的模式,SVG类型图源不支持该属性。
sourceSize {width: number,height: number} - 图片解码尺寸,将原始图片解码成指定尺寸的图片,number类型单位为px。PixelMap资源不支持该属性。
syncLoad boolean false 是否同步加载图片,默认是异步加载。同步加载时阻塞UI线程,不会显示占位图。

4. 赋初始值,完善逻辑,实现循环播放

使用ForEach循环遍历所有故障数据,结合if和弹窗组件,实现部分故障有相应解决方案提示框的需求。

@Entry
@Component
struct SwiperExample {
 @State arr: any[] = [{
                          id: 0,
                          tipText: "设备缺水,请检查设备",
                          showMoreIcon: true,
                        }, {
                          id: 1,
                          tipText: "设备电流过大,请检查设备",
                          showMoreIcon: true,
                        }, {
                          id: 2,
                          tipText: "电量低,请及时充电!",
                          showMoreIcon: false,
                        }]
  @State solutionArray: any[] = ["请检查进出水接头是否存在松动,如果排查确认接头未松动,请咨询官方售后服务电话:“400-6008878”。", "如果首次出现该故障提醒,请重新插拔电池包;如果还显示该故障,请联系商家售后。"]

  build() {
    Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
      Swiper() {
        ForEach(this.arr, (item) => {
          Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
            Image($r('app.media.ic_warn'))
               .width(24)
               .height(24)
               .margin({ top: 12, left: 12, bottom: 12 })
              .objectFit(ImageFit.Fill)
            Text(item.tipText)
              .width('75%')
              .textOverflow({ overflow: TextOverflow.None })
              .fontSize(16)
              .fontColor(0xd94838)
              .fontWeight(FontWeight.Medium)
              .margin({ top: 14, left: 16, })
              .padding({ bottom: 15 })
            if (item.showMoreIcon) {
              Image($r('app.media.ic_arrow'))
                .width(12)
                .height(24)
                .margin({ top: 12, right: 12, bottom: 12 })
                .objectFit(ImageFit.Fill)
                .onClick(() => {
                  //弹窗
                  AlertDialog.show(
                    {
                      title: '解决方案',
                      message: this.solutionArray[item.id],
                      confirm: {
                        value: '知道了',
                        action: () => {
                          console.info('Button-clicking callback')
                        }
                      },
                      cancel: () => {
                        console.info('Closed callbacks')
                      }
                    }
                  )
                })
            }
          }
        })
      }
      .margin({ top: 30, right: 12, left: 12, })
      .height(48)
      .borderRadius(16)
      .backgroundColor(0xfce3df)
      .index(1)
      .autoPlay(true)
      .interval(1000)
      .indicator(false)
      .loop(true)
      .duration(1500)
      .vertical(true)
      .disableSwipe(true)
    }
  }
}

总结

此例就基于ETS组件的基本使用,旨在熟悉ETS规范和对组件的初体验。

更多原创内容请关注:中软国际 HarmonyOS 技术团队

入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-8-31 10:46:44修改
8
收藏 4
回复
举报
6条回复
按时间正序
/
按时间倒序
只有敬亭山
只有敬亭山

学习知识,前排前排!

回复
2022-8-31 14:57:37
一緑向北
一緑向北

看的出来,动画非常流畅

1
回复
2022-8-31 16:39:40
冰淇淋爱我
冰淇淋爱我

这属于平时用不到,但是很关键的功能了。

1
回复
2022-9-1 10:33:53
有故事的王同学
有故事的王同学

现在还推荐学JAVA的组件吗?

回复
2022-9-1 18:31:17
带带小老弟
带带小老弟

感觉这个的难度主要在确定故障数据上

回复
2022-9-5 10:35:31
mb5c3c026c0975b
mb5c3c026c0975b

#9月摸鱼计划#学习了

回复
2022-9-16 14:29:32
回复
    相关推荐