【HarmonyOS 6】仿AI唤起屏幕边缘流光特效

【HarmonyOS 6】仿AI唤起屏幕边缘流光特效

一、前言

最近在做 HarmonyOS 6.0 的适配,发现 Beta1版本里多了个很实用的视效功能——自带背景的双边流光

之前做屏幕边缘流光特效的时候,要么得自己写渐变+动画拼效果,要么就得套好几个组件叠层,加上视频或者lottie,调试起来特别麻烦。

现在用系统提供的 HdsVisualComponent 直接调用,参数配置好就能出效果,省了不少事儿。今天就把这个功能的实战过程跟大家捋一捋,附上能直接跑的 Demo 代码。

请添加图片描述

二、先搞懂:这个功能到底能干嘛?

简单说,这个自带背景的双边流光是通过 HdsVisualComponent(通用视效组件)提供的场景接口实现的,核心能做两件事:

1、控制两条独立的流光:每条流光都能设起始位置、终止位置和颜色,比如一条从左到右,一条从下到上,颜色还能不一样;
2、叠加背景板颜色:背景可以是单色,也能搞渐变色(传颜色数组就行),不用再额外套一个 Container 当背景;

之前自己写的时候,光处理流光的“流动方向”和“背景不穿透”就踩了好几个坑,现在系统把这些封装成场景接口,直接传参数就行,效率提升不是一点半点。

三、从导入到出效果,3步搞定

1、先导入必须的模块

首先得把需要的组件和枚举导入进来,不用记全,重点是这几个

HdsVisualComponent:核心的视效组件,所有效果都靠它渲染

HdsSceneController:用来控制场景参数(比如流光位置、颜色)

HdsSceneType:
指定场景类型,这里必须用 DUAL_EDGE_FLOW_LIGHT_WITH_BACKGROUND_MASK(双边流光带背景)

HdsVisualComponentAttribute:
可选,用来加更多属性配置,基础用法暂时用不上,但导入也不影响。

代码如下,直接复制到页面顶部就行:

import {HdsVisualComponent,HdsSceneController,HdsSceneType,// HdsVisualComponentAttribute // 基础用法暂不启用,注释掉也能跑
} from '@kit.UIDesignKit';
// 别忘了导入Color,处理颜色用
import { Color } from '@ohos.ui';

2、初始化场景控制器,配置核心参数

接下来要创建 HdsSceneController 实例,关键是通过 setSceneParams 配置参数。这里得拎清楚每个参数的作用,不然效果可能跟预期不一样:

参数名作用说明
backgroundMaskColors背景色,支持单色(传一个颜色)或渐变色(传多个颜色,比如 [绿, 红] 就是红绿渐变)
firstEdgeFlowLight第一条流光配置:startPos(起始位置)、endPos(终止位置)、color(流光颜色)
secondEdgeFlowLight第二条流光配置:参数跟第一条一样,注意 startPos/endPos 可以正负值控制方向

这里有个小细节:
startPosendPos相对位置,范围建议在 -1 到 1 之间。

正数代表“从组件起点向终点方向”(比如水平组件的从左到右),负数代表“从终点向起点方向”(比如从右到左)。

比如 endPos: 0.5 就是流光到组件中间位置停,endPos: -0.5 就是从中间往反方向延伸。

初始化代码可以用 @State 装饰器,方便后续动态修改参数(比如点击改变颜色):

