鸿蒙UI开发——渐变色效果
1、概 述
ArkTs可以通过颜色渐变接口,设置组件的背景颜色渐变效果,实现在两个或多个指定的颜色之间进行平稳的过渡。
目前提供三种渐变类型:线性渐变、角度渐变、径向渐变。
我们在鸿蒙UI布局实战 —— 个人中心页面开发中,默认头像部分,使用到了线性渐变,效果如下:

在项目中合理的使用渐变色,有助于让我们的APP更加灵动,下面对三种渐变效果做讨论。
2、接口定义
三种渐变方式对应的接口如下:
-
线性渐变
linearGradient(value: {angle?: number | string; direction?: GradientDirection; colors: Array<[ResourceColor, number]>; repeating?: boolean;})
参数说明如下:
-
-
angle: 线性渐变的起始角度。0点方向顺时针旋转为正向角度。默认值:180,角度为字符串时仅支持类型deg,grad,rad,trun。
-
direction: 线性渐变的方向,设置angle后不生效。默认值:GradientDirection.Bottom
-
colors: 指定某百分比位置处的渐变色颜色,设置非法颜色直接跳过。
-
repeating: 为渐变的颜色重复着色。默认值:false
-
线性渐变的示例效果如下:

-
角度渐变
sweepGradient(value: {center: [Length, Length]; start?: number | string; end?: number | string; rotation?: number | string; colors: Array<[ResourceColor, number]>; repeating?: boolean;})
仅绘制0-360度范围内的角度,超出时不绘制渐变色,只绘制纯色。参数说明如下:
-
-
center:为角度渐变的中心点,即相对于当前组件左上角的坐标。
-
start:角度渐变的起点。默认值:0,角度为字符串时仅支持类型deg,grad,rad,trun。
-
end:角度渐变的终点。默认值:0,角度为字符串时仅支持类型deg,grad,rad,trun。
-
rotation: 角度渐变的旋转角度。默认值:0,角度为字符串时仅支持类型deg,grad,rad,trun。
-
colors: 指定某百分比位置处的渐变色颜色,设置非法颜色直接跳过。
-
repeating: 为渐变的颜色重复着色。默认值:false
-
说明:
设置为小于0的值时,按值为0处理,设置为大于360的值时,按值为360处理。
当start、end、rotation的数据类型为string,合法的取值为纯数字或纯数字后带"deg"(度)、"rad"(弧度)、"grad"(梯度)、"turn"(圈)单位,例如:"90"、 "90deg"、"1.57rad"。
角度渐变的示例效果如下:

-
径向渐变
radialGradient(value: { center: [Length, Length]; radius: number | string; colors: Array<[ResourceColor, number]>; repeating?: boolean })
参数说明如下:
-
-
center:径向渐变的中心点,即相对于当前组件左上角的坐标。
-
radius:径向渐变的半径。取值范围:[0,+∞),设置为小于的0值时,按值为0处理。
-
colors: 指定某百分比位置处的渐变色颜色,设置非法颜色直接跳过。
-
repeating: 为渐变的颜色重复着色。默认值:false
-
径向渐变的示例效果如下:

3、代码示例
👉🏻 线性渐变代码示例
效果如下:

