HOME
Shop
  • English
  • 简体中文
HOME
Shop
  • English
  • 简体中文
  • Product Series

    • FPGA+ARM

      • GM-3568JHF

        • 1. Introduction

          • GM-3568JHF Introduction
        • 2. Quick Start

          • 01 Environment Construction
          • 02 Compilation Instructions
          • 03 Burning Guide
          • 04 Debugging Tools
          • 05 Software Update
          • 06 View information
          • 07 Test Command
          • 08 Application Compilation
          • 09 Source code acquisition
        • 3. Peripherals and Interfaces

          • USB
          • Display and touch
          • Ethernet
          • WIFI
          • Bluetooth
          • TF-Card
          • Audio
          • Serial Port
          • CAN
          • RTC
        • 4. Application Development

          • 01 UART read and write case
          • 02 Key detection case
          • 03 LED light flashing case
          • 04 MIPI screen detection case
          • 05 Read USB device information example
          • 06 FAN Detection Case
          • 07 FPGA FSPI Communication Case
          • 08 FPGA DMA read and write case
          • 09 GPS debugging case
          • 10 Ethernet Test Cases
          • 11 RS485 reading and writing examples
          • 12 FPGA IIC read and write examples
          • 13 PN532 NFC card reader case
          • 14 TF card reading and writing case
        • 5. QT Development

          • 01 ARM64 cross compiler environment construction
          • 02 QT program added automatic startup service
        • 6. Others

          • 01 Modification of the root directory file system
          • 02 System auto-start service
    • ShimetaPi

      • M4-R1

        • Introduction

          • M4-R1 Introduction
        • Get started quickly

          • OpenHarmony概述
          • 镜像烧录
          • 开发环境准备
          • Hello World应用以及部署
        • Application Development

          • getting Started

            • 第一章 ArkTS语言简介
            • 第二章 UI组件介绍和实际应用(上)
            • 第三章 UI组件介绍和实际应用(中)
            • 第四章 UI组件介绍和实际应用(下)
          • Advanced

            • 第一章 入门指引
            • 第二章 三方库的引用和使用
            • 第三章 应用编译以及部署
            • 第四章 命令行恢复出厂设置
            • 第五章 系统调试--HDC调试
            • 第六章 APP 稳定性测试
            • 第七章 应用测试
        • Equipment Development

          • 第一章 环境搭建
          • 第二章 下载源码
          • 第三章 编译源码
        • Peripherals and interfaces

          • 树莓派接口
          • GPIO 接口
          • I2C 接口
          • SPI通信
          • PWM控制
          • 串口通讯
          • TF Card
          • 屏幕
          • 触摸
          • 音频
          • RTC
          • Ethernet
          • M.2
          • MINI-PCIE
          • Camera
          • WIFI&BT
          • 树莓派拓展板
        • Frequently asked questions

          • 资源下载
      • M5-R1

        • Introduction

          • Introduction to ShimetaPi M5-R1
    • OpenHarmony

      • SC-3568HA

        • Introduction

          • SC-3568HA Overview
        • Quick Start Guide

          • OpenHarmony Overview
          • Image Flashing
          • Setting Up the Development Environment
          • Hello World Application and Deployment
        • Application Development

          • ArkUI

            • Chapter 1 Introduction to ArkTS Language
            • Chapter 2 Introduction to UI Components and Practical Applications (Part 1)
            • Chapter 3 Introduction to UI Components and Practical Applications (Part 2)
            • Chapter 4 Introduction to UI Components and Practical Applications (Part 3)
          • Expand

            • Chapter 1 Getting Started Guide
            • Chapter 2 Referencing and Using Third-Party Libraries
            • Chapter 3: Application Compilation and Deployment
            • Chapter 4: Command-Line Factory Reset
            • Chapter 5: System Debugging -- HDC (Huawei Device Connector) Debugging
            • Chapter 6 APP Stability Testing
            • Chapter 7 Application Testing
        • Device Development

          • Chapter 1 Environment Setup
          • Chapter 2 Download Source Code
          • Chapter 3 Compiling Source Code
        • Peripheral And Iinterface

          • Raspberry Pi interface
          • GPIO Interface
          • I2C Interface
          • SPI communication
          • PWM (Pulse Width Modulation) control
          • Serial port communication
          • TF Card
          • Display Screen
          • Touch
          • Audio
          • RTC
          • Ethernet
          • M.2
          • MINI-PCIE
          • Camera
          • WIFI&BT
          • Raspberry Pi expansion board
        • Frequently Asked Questions

          • Resource Downloads
      • M-K1HSE

        • Introduction

          • M-K1HSE Introduction
        • Quick Start

          • Development environment construction
          • Source code acquisition
          • Compilation Notes
          • Burning Guide
        • Peripherals and interfaces

          • 01 Audio
          • 02 RS485
          • 03 Display
        • System customization development

          • System transplant
          • System customization
          • Driver Development
          • System Debugging
          • OTA Update
    • EVS-Camera

      • CF-NRS1

        • 1. Introduction

          • Event Camera Technical Documentation
        • 2. Quick Start

          • Host driver and software installation
        • 3. SDK application development

          • API Usage Instructions
      • CF-CRA2

        • Introduction

          • About CF-NRS1
    • AI-model

      • 1684XB-32T

        • Introduction

          • AIBOX-1684XB-32 Introduction
        • Get started quickly

          • First time use
          • Network Configuration
          • Disk usage
          • Memory allocation
          • Fan Strategy
          • Firmware Upgrade
        • Deployment Tutorial

          • Algorithm deployment
          • Deploy Llama3 Example
        • Application Development

          • Sophgo SDK Development
          • Sophon LLM_api_server development
          • Deploy MiniCPM-V-2_6
          • Qwen-2-5-VL Image and Video Recognition DEMO
          • Qwen3-chat-DEMO
          • Qwen3-Qwen Agent-MCP-Demo
          • Qwen3-langchain-AI Agent
      • 1684X-416T

        • Introduction

          • AIBOX-1684X-416 Introduction
        • Demo simple operation guide

          • Simple instructions for using shimeta smart monitoring demo
    • Core-Board

      • C-3568BQ

        • Introduction

          • C-3568BQ Overview
      • C-3588LQ

        • Introduction

          • C-3588LQ Introduction
      • GC-3568JBAF

        • Introduction

          • GC-3568JBAF Introduction
      • C-K1BA

        • Introduction

          • C-K1BA Introduction

