鸿蒙开发-UI-动画-弹簧曲线动画

本文详细介绍了鸿蒙开发中的UI组件动画,特别是弹簧曲线动画的原理、接口使用(springCurve和springMotion/responsiveSpringMotion)以及在实际项目中的应用示例,展示了如何创建具有交互性和可玩性的动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鸿蒙开发-UI-组件导航-Navigation

鸿蒙开发-UI-组件导航-Tabs

鸿蒙开发-UI-图形-图片

鸿蒙开发-UI-图形-绘制几何图形

鸿蒙开发-UI-图形-绘制自定义图形

鸿蒙开发-UI-图形-页面内动画

鸿蒙开发-UI-图形-组件内转场动画

文章目录

前言

一、基本概念

二、弹簧曲线动画实现

1.使用springCurve

2.使用springMotion和responsiveSpringMotion

总结


前言

上文细学习了鸿蒙开发UI组件内转场动画,了解转场的概念,学习在if/else,foreach场景下如何结合transition和animateTo实现组件的转场动画效果,本文将学习弹簧曲线动画。

一、基本概念

ArkUI提供预置动画曲线,指定动画属性从起始值到终止值变化规律,如Linear、Ease、EaseIn等。ArkUI也提供了由弹簧振子物理模型产生的弹簧曲线。通过弹簧曲线,开发者可以设置超过设置的终止值,在终止值附近震荡,直至最终停下来的效果。弹簧曲线的动画效果比其他曲线具有更强的互动性、可玩性。

二、弹簧曲线动画实现

1.使用springCurve

接口

//构造参数:构建时,可指定质量为1,根据调节刚度、阻尼两个参数,达到想要的震荡效果。
//velocity: 初速度,
//mass: 弹簧系统的质量
//stiffness: 刚度
//damping: 阻尼
springCurve(velocity: number, mass: number, stiffness: number, damping: number)

代码示例

//step1: 引入curves依赖
import curves from '@ohos.curves';
@Entry
@Component
struct SpringTest {
  @State translateX: number = 0;

  private jumpWithSpeed(speed: number) {
    this.translateX = -1;
//step3:配合translate,闭包中控制button组件位移变化,并指定初速度进行x方向的平移的弹簧动画
    animateTo({ duration: 2000, curve: curves.springCurve(speed, 1, 1, 1.2) }, () => {
      this.translateX = 0;
    })
  }

  build() {
    Column() {
      Button("button")
        .fontSize(14)
        .width(100)
        .height(50)
        .margin(30)
//step2: 定义button组件的内转动画样式
        .translate({ x: this.translateX })
      Row({space:50}) {
        Button("jump 50").fontSize(14)
          .onClick(() => {
//step4: 以初速度50的弹簧曲线进行平移
            this.jumpWithSpeed(50);
          })
        Button("jump 200").fontSize(14)
          .onClick(() => {
//step5: 以初速度200的弹簧曲线进行平移
            this.jumpWithSpeed(200);
          })
      }.margin(30)
    }.height('100%').width('100%')
  }
}

注:

1.速度只是放大了振荡的效果,不决定能否产生震荡

2.刚度越小、阻尼越大,springCurve的“弹性”越弱,振荡效果越弱

3.刚度减小或阻尼变大,达到过阻尼状态后,无论速度为多大,都不会有在终点值附近振荡的效果

2.使用springMotion和responsiveSpringMotion

springMotion接口

//response: 簧自然振动周期
//dampingFraction: 阻尼系数
//overlapDuration: 弹性动画衔接时长
springMotion(response?: number, dampingFraction?: number, overlapDuration?: number)

responsiveSpringMotion接口

//response: 簧自然振动周期
//dampingFraction: 阻尼系数
//overlapDuration: 弹性动画衔接时长
responsiveSpringMotion(response?: number, dampingFraction?: number, overlapDuration?: number)

代码示例

//step1: 引入curves依赖
import curves from '@ohos.curves';

@Entry
@Component
struct SpringMotionTest {
  @State positionX: number = 100;
  @State positionY: number = 100;
  diameter: number = 50;