代码如下(使用了网格布局,一行展示两个效果):
@Entry@Componentstruct LinearGradientDemo {build() {Grid() {GridItem() {Column() {Text('angle: 180').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).linearGradient({// 0点方向顺时针旋转为正向角度,线性渐变起始角度的默认值为180°colors: [[0xf56c6c, 0.0], // 颜色断点1的颜色和比重,对应组件在180°方向上的起始位置[0xffffff, 1.0], // 颜色断点2的颜色和比重,对应组件在180°方向上的终点位置]})}GridItem() {Column() {Text('angle: 45').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).linearGradient({angle: 45, // 设置颜色渐变起始角度为顺时针方向45°colors: [[0xf56c6c, 0.0],[0xffffff, 1.0],]})}GridItem() {Column() {Text('repeat: true').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).linearGradient({repeating: true, // 在当前组件内0.3到1.0区域内重复0到0.3区域的颜色渐变效果colors: [[0xf56c6c, 0.0],[0xE6A23C, .3],]})}GridItem() {Column() {Text('repeat: false').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).linearGradient({colors: [[0xf56c6c, 0.0], // repeating默认为false,此时组件内只有0到0.3区域内存在颜色渐变效果[0xE6A23C, .3],]})}}.columnsGap(10).rowsGap(10).columnsTemplate('1fr 1fr').rowsTemplate('1fr 1fr 1fr').width('100%').height('100%')}}
👉🏻 角度渐变代码示例
效果如下:

代码如下:
@Entry@Componentstruct SweepGradientDemo {build() {Grid() {GridItem() {Column() {Text('center: 50').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).sweepGradient({center: [50, 50], // 角度渐变中心点start: 0, // 角度渐变的起点end: 360, // 角度渐变的终点。repeating: true, // 渐变效果在重复colors: [// 当前组件中,按照中心点和渐变的起点和终点值,// 角度区域为0-0.125的范围,从颜色断点1的颜色渐变到颜色断点2的颜色,// 角度区域0.125到0.25的范围,从颜色断点2的颜色渐变到颜色断点3的颜色,// 因为repeating设置为true,角度区域0.25到1的范围,重复区域0到0.25的颜色渐变效果[0xf56c6c, 0], // 颜色断点1的颜色和比重,对应角度为0*360°=0°,角点为中心点[0xffffff, 0.125], // 颜色断点2的颜色和比重[0x409EFF, 0.25] // 颜色断点3的颜色和比重]})}GridItem() {Column() {Text('center: 0').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).sweepGradient({center: [0, 0], // 角度渐变中心点,当前为组件的左上角坐标start: 0,end: 360,repeating: true,colors: [// 当前组件中,因为角度渐变中心是组件的左上角,所以从颜色断点1到颜色断点3的角度范围,恰好可以覆盖整个组件[0xf56c6c, 0], // 颜色断点1的颜色和比重,对应角度为0*360°=0°[0xffffff, 0.125], // 色断点2的颜色和比重,对应角度为0.125*360°=45°[0x409EFF, 0.25] // 色断点3的颜色和比重,对应角度为0.25*360°=90°]})}GridItem() {Column() {Text('repeat: true').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).sweepGradient({center: [50, 50],start: 0,end: 360,repeating: true,colors: [[0xf56c6c, 0],[0xffffff, 0.125],[0x409EFF, 0.25]]})}GridItem() {Column() {Text('repeat: false').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).sweepGradient({center: [50, 50],start: 0,end: 360,repeating: false, //只在颜色断点角度覆盖范围内产生颜色渐变效果,其余范围内不重复colors: [[0xf56c6c, 0],[0xffffff, 0.125],[0x409EFF, 0.25]]})}}.columnsGap(10).rowsGap(10).columnsTemplate('1fr 1fr').rowsTemplate('1fr 1fr 1fr').width('100%').height(437)}}
👉🏻 径向渐变代码示例
效果如下:

代码如下:
@Entry@Componentstruct radialGradientDemo {build() {Grid() {GridItem() {Column() {Text('center: 50').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).radialGradient({center: [50, 50], // 径向渐变中心点radius: 100, // 径向渐变半径repeating: true, // 允许在组件内渐变范围外重复按照渐变范围内效果着色colors: [// 组件内以[50,50]为中心点,在半径为0到12.5的范围内从颜色断点1的颜色渐变到颜色断点2的颜色,// 在半径为12.5到25的范围内从颜色断点2的颜色渐变到颜色断点3的颜色,// 组件外其他半径范围内按照半径为0到25的渐变效果重复着色[0xf56c6c, 0], // 颜色断点1的颜色和比重,对应半径为0*100=0[0xffffff, 0.125], // 颜色断点2的颜色和比重,对应半径为0.125*100=12.5[0x409EFF, 0.25] // 颜色断点3的颜色和比重,对应半径为0.25*100=25]})}GridItem() {Column() {Text('center: 0').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).radialGradient({center: [0, 0], // 径向渐变中心点,当前为组件左上角坐标radius: 100,repeating: true,colors: [[0xf56c6c, 0],[0xffffff, 0.125],[0x409EFF, 0.25]]})}GridItem() {Column() {Text('repeat: true').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).radialGradient({center: [50, 50],radius: 100,repeating: true,colors: [[0xf56c6c, 0],[0xffffff, 0.125],[0x409EFF, 0.25]]})}GridItem() {Column() {Text('repeat: false').fontSize(15)}.width(100).height(100).justifyContent(FlexAlign.Center).borderRadius(10).radialGradient({center: [50, 50],radius: 100,repeating: false, // 在组件内渐变范围外不重复按照渐变范围内效果着色colors: [[0xf56c6c, 0],[0xffffff, 0.125],[0x409EFF, 0.25]]})}}.columnsGap(10).rowsGap(10).columnsTemplate('1fr 1fr').rowsTemplate('1fr 1fr 1fr').width('100%').height('100%')}}
4、one more thing
一般情况下,除非我们是设计师,否则很难找到一些比较好的渐变色搭配,如果你想找一些合适的渐变色,可以来这里找找 http://www.gradientsguru.com/ (注意,这不是在打广告)
如果你也有其他的好的设计资源网站,欢迎留言~

相关文章:
鸿蒙UI开发——渐变色效果
1、概 述 ArkTs可以通过颜色渐变接口,设置组件的背景颜色渐变效果,实现在两个或多个指定的颜色之间进行平稳的过渡。 目前提供三种渐变类型:线性渐变、角度渐变、径向渐变。 我们在鸿蒙UI布局实战 —— 个人中心页面开发中,默认…...
嵌入式硬件设计 — 智能设备背后的隐形架构大师
目录 引言 一、嵌入式硬件设计概述 (一)需求分析 (二)硬件选型 (三)电路设计 (四)PCB 制作与焊接 (五)硬件调试与测试 (六)软…...
QNX的系统资源访问机制
资料参考: QNX官网文档 在QNX中,一些系统的资源默认是无法访问的,或者可访问的范围过大,导致产生不可控的危险,此时便需要对系统资源进行访问限制 接口如下 #include <sys/rsrcdbmgr.h> #include <sys/rsrcdbmsg.h>int rsrcdbmgr_create(...
高校数字化运营平台解决方案:构建统一的服务大厅、业务平台、办公平台,助力打造智慧校园
教育数字化是建设教育强国的重要基础,利用技术和数据助推高校管理转型,从而更好地支撑教学业务开展。 近年来,国家多次发布政策,驱动教育行业的数字化转型。《“十四五”国家信息化规划》,推进信息技术、智能技术与教育…...
多模态大型语言模型MM-1.5采用数据驱动的方法,通过不断优化数据组合提高模型性能
多模态大型语言模型MM-1.5采用数据驱动的方法,通过不断优化数据组合提高模型性能 MM-1.5模型的设计核心在于其数据驱动的方法,这意味着模型的性能在很大程度上取决于所使用的数据类型和组合。这种方法的实施细节可以从以下几个方面来展开: …...
16 设计模式之适配器模式(充电器转换案例)
一、适配器模式的定义 适配器模式(Adapter Pattern)是一种结构型设计模式,常用于解决接口不兼容的问题。适配器模式通过引入一个“适配器”类,将一个接口转化为客户端期望的另一种接口,使得原本因接口不兼容而无法交互…...
基于Java Springboot在线招聘APP且微信小程序
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…...
多组学数据如何发表高分SCI论文,以RNA-Seq数据为例
随着高通量测序以及生物信息学的发展,R语言在生物大数据分析以及数据挖掘中发挥着越来越重要的作用。想要成为一名优秀的生物数据分析者与科研团队不可或缺的人才,除了掌握对生物大数据挖掘与分析技能之外,还要具备一定的统计分析能力与SCI论…...
Qt Designer Ui设计 功能增加
效果展示 输入密码,密码错误,弹出提示 密码正确,弹出提示并且关闭原窗口 代码(只提供重要关键主代码)lxh_log.py代码: import sysfrom PySide6.QtWidgets import QApplication, QWidget, QPushButtonfrom …...
【Android学习】2024最新版Android Studio安装与配置
准备工作 Windows系统的要求 一、下载 Android Studio官网:https://developer.android.google.cn/studio?hlen 今天是2024年9月27日,Android Studio已经更新到了Koala版本 直接下载 二、安装 笔者当前环境变量中配置的JDK版本为1.8 双击.exe文件运行…...
RabbitMQ延时队列
RabbitMQ延时队列 什么是延时队列 延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费。 应用场景 场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如…...
a8204 基于微信小程序的音乐播放器微信小程序的研究与实现 服务器端Java+Mysql+Servlet 文档 源码
音乐播放微信小程序 1.项目描述2. 绪论3.项目功能4.界面展示5.源码获取 1.项目描述 随着科技的发展,手机在我们生活中起到了重要的作用。软件作为手机重要的一部分,用户体验显得尤为重要。微信小程序一起操作便捷、用户基数大、分享便利、既用即走等特点…...
游戏新纪元:用栈记录数据,轻松实现悔棋功能
游戏介绍 嘿,各位游戏爱好者们!今天我要给大家介绍一款颠覆传统、创新十足的游戏项目。这款游戏不仅让你沉浸在紧张刺激的游戏世界中,还引入了前所未有的两大特色功能:记录游戏数据和轻松实现悔棋。 首先,让我们来聊…...
C/C++基础知识复习(36)
函数重载是指在同一作用域内,定义多个同名但参数列表不同的函数。通过函数重载,程序员可以使用相同的函数名称处理不同类型或数量的参数,而不需要为每种情况创建不同的函数名称。编译器根据函数调用时传递的参数类型和数量来决定调用哪个版本…...
JAVA |日常开发中连接Sqlite数据库详解
JAVA |日常开发中连接Sqlite数据库详解 前言一、SQLite 数据库概述1.1 定义与特点1.2 适用场景 二、Java 连接 SQLite 数据库的准备工作2.1 添加 SQLite JDBC 驱动依赖2.2 了解 JDBC 基础概念 三、建立数据库连接3.1 代码示例3.2 步骤解析 四、执行 SQL 语句4.1 创建…...
Java项目实战II基于微信小程序的消防隐患在线举报系统(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加快&…...
python编程Day12-属性和方法的分类
私有和公有 在python中 定义类的时候,可以给 属性和方法设置 访问权限,即规定在什么地方可以使用。 权限一般分为两种:公有权限、私有权限 公有权限 定义:直接定义的属性和方法就是公有的特点: 可以在任何地方访问和使…...
【unity小技巧】在 Unity 中,Application获取各种文件路径或访问不同类型的存储路径
文章目录 前言1. **Application.persistentDataPath**2. **Application.dataPath**3. **Application.streamingAssetsPath**4. **Application.temporaryCachePath**5. **Application.consoleLogPath**6. **Application.userDataPath**7. **Application.streamingAssetsPath 与 …...
c++:timer
1.设置休眠时间sleep_for 添加头文件 #include <thread> #include <iostream> #include <chrono> #include <thread>int main(int argc, char const *argv[]) {// 休眠2秒std::this_thread::sleep_for(std::chrono::seconds(2));// 休眠500毫秒std:…...
VSCode(四)CMake调试
1. 工具准备 1.1 C环境插件 1.2 CMake插件 2. Cmake工程 2.1 创建项目文件夹 ex:CMAKE_TEST 2.2 创建CMake工程 (shift ctl P), 选择"CMAKE: Quick Start": 2.3 填写project name: (ex: test_cmake) 2.4 选择”Executable“ 项目文件内会自动…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
