鸿蒙应用开发学习:用Marquee组件做个跑马灯

一、前言

鸿蒙应用的学习持续进行中,这两天阅读官方的API参考文档,发现一个有趣的组件——Marquee,用它做了个跑马灯,做个学习记录。

二、参考资料

官网文档链接如下:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/ts-basic-components-marquee-0000001478181401-V2

官方的介绍是:跑马灯组件,用于滚动展示一段单行文本,仅当文本内容宽度超过跑马灯组件宽度时滚动。

这个组件拥有start, step, loop, fromStart, src五个参数可调,并提供了onStart, onBounce, onFinish三个事假,具体说明官网文档写得很清楚,不再赘述。

三、效果展示

文档末尾提供了一个示例,展示了这个组件的基本用法,我的代码在示例的基础上进行了扩展,实现了动态修改滚动文本内容、文本字体大小、文本颜色和滚动方向,使用onBounce事件统计滚动次数,通过一个按钮控制跑马灯的运行和暂停。

可动态修改文本

能够实时调整字体大小和颜色

支持实时控制反向滚动,一个按钮控制运行和暂停

展示视频见哔站链接:

鸿蒙应用开发学习:通过Marquee组件实现跑马灯效果_哔哩哔哩_bilibili

四、代码

最后上完整代码

import promptAction from '@ohos.promptAction'


@Entry
@Component
struct MarqueePage {
  @State count: number = 0 // 跑马灯滚动次数
  @State start: boolean = false // 控制跑马灯是否进入播放状态
  @State fromStart: boolean = true // 设置文本从头开始滚动或反向滚动
  private step: number = 50 // 设置滚动动画文本滚动步长
  private loop: number = -1 // 设置重复滚动的次数,小于等于零时无限循环 Infinity
  @State src: string = '' // 这是一个跑马灯哦
  @State command: string = '运行' // “运行/暂停”按钮当前显示的字符
  @State fontSize: number = 232 // 控制跑马灯字体大小
  @State fontColor: string = '#ffff0000' // 控制跑马灯字体颜色  '#ffffd200'

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

      // 跑马灯组件
      Marquee({
        start: this.start,
        step: this.step,
        loop: this.loop,
        fromStart: this.fromStart,
        src: this.src
      })
        .width(360)
        .height(240)
        .fontColor(this.fontColor) // '#ffffd200'
        .fontSize(this.fontSize)
        .fontWeight(700)
        .backgroundColor('#ff3c3c3c')
        .margin({ bottom: 5 })
        .onBounce(() => {
          this.count += 1
        })

      // 显示已滚地次数
      Row() {
        Text('已滚动次数:').fontSize(9).fontSize(16)
        Text(this.count + '次').fontSize(9).fontSize(16)
      }
      .margin({ bottom: 20 })

      // 文本输入框
      TextArea({ placeholder: '请输入要显示的文字内容' })
        .onChange((value: string) => {
          this.src = value
        })
        .margin({ bottom: 10 })

      // 调整跑马灯字体大小
      Row({ space: 10 }) {
        Text("字体大小")
        Slider({
          value: this.fontSize,
          min: 208,
          step: 8,
          max: 296,
          style: SliderStyle.InSet
        })
          .layoutWeight(1)
          .showSteps(true)
          .selectedColor($r('app.color.button_bgColor_lightBlue'))
          .onChange(value => {
            this.fontSize = value
          })
      }
      .width("100%")
      .margin({ bottom: 5 })