  build() {
    Column() {
      Row() {
        Circle({ width: this.diameter, height: this.diameter })
          .fill(Color.Blue)
          .position({ x: this.positionX, y: this.positionY })
          .onTouch((event: TouchEvent) => {
            if (event.type === TouchType.Move) {
//step2: 跟手过程,使用responsiveSpringMotion曲线,减去小球半径,以使球的中心运动到手指位置
              animateTo({ curve: curves.responsiveSpringMotion() }, () => {
                
                this.positionX = event.touches[0].screenX - this.diameter / 2;
                this.positionY = event.touches[0].screenY - this.diameter / 2;
                console.info(`move, animateTo x:${this.positionX}, y:${this.positionY}`);
              })
            } else if (event.type === TouchType.Up) {
//step3: 离手时,使用springMotion曲线,当手离开,小球弹回原来的位置
              animateTo({ curve: curves.springMotion() }, () => {
                this.positionX = 100;
                this.positionY = 100;
                console.info(`touchUp, animateTo x:100, y:100`);
              })
            }
          })
      }
      .width("100%").height("80%")
      .clip(true) // 如果球超出父组件范围,使球不可见
      .backgroundColor(Color.Orange)

      Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Center }) {
        Text("拖动小球").fontSize(16)
      }
      .width("100%")

      Row() {
        Text('点击位置: [x: ' + Math.round(this.positionX) + ', y:' + Math.round(this.positionY) + ']').fontSize(16)
      }
      .padding(10)
      .width("100%")
    }.height('100%').width('100%')
  }
}

注:

1.使用springMotion和responsiveSpringMotion曲线时,duration不生效,适合于跟手动画

2.跟手过程推荐使用responsiveSpringMotion曲线,松手过程推荐使用springMotion曲线

3.springCurve可以设置初速度,单一属性存在多个动画时不会互相影响,观察到的是多个动画效果的叠加

4.springMotion内部有速度机制,不可由开发者设置。在单一属性存在多个动画时,后一动画会取代前一动画,并继承前一动画的速度


总结

本文细学习了鸿蒙开发UI弹性曲线动画,了解弹性曲线的概念,学习了弹性曲线两种实现方式以及使用场景,下文将学习页面间动画。

