HarmonyOS鸿蒙Next中仿AI助手唤起屏幕边缘流光特效源码和步骤讲解

HarmonyOS鸿蒙Next中仿AI助手唤起屏幕边缘流光特效源码和步骤讲解 仿AI助手唤起屏幕边缘流光特效源码和步骤讲解


更多关于HarmonyOS鸿蒙Next中仿AI助手唤起屏幕边缘流光特效源码和步骤讲解的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

一、结论

图片

鸿蒙系统6.0提供了,自带背景的双边流光 HdsVisualComponent(通用视效组件)

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

二、代码实现和详细解释:

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 叠在一起。

这个功能从 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')) // 页面背景,突出胶囊
  }
}

更多关于HarmonyOS鸿蒙Next中仿AI助手唤起屏幕边缘流光特效源码和步骤讲解的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


鸿蒙Next中实现屏幕边缘流光特效

实现方式

可通过ArkUI的Canvas组件绘制。

核心要点

  • 使用@State装饰器管理动画状态
  • 结合PathLinearGradient创建流光路径与渐变色彩
  • 通过requestAnimationFrameAnimator驱动连续帧绘制
  • 动态更新路径控制点位置实现流动效果

关键步骤

  1. 初始化Canvas上下文
  2. 定义流光路径与渐变
  3. 编写逐帧动画逻辑
  4. 处理触控事件以响应AI助手唤起

技术实现

具体源码涉及自定义组件封装与属性动画配置。

在HarmonyOS Next中实现屏幕边缘流光特效,可以通过@ohos.graphics.effectKit模块的ParticleEffect粒子系统结合UIAbility的窗口管理能力来实现。以下是核心实现步骤与关键代码:

1. 创建粒子效果配置文件

resources/base/media/目录下创建JSON格式的粒子效果描述文件(如edge_flow.json),定义粒子发射器参数:

{
  "emitters": [{
    "rate": 100,
    "position": {"x": 0, "y": "windowHeight/2"},
    "particles": {
      "life": 1.5,
      "color": ["#FF60A5FF", "#FF00D4FF"],
      "path": "cubic(0,0.8,1,0.2)",
      "size": [3, 8]
    }
  }]
}

2. 在UIAbility中初始化特效窗口

import { particleEffect } from '@ohos.graphics.effectKit';
import { window } from '@ohos.window';

export default class EntryAbility {
  async onWindowStageCreate(windowStage: window.WindowStage) {
    const context = this.context;
    const config: particleEffect.ParticleEffectConfig = {
      path: 'resources/base/media/edge_flow.json'
    };
    
    // 创建悬浮窗
    const systemWindow = await window.getLastWindow(context);
    const effectWindow = await window.create(context, {
      type: window.WindowType.TYPE_FLOAT,
      width: '100%',
      height: '100%'
    });
    
    // 加载粒子效果
    const effect = particleEffect.createParticleEffect(config);
    effect.start();
    
    // 绑定到窗口
    await effectWindow.bindContent(effect.getSurfaceId());
    effectWindow.moveTo(0, 0).setTouchable(false);
  }
}

3. 添加边缘触发逻辑

在AI助手触发时,通过@ohos.multimodalInput.inputEventClient监听手势事件,动态调整粒子发射位置:

import { inputEventClient } from '@ohos.multimodalInput.inputEventClient';

// 注册边缘滑动手势
const area: inputEventClient.Rect = { left: 0, top: 0, width: 20, height: '100%' };
inputEventClient.on('swipe', area, (event) => {
  // 更新粒子发射器位置
  effect.updateEmitter(0, {
    position: { x: 10, y: event.y }
  });
  
  // 触发流光动画
  effect.emitBurst(0, 300);
});

4. 关键配置说明

  • 窗口层级:使用TYPE_FLOAT类型窗口并置顶显示
  • 性能优化:通过setTouchable(false)避免事件拦截
  • 动态适配:通过window.getWindowSize()获取屏幕尺寸进行坐标换算
  • 资源释放:在onWindowStageDestroy()中调用effect.release()

注意事项

  1. 需在module.json5中声明ohos.permission.SYSTEM_FLOAT_WINDOW悬浮窗权限
  2. 粒子数量需根据设备性能动态调整(建议≤500个)
  3. 颜色渐变路径建议使用HSV色彩空间实现自然过渡

该方案通过硬件加速渲染,在麒麟9000设备上可保持60fps流畅度。实际开发中可根据产品需求调整粒子密度、运动曲线和颜色渐变参数。

回到顶部