Chapter 4 Introduction to UI Components and Practical Applications (Part 3)

Through the previous chapters, we have gained a preliminary understanding of OpenHarmony's fundamental components and layout approaches. In this chapter, we will reinforce this knowledge by integrating multiple components through a comprehensive digital clock example. This demonstration will illustrate how to leverage OpenHarmony's animation capabilities, state management, and components such as sliders and toggle switches, enabling you to better grasp and apply the ArkUI framework in practical scenarios.

1. Demonstration Example

Based on the content covered in previous chapters, we now have a foundational understanding of essential components. For those seeking deeper insights, comprehensive resources are available on the HarmonyOS Official Website.

Tips

HarmonyOS Official Website (Chinese)

We will implement a dynamic digital clock that displays real-time updates and includes the following features:

Core Features:
Real-time Time Updates: Implement a page-flipping animation effect for digit transitions.
Brightness Control: Dynamically adjust screen brightness using a slider component.
Fullscreen Mode Toggle: Switch between fullscreen and standard modes using a toggle switch component.

Key Components:
Text Component: Displays time values with animation effects.
Slider Component: Binds to brightness adjustment functionality.
Toggle Switch Component: Controls fullscreen mode activation.
State Management: Synchronizes UI updates with system time and user interactions.

Text Component: Displays the clock digits.
Slider Component: Adjusts screen brightness via user interaction.
Toggle Switch Component: Enables full-screen mode toggle functionality.
Animation Feature: Enables digit-flipping transition effects.

TOOL