declare class Scroller { /** * constructor. * * @syscap SystemCapability.ArkUI.ArkUI.Full * @since 7 */ /** * constructor. * * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @since 10 */ /** * constructor. * * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @atomicservice * @since 11 */ constructor(); /** * Called when the setting slides to the specified position. * * @param { object } value * @syscap SystemCapability.ArkUI.ArkUI.Full * @since 7 */ /** * Called when the setting slides to the specified position. * * @param { object } value * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @since 10 */ /** * Called when the setting slides to the specified position. * * @param { object } value * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @atomicservice * @since 11 */ scrollTo(value: { /** * The X-axis offset. * * @type { number | string } * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @since 10 */ /** * The X-axis offset. * * @type { number | string } * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @atomicservice * @since 11 */ xOffset: number | string; /** * The Y-axis offset. * * @type { number | string } * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @since 10 */ /** * The Y-axis offset. * * @type { number | string } * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @atomicservice * @since 11 */ yOffset: number | string; /** * Descriptive animation. * * @type { ?({ duration?: number; curve?: Curve | ICurve } | boolean) } The object type provides custom animation parameters * and the boolean type enables default spring animation. * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @since 10 */ /** * Descriptive animation. * * @type { ?({ duration?: number; curve?: Curve | ICurve } | boolean) } The object type provides custom animation parameters * and the boolean type enables default spring animation. * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @atomicservice * @since 11 */ /** * Descriptive animation. * * @type { ?( ScrollAnimationOptions | boolean) } The ScrollAnimationOptions type provides custom animation parameters * and the boolean type enables default spring animation. * @syscap SystemCapability.ArkUI.ArkUI.Full * @crossplatform * @atomicservice * @since 12 */ animation?: ScrollAnimationOptions | boolean; });
03-26
<think>嗯,用户让我介绍一下这个Scroller类,特别是它的构造函数和scrollTo方法。看起来这是ArkUI的一部分,可能和HarmonyOS或OpenHarmony相关。首先,我需要理解这个类的用途。Scroller可能用于处理滚动相关的操作,比如在UI组件中滚动到某个位置。 用户提供的代码中有constructor和scrollTo方法的文档注释。注意到constructor有三个不同的注释块,分别对应不同的版本(since 7, 10, 11),并且有syscap、crossplatform、atomicservice这些标签。这说明Scroller类可能在不同版本中有不同的能力支持,特别是跨平台和原子服务。需要解释这些标签的含义,以及不同版本间的差异。 接下来看scrollTo方法,它接受一个对象参数,包含xOffset、yOffset和animation。每个参数都有类型说明和版本标签。xOffset和yOffset可以是number或string,这可能表示它们接受数值或百分比字符串。animation参数比较复杂,可以是对象或布尔值,用来定义动画效果,比如持续时间和曲线。 我需要确保在解释时覆盖以下几点: 1. Scroller类的作用和适用场景。 2. 构造函数在不同版本中的变化,特别是跨平台支持和原子服务相关的内容。 3. scrollTo方法的参数详细说明,包括每个属性的类型、用途,以及不同版本的支持情况。 4. 提到的系统能力(syscap)、跨平台(crossplatform)和原子服务(atomicservice)标签的意义,因为这些对开发者正确使用API很重要。 可能用户是刚开始接触这个类,或者需要确认如何正确使用scrollTo方法来实现滚动效果。需要结构清晰,分步骤解释,确保每个参数和版本差异都解释到位。还要注意代码示例是否有必要,但根据用户的问题,可能不需要具体示例,但需要明确参数的使用方法。 另外,注意用户提供的文档中存在重复的注释块,可能是因为不同版本有不同的修饰符,需要指出这些版本变化,比如从since 7到since 11的演变,以及跨平台支持的引入。同时,animation参数在since 12时类型名称从匿名对象变成了ScrollAnimationOptions,这可能是一个类型别名,需要说明。 最后,确保使用中文,避免术语错误,比如正确翻译“constructor”为“构造函数”,“parameters”为“参数”等。同时,按照系统级指令的要求,数学公式使用$...$,但在这个问题中可能不涉及数学表达式,所以主要关注代码块和文档注释的解析。</think>我将分步骤解析您提供的 `Scroller` 类声明: ### 一、类基本信息 $$Scroller$$ 是用于控制滚动行为的类,属于 ArkUI 框架的核心能力,通过 `SystemCapability.ArkUI.ArkUI.Full` 系统能力提供支持 ### 二、构造函数解析 ```typescript constructor() ``` 特性说明: 1. 版本演进: - 初始版本:**API 7** 开始支持 - 跨平台支持:**API 10** 新增 `@crossplatform` 标签 - 原子服务支持:**API 11** 新增 `@atomicservice` 标签 2. 能力要求: 需要系统具备 `SystemCapability.ArkUI.ArkUI.Full` 能力 ### 三、核心方法 scrollTo ```typescript scrollTo(value: { xOffset: number | string; yOffset: number | string; animation?: ScrollAnimationOptions | boolean; }) ``` #### 参数详解: 1. **xOffset** - 类型:`number | string` - 说明:X 轴滚动偏移量 - 支持版本: - 基础支持:API 10 - 原子服务支持:API 11 2. **yOffset** - 类型:`number | string` - 说明:Y 轴滚动偏移量 - 支持版本同 xOffset 3. **animation**(核心动画控制) - 类型:`ScrollAnimationOptions | boolean` - 功能说明: - **对象类型**:自定义动画参数 ```typescript { duration?: number; // 动画时长(单位:ms) curve?: Curve | ICurve // 动画曲线类型 } ``` - **布尔类型**: - `true`:启用默认弹簧动画 - `false`:无动画效果 - 版本演进: - API 10:支持对象/布尔类型 - API 11:增加原子服务支持 - API 12:类型重命名为 `ScrollAnimationOptions` ### 四、版本兼容策略 1. 跨平台开发时: - 使用 `@crossplatform` 标注的 API(API 10+) - 注意参数类型变化(如 API 12 的类型重命名) 2. 原子服务开发- 需使用 `@atomicservice` 标注的 API(API 11+) - 需要对应版本的 SDK 支持 ### 五、典型使用场景 ```typescript // 创建滚动控制器 const scroller = new Scroller(); // 滚动到指定位置(带自定义动画) scroller.scrollTo({ xOffset: "100%", // 支持百分比字符串 yOffset: 200, animation: { duration: 500, curve: Curve.EaseInOut } }); // 快速滚动(使用默认动画) scroller.scrollTo({ xOffset: 0, yOffset: 0, animation: true }); ``` 需要特别注意不同 API 版本之间的参数类型兼容性,特别是在跨平台开发时建议使用最新稳定版 API。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值