鸿蒙应用开发学习:用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)

  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/493843.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JVM】Java八股文之JVM篇

目录 一、JVM类加载与垃圾回收加载过程加载机制优点图解加载机制 分代回收分代垃圾回收新生代垃圾回收老年代垃圾回收 回收算法 一、JVM类加载与垃圾回收 面试过程中最经典的一题: 请你讲讲在JVM中类的加载过程以及垃圾回收? 加载过程 当Java虚拟机&…

双纤SFP光模块和单纤SFP光模块之间的区别

双纤SFP光模块和单纤SFP光模块是两种不同的光模块类型。对于网络部署而言,了解它们之间的区别至关重要。本文将深入探讨这两种光模块之间的差异,并介绍其特性和适用场景。 双纤与单纤SFP光模块:它们是什么? 双纤SFP光模块是常用…

回文子串 每日温度 接雨水

647. 回文子串 力扣题目链接 如果s【i】和s【j】相同 dp【i1】【j-1】也是回文串的话 (等于true) 那么dp【i】【j】也是回文串 true 定义一个bool二维数组 遍历顺序是从下到上 从左到右 因为dp【i】【j】是通过dp【i1】【j-1】推出来的 i从最后一…

120.龙芯2k1000-qt(19)-做了一个qt测试界面

主要接口和性能测试,主要针对的是龙芯2k1000. 以下是windows下的截图,大概功能就是这样吧,能想到的都想了一遍。 cpu的温度和频率采集不到,就没有放了。

冒泡排序(六大排序)

冒泡排序 冒泡排序的特性总结: 1. 冒泡排序是一种非常容易理解的排序 2. 时间复杂度:O(N^2) 3. 空间复杂度:O(1) 4. 稳定性:稳定 动图分析: 代码实现: Swap(int*p1,int*p2) {int tmp *p1;*p1*p2…

程序员35岁的职业困惑及应对之道

35岁,对许多程序员来说,是一个职业生涯的重要分水岭。在这个年龄,一些人开始感到迷茫和焦虑,担心自己的技能已经落后,难以跟上日新月异的技术变革。而另一些人则充满信心,认为多年来积累的丰富经验和扎实的技术功底,将助力他们在未来的职业道路上取得新的飞跃。 无疑,在AI、自…

【Flutter 面试题】 Flutter中的路由(Route)是什么?如何在应用程序中实现路由导航?

【Flutter 面试题】 Flutter中的路由(Route)是什么?如何在应用程序中实现路由导航? 文章目录 写在前面口述回答补充说明 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏…

电商产品效果图渲染用什么工具更方便?

​在电子商务的快速发展中,产品的视觉呈现变得至关重要。对于电商行业的设计师而言,选择一款既便捷又高效的渲染工具,对于快速完成高质量的产品效果图至关重要。特别是对于初学者,工具的直观性和功能性是他们最为关注的焦点。 那…

在线接口文档预言方案

在线接口文档预言方案 要求: ​ 支持自动生成接口文档 ​ 能够支持在线测试(http,websocket) ​ 对代码没有侵入性 一、目前涉及的相关技术收集 sudo apt update #更新数据 sudo apt upgrade #更新软件 sudo apt install openssh-server #下载安装…

鸿蒙HarmonyOS应用开发之Node-API常见问题

ArkTS/JS侧import xxx from libxxx.so后,使用xxx报错显示undefined/not callable 排查.cpp文件在注册模块时的模块名称与so的名称匹配一致。 如模块名为entry,则so的名字为libentry.so,napi_module中nm_modname字段应为entry,大小…

844. 走迷宫 典bfs

AC代码&#xff1a; #include<algorithm> #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<cmath> using namespace std; const int N 110;int mp[N][N]; int sx,sy; bool vis[N][N]; struct node{i…

2024年热门游泳耳机推荐!公认最佳的4大游泳耳机分享,好用不贵

随着科技的发展&#xff0c;游泳运动已经不仅仅是一项健身活动&#xff0c;更是一种生活方式。在游泳过程中&#xff0c;音乐的陪伴能够让我们更好地享受这项运动&#xff0c;同时也能提高我们的游泳效果。因此&#xff0c;选择一款适合自己的游泳耳机显得尤为重要。 然而&…

嵌入式和 Java 走哪条路?

最近看到一个物联网大三学生的疑问&#xff0c;原话如下&#xff1a; 本人普通本科物联网工程专业&#xff0c;开学大三&#xff0c;现在就很迷茫&#xff0c;不打算考研了&#xff0c;准备直接就业&#xff0c;平时一直在实验室参加飞思卡尔智能车比赛&#xff0c;本来是想走嵌…

BRICK POP展示了有趣的链上游戏玩法与奖励

新游戏BRICK POP将Sui区块链技术与低Gas费用&#xff0c;以及我们在Web3游戏开发方面的专业知识无缝结合。通过充分利用Sui和我们自己的INNO平台的优势&#xff0c;BRICK POP为玩家提供了一个融合了前沿技术和引人入胜游戏的沉浸式游戏体验。BRICK POP游戏设计为实时交易和高用…

配置文件 application properties

配置文件 application properties 1 参数交由配置文件集中管理 Value(“${}”)用于外部配置的属性注入 在之前编写的程序中进行文件上传时&#xff0c;需要调用AliOSSUtils工具类&#xff0c;将文件上传到阿里云OSS对象存储服务当中。而在调用工具类进行文件上传时&#xff0c…

JaveSE—IO流详解:对象输入输出流(序列化及反序列化)

一. 基础理论知识 &#x1f4cc;怎么理解对象输入输出流 &#xff1f; ○ 把java中的对象输出到文件中&#xff0c;从文件中把对象输入到程序中. &#x1f4cc;为什么要这样做(目的) &#xff1f; 当我们创建一个对象时, 如new Student( "小张",20 ); 数据存储在…

【Ucore操作系统】8. 并发

文章目录 【 0. 引言 】0.1 线程定义0.2 同步互斥 【 1. 内核态的线程管理 】1.1 线程概念1.2 线程模型与重要系统调用1.2.1 线程创建系统调用1.2.2 等待子线程系统调用1.2.3 进程相关的系统调用 1.3 应用程序示例1.3.1 系统调用封装1.3.2 多线程应用程序 – threads 1.4 线程管…

STL中 function 源码解析

1. function 本文基于 GCC 9.4 function 的作用就是将各种仿函数的调用统一起来&#xff1b; 1.1 类中非静态成员函数指针为什么是16字节 auto cptr &A::myfunc; 类中非静态成员函数 &#xff0c;其类型为 void (A::*)(int) auto rptr print_num; 普通函数对应汇…

git clone 后如何 checkout 到 remote branch

what/why 通常情况使用git clone github_repository_address下载下来的仓库使用git branch查看当前所有分支时只能看到master分支&#xff0c;但是想要切换到其他分支进行工作怎么办❓ 其实使用git clone下载的repository没那么简单&#x1f625;&#xff0c;clone得到的是仓库…