1.1 Digital Clock Core Code Implementation:

    //修改时间
	changeTime(): Array<number> {
		const time = new Date()
		const hour = time.getHours()
		const hourOne = Math.floor(hour / 10)
		const hourTwo = hour % 10
		const minutesOne = Math.floor(time.getMinutes() / 10)
		const minutesTwo = time.getMinutes() % 10
		const secondsOne = Math.floor(time.getSeconds() / 10)
		const secondsTwo = time.getSeconds() % 10
		return [hourOne, hourTwo, minutesOne, minutesTwo, secondsOne, secondsTwo]
	}

	@Builder box(num : number) {
		Column() {
		Divider()
			.zIndex(5)
			.strokeWidth(2)
			.color(Color.White)
			.position({ x: 0, y: '50%' })

		Text(`${this.timeOne[num]}`)
			.zIndex(1)
			.height(108)
			.width('100%')
			.borderRadius(8)
			.fontWeight(700)
			.padding({ top: 0 })
			.fontSize(90)
			.position({ x: 0, y: 0 })
			.fontColor(Color.White)
			.fontFamily('Monospace')
			.backgroundColor($r('app.color.text_bg'))
			.textAlign(TextAlign.Center)

		Text(`${this.timeTwo[num]}`)
			.zIndex(2)
			.height(64)
			.width('100%')
			.fontWeight(700)
			.borderRadius(8)
			.padding({ top: 3 })
			.fontSize(90)
			.position({ x: 0, y: 0 })
			.fontColor(Color.White)
			.fontFamily('Monospace')
			.backgroundColor($r('app.color.text_bg'))
			.textAlign(TextAlign.Center)

		Text(`${this.timeThree[num]}`)
			.zIndex(4)
			.height(64)
			.width('100%')
			.fontWeight(700)
			.borderRadius(8)
			.padding({ top: 3 })
			.fontSize(90)
			.position({ x: 0, y: 0 })
			.fontColor(Color.White)
			.fontFamily('Monospace')
			.textAlign(TextAlign.Center)
			.backgroundColor($r('app.color.text_bg'))
			.rotate({
			x: 1,
			y: 0,
			z: 0,
			centerX: '50%',
			centerY: '100%',
			angle: this.angleOne[num]
			})

		Text(`${this.timeFour[num]}`)
			.zIndex(3)
			.height(108)
			.width('100%')
			.fontWeight(700)
			.borderRadius(8)
			.padding({ top: 0 })
			.fontSize(90)
			.position({ x: 0, y: 0 })
			.fontColor(Color.White)
			.fontFamily('Monospace')
			.backgroundColor($r('app.color.text_bg'))
			.textAlign(TextAlign.Center)
			.rotate({
			x: 1,
			y: 0,
			z: 0,
			centerX: '50%',
			centerY: '50%',
			angle: this.angleTwo[num]
			})
		}
		.height(108)
		.width('50%')
	}

1.2 Rotation Animation Code Implementation:

		animationOne(i : number): void {
		animateTo({
		duration: 250,
		delay: 0,
		iterations: 1,
		onFinish: () => {
			this.animationTwo(i)
			this.angleOne[i] = 0
		}
		}, () => this.angleOne[i] = 90)
	}

	animationTwo(i : number): void {
		animateTo({
		duration: 250,
		delay: 0,
		iterations: 1,
		onFinish: () => {
			this.angleTwo[i] = -90
		}
		}, () => this.angleTwo[i] = 0)
	}

1.3 Fullscreen Mode Code Implementation:

	this.isFullScreen = !this.isFullScreen
		try {
			let win = await window.getLastWindow(getContext(this))
			let names = this.isFullScreen ? [] : ['status', 'navigation']
			await win.setWindowSystemBarEnable(names as Array<'status' | 'navigation'>)
			}

