HarmonyOS鸿蒙Next中需要一个字体动画效果,由中间向两边发散开?

HarmonyOS鸿蒙Next中需要一个字体动画效果,由中间向两边发散开? 需要一个可控的控制字符初始展开幅度的字体控件

cke_1421.png


更多关于HarmonyOS鸿蒙Next中需要一个字体动画效果,由中间向两边发散开?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

通过自定义组件实现这个效果:自定义SpreadTextAnimation 组件就是为此设计的,它将文本分解为单个字符,并从中心向两侧创建展开动画。

SpreadTextAnimation 字体动画组件实现方案

一、效果描述

SpreadTextAnimation 是一个能够实现文字从中心向两侧展开的动画组件。该组件具备以下特点:

a. 文字从中心位置向两侧发散展开 b. 支持控制字符初始展开幅度 c. 可调节动画速度和延迟 d. 支持水平和垂直两种排列方向 e. 提供淡入淡出和位移两种动画效果

当动画触发时,文本中的每个字符会根据其相对于文本中心的位置,以不同的时间和幅度进行展开,形成一种涟漪般的视觉效果。

二、问题抛出

在实现这种字体动画效果时,我们需要解决以下几个关键技术问题:

  1. 动画同步问题
  • 如何确保字符按照从中心向两侧的顺序依次展开
  • 如何控制不同字符间的动画延迟时间
  1. 参数可控性问题
  • 如何实现字符初始展开幅度的可调节
  • 如何让动画的速度、延迟等参数可配置
  1. 灵活性问题
  • 如何支持不同的文本排列方向(水平/垂直)
  • 如何支持不同的动画曲线效果
  1. 性能问题
  • 如何避免大量字符动画对页面性能的影响
  • 如何合理管理组件状态

三、解决方案

  1. 核心实现思路

通过以下步骤实现从中心向两侧展开的动画效果:

a. 将文本内容分解为单个字符数组 b. 计算文本的中心位置 c. 根据每个字符与中心的距离确定动画延迟 d. 为每个字符设置位移和透明度动画

  1. 关键属性设计

@Component export struct SpreadTextAnimation { // 文本内容(支持Resource资源或字符串) @Prop textContent: Resource | string = “测试文本” // 字体大小(默认24) @Prop fontSize: number = 24 // 文字颜色(默认白色) @Prop textColor: Color = Color.White // 动画持续时间(单位ms,默认800) @Prop duration: number = 800 // 字符动画延迟系数(默认150ms间隔) @Prop delayFactor: number = 150 // 是否启用淡入淡出效果(默认开启) @Prop enableFade: boolean = true // 是否启用位移动画(默认开启) @Prop enableTranslate: boolean = true // 字符排列方向(默认横向排列) @Prop directions: FlexDirection = FlexDirection.Row // 容器布局方向(默认横向布局) @Prop layoutDirection: FlexDirection = FlexDirection.Row // 动画曲线(默认缓出效果) @Prop curve: Curve = Curve.EaseOut // 字符间距乘数(默认2.5倍)- 控制初始展开幅度的关键参数 @Prop spacingFactor: number = 2.5 // 字体粗细(默认粗体) @Prop fontWeight: FontWeight = FontWeight.Bold

// 组件激活状态控制 @State private isActive: boolean = false }

  1. 核心算法实现

字符位移计算

// 根据排列方向计算位移值 private getTranslateValue(index: number): TranslateOptions { const content = this.textContent.toString() const center = Math.floor(content.length / 2) // 计算文本中心位置 const distance = index - center // 计算当前字符与中心的距离

if (this.directions === FlexDirection.Row) { return { x: distance * this.spacingFactor, y: 0 } } else { return { y: distance * this.spacingFactor, x: 0 } } }

动画延迟计算

// 计算字符动画延迟时间(基于与中心位置的距离) private calculateDelay(index: number): number { const content = this.textContent.toString() const center = Math.floor(content.length / 2) return Math.abs(index - center) }

动画应用