@State sceneController: HdsSceneController = new HdsSceneController().setSceneParams({// 背景用红绿渐变,从绿到红backgroundMaskColors: [Color.Green, Color.Red],// 第一条流光:从0位置开始,到中间(0.5)结束,红色firstEdgeFlowLight: {startPos: 0,endPos: 0.5,color: Color.Red},// 第二条流光:从0位置开始,到反方向中间(-0.5)结束,绿色secondEdgeFlowLight: {startPos: 0,endPos: -0.5,color: Color.Green}});

3、渲染 HdsVisualComponent,绑定场景

最后一步就是在 build 里把 HdsVisualComponent 渲染出来,指定场景类型和控制器,再设好宽高(不然组件没大小,看不到效果)。

这里建议用 Stack 包一下,方便后续叠加其他内容(比如文字、图标)。比如做胶囊按钮的话,就把文字放在 Stack 里,跟 HdsVisualComponent 叠在一起。

请添加图片描述

基础渲染代码:

build() {Stack({ alignContent: Alignment.Center }) {// 双边流光组件:作为背景HdsVisualComponent()// 绑定场景类型和控制器,回调可选(成功渲染的提示).scene(HdsSceneType.DUAL_EDGE_FLOW_LIGHT_WITH_BACKGROUND_MASK,this.sceneController,() => {console.info('双边流光渲染成功!');})// 设宽高:100%宽,50%高(根据需求调整).width('100%').height('50%')// 圆角:模拟胶囊效果,可选.borderRadius(24)// 叠加文字:比如胶囊按钮的文字Text('双边流光示例').fontSize(20).fontColor(Color.White).fontWeight(FontWeight.Bold)}.padding(20)
}

DEMO源码:

这个功能从 6.0.0 (20) Beta1 开始支持,低于这个版本的设备会报错,建议在使用前加版本判断(比如用 deviceInfo.apiVersion 做兼容)。

上面的基础版能看到效果,但实际开发中肯定需要交互(比如点击改变流光颜色)。我把 Demo 改了下,做了个“点击切换流光颜色”的胶囊按钮,直接复制就能跑:

import {HdsVisualComponent,HdsSceneController,HdsSceneType
} from '@kit.UIDesignKit';
import { Color, FontWeight, Alignment } from '@ohos.ui';
import { Component, Entry, State, Stack, Text, TapGesture } from '@ohos.ui.components';@Entry
@Component
struct DualEdgeFlowLightDemo {// 用@State存颜色,方便点击修改@State bgColors: Color[] = [Color('#2196F3'), Color('#9C27B0')]; // 初始背景:蓝到紫@State firstFlowColor: Color = Color('#FFEB3B'); // 第一条流光:黄色@State secondFlowColor: Color = Color('#00E676'); // 第二条流光:绿色// 场景控制器:依赖颜色状态,所以用getter动态更新get sceneController(): HdsSceneController {return new HdsSceneController().setSceneParams({backgroundMaskColors: this.bgColors,firstEdgeFlowLight: {startPos: 0,endPos: 0.6, // 第一条流光大半屏color: this.firstFlowColor},secondEdgeFlowLight: {startPos: 0,endPos: -0.6, // 第二条流光反方向大半屏color: this.secondFlowColor}});}build() {Stack({ alignContent: Alignment.Center }) {// 1. 双边流光背景HdsVisualComponent().scene(HdsSceneType.DUAL_EDGE_FLOW_LIGHT_WITH_BACKGROUND_MASK,this.sceneController,() => {console.info('流光渲染成功,点击可切换颜色~');}).width('80%').height(56) // 胶囊按钮高度,固定更美观.borderRadius(28) // 圆角=高度/2,完美胶囊// 加点击手势:切换颜色.gesture(TapGesture().onAction(() => {// 点击切换颜色:蓝紫→红绿,黄→红,绿→黄this.bgColors = this.bgColors[0] === Color('#2196F3') ? [Color.Green, Color.Red] : [Color('#2196F3'), Color('#9C27B0')];this.firstFlowColor = this.firstFlowColor === Color('#FFEB3B') ? Color.Red : Color('#FFEB3B');this.secondFlowColor = this.secondFlowColor === Color('#00E676') ? Color('#FFEB3B') : Color('#00E676');}))// 2. 叠加按钮文字Text('点击切换流光颜色').fontSize(18).fontColor(Color.White).fontWeight(FontWeight.Bold)}.width('100%').height('100%').backgroundColor(Color('#F5F5F5')) // 页面背景,突出胶囊}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟做springboot尚品甄选项目

springbootvue3 【尚硅谷Java项目《尚品甄选》 SpringBootSpringCloud萌新学会企业级java项目】003.后台系统-搭建前端环境(工程创建)_哔哩哔哩_bilibili E:\project\AllProJect\Shangpin Selection\项目材料素材\课件\尚品甄选项目课件 前端套用框架…

【Linux】创建线程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 文章目录 一、为什么需要线程? 创建线程 示例:计算斐波恩夕法 一、为什么需要线程? 在多核处理器的计算机上,线程可…

HTML应用指南:利用POST请求获取全国九号电动车体验店服务店位置信息

九号公司(Ninebot)作为全球领先的智能短途出行解决方案提供商,始终秉持“智慧移动,愉悦生活”的品牌理念,致力于为个人用户打造安全、智能、时尚的城市出行体验。依托“智能硬件 + 数字服务 + 线下触点”三位一体的战略布局,九号公司已建立起覆盖全国、辐射全球的销售与服…

Kafka面试精讲 Day 4:Consumer消费者模型与消费组

【Kafka面试精讲 Day 4】Consumer消费者模型与消费组 在“Kafka面试精讲”系列的第四天,我们将深入探讨Kafka的核心组件之一——Consumer消费者模型与消费组(Consumer Group)。这是Kafka实现高吞吐、可扩展消息消费的关键机制,也…

使用 Uni-app 打包 外链地址APK 及 iOS 注意事项

本文详细介绍了如何使用 Uni-app 框架将项目打包为 Android APK 和 iOS 应用,重点讲解了 minSdkVersion、targetSdkVersion 和 abiFilters 的配置,以及 iOS 开发的注意事项。文章还包含了您提供的 WebView 示例代码,并提供了关键的注意事项&a…

异常处理小妙招——3.构造函数的安全第一原则:为什么不在构造函数中抛出异常?

文章目录灾难性的生日派对构造函数:对象的出生证明安全第一:严格的出生检查为什么要在构造函数中严格验证?1. 避免"僵尸对象"2. Fail-Fast(快速失败)原则现实世界的实践建议1. 使用工厂方法模式2. 使用Build…

iptables 和 ip route

文章目录iptables原理及常用命令表链链表链表总结iptables 常用命令及参数1. 规则管理命令 (Commands)2. 规则匹配参数 (Rule-Specification - Matches)3. 目标动作参数 (Target)命令示例配置流程示例ip route常用命令iptables和ip route的联系实用命令示例对比iptables原理及常…

RPC和HTTP的区别?

RPC和HTTP是两种不同的通信协议,它们在通信方式、性能效率以及灵活性可扩展性等方面存在区别。以下是具体分析: 通信方式 RPC:RPC是基于远程过程调用的二进制协议,它允许客户端像调用本地函数一样调用远程服务器上的函数或方法[2]…

贝叶斯分类(Bayes Classify)

一. 核心思想贝叶斯分类是一类基于贝叶斯定理(Bayes Theorem)和概率统计的分类算法,核心思想是 “通过已知的先验概率,结合数据的似然性,计算后验概率,最终将样本归为后验概率最高的类别”。它在机器学习、…

怎么熟悉业务,我是做前端的,但对业务了解没有渠道

作为前端开发者,想深入了解业务但“没有渠道”,这是非常普遍的痛点。很多前端同学只接到“切图实现页面”的任务,久而久之就成了“实现工具人”。但业务理解力,恰恰是区分“初级”和“高级”前端的核心分水岭。 好消息是&#xff…

如何批量在PDF文档最后一页盖章?

在面对上百份需要处理的 PDF 文档时,逐个打开文档盖章再进行保存,这些步骤不仅提高我们工作的繁琐,还容易导致处理位置错误或遗漏。那么怎么去将 PDF 文档末页实现批量自动打上电子印章?一般的方式没有办法来满足我们高效率办公的…

Keras/TensorFlow 中 `predict()` 函数详细说明

Keras/TensorFlow 中 predict() 函数详细说明 predict() 是 Keras/TensorFlow 中用于模型推理的核心方法,用于对输入数据生成预测输出。下面我将从多个维度全面介绍这个函数的用法和细节。 一、基础语法和参数 基本形式 predictions model.predict(x,batch_sizeNon…

题解:UVA1589 象棋 Xiangqi

看到代码别急着走,还要解释呢!哈哈,知道这个题我是怎么来的吗?和爸爸下象棋20场输17场和2场QWQ于是乎我就想找到一个可以自动帮我下棋的程序,在洛谷上面搜索,就搜索到了这个题。很好奇UVA的为啥空间限制是0…

基于YOLOv11的脑卒中目标检测及其完整数据集——推动智能医疗发展的新机遇!

在当今科技迅速发展的时代,脑卒中作为一种严重威胁人类健康的疾病,其早期的检测和及时的干预显得尤为重要。为此,本项目推出基于YOLOv11的脑卒中目标检测系统,结合完整的数据集,不仅提高了检测的效率,更为医…

sed——Stream Editor流编辑器

文章目录前言一、什么是sed二、sed的原理2.1 sed工作流程的三个步骤2.2 sed的两个重要空间:2.3 sed的具体运作流程三、sed的常见用法3.1 sed的基本格式3.2 常用选项3.3 常用操作3.3.1 基本语法规则3.3.2 常用操作命令3.4 操作用法示例3.4.1 输出符合条件的文本&…

Zotero白嫖腾讯云翻译

Zotero白嫖腾讯云无限制字数翻译 文章目录Zotero白嫖腾讯云无限制字数翻译1、安装插件1、登录腾讯云2、找到访问管理进入3、创建一个子用户4、启用机器翻译功能5、复制秘钥6、设置到Zotero1、安装插件 zotero-pdf-translate:https://github.com/windingwind/zotero…

TCP多进程和多线程并发服务

进程和线程的区别: 详细的可以参考这样文档进程和线程的区别(超详细)-CSDN博客 核心比喻 进程 一个工厂:这个工厂拥有独立的资源(厂房、原材料、资金、电力)。每个工厂之间是相互隔离的,一个工厂着火…

计算机毕业设计springboot基于Java+Spring的疫苗接种管理系统的设计与实现 基于Spring Boot框架的疫苗接种信息管理系统开发与应用 Java与Spring技术驱动的疫苗接种管理

计算机毕业设计springboot基于JavaSpring的疫苗接种管理系统的设计与实现69geq9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着信息技术的飞速发展,计算机技术在…

C/C++圣诞树①

写在前面 圣诞节将至,我总想用代码做点什么,来表达对这个温馨节日的敬意。于是,我决定用C语言在控制台中绘制一幅充满节日气氛的圣诞树画面。它不仅有闪烁的雪花、五彩的灯光,还有一颗颗精心雕琢的心形图案,仿佛把整个…

【小白入】显示器核心参数对比度简介

对比度是一个非常核心的显示器参数。下面我们来了解一下。一、核心定义:什么是对比度?显示器的对比度(Contrast Ratio)是指其最亮状态(白色)与最暗状态(黑色)之间的亮度比值。简单来…