Complete Code Implementation:

	import { brightness } from '@kit.BasicServicesKit';
	import { LockSwitch } from './LockSwitch';
	import { window } from '@kit.ArkUI';

	@Entry
	@Component
	struct Index {
	@State message: string = 'Hello World';
	@State timeOne: Array<number> = []
	@State timeTwo: Array<number> = []
	@State timeThree: Array<number> = []
	@State timeFour: Array<number> = []
	@State angleOne: Array<number> = [0, 0, 0, 0, 0, 0]
	@State angleTwo: Array<number> = [-90, -90, -90, -90, -90, -90]

	@State isFullScreen: boolean = false
	@State inSetValue: number = 40


	aboutToAppear() {
		const arr = this.changeTime()
		this.timeOne = [...arr]
		this.timeTwo = [...arr]
		this.timeThree = [...arr]
		this.timeFour = [...arr]
		setInterval(() => {
		const time = new Date()
		if (this.timeOne[5] != time.getSeconds() % 10) {
			const arr = this.changeTime()
			for (let i = 0;i < 6; i++) {
			if (arr[i] != this.timeFour[i]) {
				this.timeFour[i] = arr[i]
				this.animationOne(i)
				setTimeout(() => {
				this.timeTwo[i] = arr[i]
				}, 100)
				setTimeout(() => {
				this.timeThree[i] = arr[i]
				}, 150)
				setTimeout(() => {
				this.timeOne[i] = arr[i]
				}, 240)
			}
			}
		}
		}, 1000)
	}

	animationOne(i : number): void {
		animateTo({
		duration: 250,
		delay: 0,
		iterations: 1,
		onFinish: () => {
			this.animationTwo(i)
			this.angleOne[i] = 0
		}
		}, () => this.angleOne[i] = 90)
	}

	animationTwo(i : number): void {
		animateTo({
		duration: 250,
		delay: 0,
		iterations: 1,
		onFinish: () => {
			this.angleTwo[i] = -90
		}
		}, () => this.angleTwo[i] = 0)
	}

	setBrightness(): void {
		brightness.setValue(this.inSetValue)
	}

	//修改时间
	changeTime(): Array<number> {
		const time = new Date()
		const hour = time.getHours()
		const hourOne = Math.floor(hour / 10)
		const hourTwo = hour % 10
		const minutesOne = Math.floor(time.getMinutes() / 10)
		const minutesTwo = time.getMinutes() % 10
		const secondsOne = Math.floor(time.getSeconds() / 10)
		const secondsTwo = time.getSeconds() % 10
		return [hourOne, hourTwo, minutesOne, minutesTwo, secondsOne, secondsTwo]
	}

	@Builder box(num : number) {
		Column() {
		Divider()
			.zIndex(5)
			.strokeWidth(2)
			.color(Color.White)
			.position({ x: 0, y: '50%' })

		Text(`${this.timeOne[num]}`)
			.zIndex(1)
			.height(108)
			.width('100%')
			.borderRadius(8)
			.fontWeight(700)
			.padding({ top: 0 })
			.fontSize(90)
			.position({ x: 0, y: 0 })
			.fontColor(Color.White)
			.fontFamily('Monospace')
			.backgroundColor($r('app.color.text_bg'))
			.textAlign(TextAlign.Center)

		Text(`${this.timeTwo[num]}`)
			.zIndex(2)
			.height(64)
			.width('100%')
			.fontWeight(700)
			.borderRadius(8)
			.padding({ top: 3 })
			.fontSize(90)
			.position({ x: 0, y: 0 })
			.fontColor(Color.White)
			.fontFamily('Monospace')
			.backgroundColor($r('app.color.text_bg'))
			.textAlign(TextAlign.Center)

		Text(`${this.timeThree[num]}`)
			.zIndex(4)
			.height(64)
			.width('100%')
			.fontWeight(700)
			.borderRadius(8)
			.padding({ top: 3 })
			.fontSize(90)
			.position({ x: 0, y: 0 })
			.fontColor(Color.White)
			.fontFamily('Monospace')
			.textAlign(TextAlign.Center)
			.backgroundColor($r('app.color.text_bg'))
			.rotate({
			x: 1,
			y: 0,
			z: 0,
			centerX: '50%',
			centerY: '100%',
			angle: this.angleOne[num]
			})

		Text(`${this.timeFour[num]}`)
			.zIndex(3)
			.height(108)
			.width('100%')
			.fontWeight(700)
			.borderRadius(8)
			.padding({ top: 0 })
			.fontSize(90)
			.position({ x: 0, y: 0 })
			.fontColor(Color.White)
			.fontFamily('Monospace')
			.backgroundColor($r('app.color.text_bg'))
			.textAlign(TextAlign.Center)
			.rotate({
			x: 1,
			y: 0,
			z: 0,
			centerX: '50%',
			centerY: '50%',
			angle: this.angleTwo[num]
			})
		}
		.height(108)
		.width('50%')
	}

	build() {
		Column() {
		Row() {
			Row({ space: 2 }) {
			this.box(0)
			this.box(1)
			}
			.width('30%')
			.height('30%')

			Image($r('app.media.dot'))
			.width(20)
			.height(50)

			Row({ space: 2 }) {
			this.box(2)
			this.box(3)
			}
			.width('30%')
			.height('30%')

			Image($r('app.media.dot'))
			.width(20)
			.height(50)

			Row({ space: 2 }) {
			this.box(4)
			this.box(5)
			}
			.width('30%')
			.height('30%')
		}
		.id('currentTimeBox')
		.width('50%')
		.height('50%')


		Column({ space: 10 }) {
			Divider()
			.strokeWidth(5)
			.color($r('app.color.divider_bg'))

			Row() {
			Text($r("app.string.fullScreen")).fontSize(18)

			Blank()

			Toggle({ type: ToggleType.Switch, isOn: this.isFullScreen })
				.switchPointColor(0xe5ffffff)
				.onChange(async () => {
				this.isFullScreen = !this.isFullScreen
				try {
					let win = await window.getLastWindow(getContext(this))
					let names = this.isFullScreen ? [] : ['status', 'navigation']
					await win.setWindowSystemBarEnable(names as Array<'status' | 'navigation'>)
				} catch (err) {
					console.info(`setFullScreen fail, code = ${err.code}`)
				}
				})
			}
			.width('90%')
			.height(62)
			.borderRadius(24)
			.margin({ top: 10 })
			.backgroundColor(Color.White)
			.padding({ left: '3%', right: '3%' })

			Divider()
			.strokeWidth(5)
			.color($r('app.color.divider_bg'))

			Row() {
			Lock()
			}
			.width('90%')
			.height(62)
			.borderRadius(24)
			.margin({ top: 10 })
			.backgroundColor(Color.White)
			.padding({ left: '3%', right: '3%' })

			Divider()
			.strokeWidth(5)
			.color($r('app.color.divider_bg'))

			Row() {
			Text($r("app.string.brightness"))
				.fontSize(18)

			Slider({
				value: this.inSetValue,
				min: 0,
				max: 255,
				step: 5,
				style: SliderStyle.OutSet
			})
				.id('brightness')
				.width('90%')
				.showTips(false)
				.showSteps(false)
				.blockColor(0xCCCCCC)
				.trackColor(Color.Black)
				.selectedColor(0xCCCCCC)
				.onChange((value: number, mode: SliderChangeMode) => {
				this.inSetValue = value
				this.setBrightness()
				})
			}
			.width('90%')
			.height(62)
			.borderRadius(24)
			.margin({ top: 10 })
			.backgroundColor(Color.White)
			.padding({ left: '3%', right: '3%' })

			Divider()
			.strokeWidth(5)
			.color($r('app.color.divider_bg'))
		}
		.height('100%')

		}
		.width('100%')
		.height('100%')
		.backgroundColor('#F1F3F5')
		.justifyContent(FlexAlign.Center)
	}
	}

	@Component
	struct Lock {
	@State isComTime: boolean = true

	build() {
		Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
		Column() {
			LockSwitch({ isComTime: $isComTime })
		}
		.width('100%')
		}
	}
	}

Source Code Repository: Sample Source Code


Edit this page on GitHub
Last Updated:
Contributors: zsl, zwhuang
Prev
Chapter 3 Introduction to UI Components and Practical Applications (Part 2)