build() { Flex({ direction: this.layoutDirection, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { if (!this.textContent) { Text(‘Loading…’).fontSize(this.fontSize) } else { // 遍历文本内容生成字符动画 ForEach(Array.from(this.textContent.toString()), (char: string, index: number) => { Text(char) .key(${char}_${index}) .fontSize(this.fontSize) .fontColor(this.textColor) .fontWeight(this.fontWeight) .margin(5) .opacity(this.enableFade ? this.calculateOpacity() : 1) .translate(this.enableTranslate ? this.getTranslateValue(index) : { x: 0, y: 0 }) .animation({ duration: this.duration, curve: this.curve, delay: this.calculateDelay(index) * this.delayFactor }) }) } } .width(‘100%’) .height(‘100%’) .onAppear(() => { this.isActive = true }) }

  1. 使用示例

@Entry @Component struct SpreadTextAnimationDemo { build() { Column({ space: 20 }) { // 基础使用 SpreadTextAnimation({ textContent: “欢迎使用”, fontSize: 28, textColor: Color.Blue })

  // 自定义展开幅度
  SpreadTextAnimation({
    textContent: "自定义幅度",
    fontSize: 24,
    spacingFactor: 4.0,  // 控制初始展开幅度
    textColor: Color.Red
  })

  // 调节动画速度
  SpreadTextAnimation({
    textContent: "快速动画",
    fontSize: 24,
    delayFactor: 50,     // 更快的动画扩散速度
    duration: 500,       // 更短的动画持续时间
    textColor: Color.Green
  })
}

} }

通过以上方案,我们成功实现了从中心向两侧展开的字体动画效果,并提供了对字符初始展开幅度等关键参数的控制能力。

cke_13982.png cke_29357.png

更多关于HarmonyOS鸿蒙Next中需要一个字体动画效果,由中间向两边发散开?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


@Local block: string = "";
// 可以试试这样,执行动画的时候往block里面添加空格

Text() {
        Span("欢");
        Span(this.block);
        Span("迎");
        Span(this.block);
        Span("使");
        Span(this.block);
        Span("用");
      };

在HarmonyOS Next中,可通过ArkUI的Canvas组件自定义绘制实现字体动画。使用TextMetrics获取文字宽度,结合属性动画(如animateTo)动态改变绘制起点和终点坐标,模拟从中心向两侧扩散效果。关键步骤包括:计算文字中心点,分别控制左右两半文字的起始位置,并随时间递增调整间距。

在HarmonyOS Next中实现字体从中间向两边发散的动画效果,可以通过ArkUI的动画能力结合自定义布局或属性动画来完成。这里提供两种核心思路:

1. 使用Text组件结合animateToscaleX变换

通过为每个字符或字符容器单独设置X轴缩放动画,并错开动画开始时间,可以实现从中心向两侧的发散效果。

关键步骤:

  • 将字符串拆分为单个字符,并为每个字符包裹一个容器(如RowFlex)。
  • 计算每个字符距离中心的位置,根据位置设置动画延迟(delay)。中心字符延迟为0,越靠两侧延迟时间越长。
  • animateTo中,将每个字符的scaleX从0(或一个初始幅度值)变化到1,实现展开效果。

示例代码片段:

// 假设字符数组为chars
Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center }) {
  ForEach(chars, (char, index) => {
    // 计算延迟:基于与中心位置的偏移量
    const delay = Math.abs(index - centerIndex) * 100 // 每偏移一个字符增加100ms延迟
    Text(char)
      .scaleX(this.scaleValues[index]) // scaleValues初始为0或初始幅度值
      .onClick(() => {
        animateTo({
          duration: 500,
          delay: delay,
          onFinish: () => {
            // 动画完成回调
          }
        }, () => {
          this.scaleValues[index] = 1 // 展开到完整大小
        })
      })
  })
}

2. 通过属性动画animation属性直接控制

为每个字符组件定义属性动画,动态计算scaleXanimationdelay参数。

示例代码片段:

Text(char)
  .scaleX(this.charScale)
  .animation({
    duration: 300,
    delay: this.computeDelay(index), // 根据字符位置计算延迟
    curve: Curve.EaseOut
  })

控制初始展开幅度

要控制初始展开幅度,可以:

  • 在动画开始前,设置scaleX的初始值为一个可控变量(如0.2代表展开20%)。
  • 通过状态变量动态调整初始值,从而控制动画起始点。

注意事项

  • 性能优化:如果字符数量较多,建议使用LazyForEach避免渲染压力。
  • 交互控制:可将动画触发机制绑定到点击、页面显示等事件。
  • 精确计时:延迟时间需根据字符数量和动画总时长合理分配,确保发散效果平滑。

这两种方法均能实现可控的、从中心向两侧发散的字体动画效果,可根据具体场景选择实现方式。

回到顶部