      // 控制跑马灯字体颜色
      Row({ space: 10 }) {
        Text("字体颜色")
        Grid() {
          GridItem() {
            Text("红")
              .fontColor('#ffff0000')
              .fontSize(24)
          }

          GridItem() {
            Text("黄")
              .fontColor('#ffffd200')
              .fontSize(24)
          }

          GridItem() {
            Text("蓝")
              .fontColor('#ff0359fb')
              .fontSize(24)
          }

          GridItem() {
            Text("绿")
              .fontColor('#ff00ff00')
              .fontSize(24)
          }

          GridItem() {
            Radio({ value: 'Radio1', group: 'radioGroup' })
              .checked(true)
              .height(30)
              .width(30)
              .colorBlend($r('app.color.button_bgColor_lightBlue'))
              .onChange((isChecked: boolean) => {
                console.log('Radio1 status is ' + isChecked)
                this.fontColor = '#ffff0000'
              })
          }

          GridItem() {
            Radio({ value: 'Radio2', group: 'radioGroup' })
              .checked(false)
              .height(30)
              .width(30)
              .colorBlend($r('app.color.button_bgColor_lightBlue'))
              .onChange((isChecked: boolean) => {
                console.log('Radio2 status is ' + isChecked)
                this.fontColor = '#ffffd200'
              })
          }

          GridItem() {
            Radio({ value: 'Radio3', group: 'radioGroup' })
              .checked(false)
              .height(30)
              .width(30)
              .colorBlend($r('app.color.button_bgColor_lightBlue'))
              .onChange((isChecked: boolean) => {
                console.log('Radio3 status is ' + isChecked)
                this.fontColor = '#ff0359fb'
              })
          }

          GridItem() {
            Radio({ value: 'Radio4', group: 'radioGroup' })
              .checked(false)
              .height(30)
              .width(30)
              .colorBlend($r('app.color.button_bgColor_lightBlue'))
              .onChange((isChecked: boolean) => {
                console.log('Radio4 status is ' + isChecked)
                this.fontColor = '#ff00ff00'
              })
          }
        }
        .width('70%')
        .height(80)
        .columnsTemplate('1fr 1fr 1fr 1fr')

      }
      .width('100%')

      // 控制跑马灯滚动方向
      Row() {
        Checkbox({ name: 'checkbox1' })
          .selectedColor($r('app.color.button_bgColor_lightBlue'))
          .onChange((value: boolean) => {
            this.fromStart = !this.fromStart
          })
        Text("反向滚动")
      }
      .margin({ bottom: 10 })

      Button(this.command)
        .width(100)
        .margin({ bottom: 10 })
        .backgroundColor($r('app.color.button_bgColor_lightBlue'))
        .onClick(() => {
          if (this.command == '运行') {
            if (this.src == "") {
              promptAction.showToast({ message: '内容为空不能运行' })
            } else {
              this.command = '暂停'
              this.start = true
            }
          } else {
            this.command = '运行'
            this.start = false
          }
        })

    }
    .width('100%').padding(10)

  }
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue跑马灯 (marquee) 组件是一种常见的UI组件,可以用于在页面上展示滚动的文字或图片。以下是一个简单的Vue跑马灯组件示例: ```vue <template> <div class="marquee"> <div class="marquee-content" :style="{transform: 'translateX(' + position + 'px)'}"> <slot></slot> </div> </div> </template> <script> export default { data() { return { position: 0, interval: null }; }, mounted() { this.interval = setInterval(() => { const content = this.$el.querySelector('.marquee-content'); const width = content.offsetWidth; const parentWidth = this.$el.offsetWidth; if (width > parentWidth) { this.position -= 1; if (Math.abs(this.position) >= width) { this.position = parentWidth; } } }, 20); }, beforeDestroy() { clearInterval(this.interval); } }; </script> <style> .marquee { overflow: hidden; } .marquee-content { display: inline-block; white-space: nowrap; } </style> ``` 在上面的示例中,我们定义了一个名为 `marquee` 的组件,它包含一个名为 `marquee-content` 的子组件,用于包裹滚动的内容。我们使用CSS的 `overflow` 属性设置父元素为 `hidden`,以隐藏超出父元素边界的内容。 在 `mounted` 钩子函数中,我们使用 `setInterval` 函数定时更新 `marquee-content` 的 `transform` 属性,以实现滚动效果。我们在 `beforeDestroy` 钩子函数中清除定时器,以避免内存泄漏。 在使用 `marquee` 组件时,我们可以将需要滚动的内容插入到组件中,例如: ```vue <marquee> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <img src="image3.jpg" alt="Image 3"> </marquee> ``` 在上面的示例中,我们插入了三张图片到 `marquee` 组件中。这些图片将在组件中滚动,并且当它们的宽度超出父元素的宽度时,它们将自动滚动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武陵悭臾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值