首页 > 其他分享 >HarmonyOS-基础之动画

HarmonyOS-基础之动画

时间:2024-04-16 23:22:05浏览次数:24  
标签:动画 width 100% opacityNum 基础 HarmonyOS 转场 页面

1、是什么?

动画可以在UI界面发生变化时,提供渐变过渡效果,提升用户体验。
动画的实现原理是通过在一段时间内连续播放一系列静止画面(帧),从而产生流畅的视觉效果。

ArkUI 提供了多种动画接口,例如:显式动画、属性动画、转场动画等,来实现各种动画效果。

2、显示动画

  • animateTo()是ArkUI 提供的一个全局的动画函数,调用此函数实现的动画称为显式动画
animateTo(value: AnimateParam, event: () => void): void
  • 该函数共有两个参数,分别是
    • 动画参数,用于设置动画时长、属性值变化曲线等等。
    • 匿名函数,用于设置属性值的终点值,在该函数中设置的属性值,系统均会按照前边设置的动画参数,驱动属性值从其初始值平滑的过渡到终点值,从而实现动画效果。
显示动画案例
@Entry
@Component
struct Index {
  @State marginLeft: number | string = '0'
  @State opacityNum: number = 1
  @State scaleX: number = 1
  @State scaleY: number = 1
  @State rotateNum: number = 0
  @State opacityNum2: number = 1

  build() {
    Column() {
      Text('这是一段文本,用来测试动画')
        .fontSize(30)
        .fontWeight(700)
        .width('100%')
        .textAlign(TextAlign.Center)
        .margin({ left: this.marginLeft })
          // 透明度
        .opacity(this.opacityNum)

      Text('显示动画2')
        .fontSize(30)
        .fontWeight(700)
        .width('100%')
        .textAlign(TextAlign.Center)
          // 缩放
        .scale({ x: this.scaleX, y: this.scaleY })
          // 旋转
        .rotate({ angle: this.rotateNum })
        .opacity(this.opacityNum2)

      Button('显示动画').onClick(() => {
        /**
         * animateTo:内部全局组件
         *  - duration : 动画时间
         *  - curve : 动画速度
         */
        animateTo({ duration: 1000, curve: Curve.Linear }, () => {
          // 显示动画一
          if (this.marginLeft == 0) {
            this.marginLeft = '-100%'
            this.opacityNum = 0
          } else {
            this.marginLeft = 0
            this.opacityNum = 1
          }

          // 显示动画二
          if (this.rotateNum == 0) {
            this.scaleX = 0
            this.scaleY = 0
            this.rotateNum = 360
            this.opacityNum2 = 0
          } else {
            this.scaleX = 1
            this.scaleY = 1
            this.rotateNum = 0
            this.opacityNum2 = 1
          }
        })
      })
    }.width('100%')
  }
}

image

3、属性动画

animation()是ArkUI提供的组件的属性方法,调用此函数实现的动画称为属性动画
注意 :animation()属性方法必须放在动态动画属性之后

@Entry
@Component
struct Index {
  @State marginLeft: number | string = 0
  @State opacityNum: number = 1

  build() {
    Column() {

      Text('属性动画1')
        // .animation({ duration: 1000, curve: Curve.EaseOut }) // 错误写法
        .fontSize(30)
        .fontWeight(700)
        .width('100%')
        .textAlign(TextAlign.Center)
        .margin({ left: this.marginLeft })
        .opacity(this.opacityNum)
        .animation({ duration: 1000, curve: Curve.EaseOut })

      Button('属性动画').onClick(() => {
        if (this.opacityNum == 1) {
          this.marginLeft = '-100%'
          this.opacityNum = 0
        }else{
          this.opacityNum = 1
          this.marginLeft = 0
        }
      })

    }.width('100%')
  }
}

image

4、页面内的转场动画

转场动画是指组件出现或消失时的过渡动画。ArkUI 专门提供了transition接口来配置转场动画效果,可以定义平移、透明度、旋转、缩放这几种转场样式的单个或者组合的转场效果。

transition(value: TransitionOptions)

注意 :transition 必须配合着 animateTo 一起使用才有效

@Entry
@Component
struct Index {
  @State isActive: boolean = true

  build() {
    Column() {
      if (this.isActive) {
        Text('转场动画')
          .textAlign(TextAlign.Center)
          .width('100%')
          .fontSize(30)
          .fontWeight(700)
            // 设置离开动画
          .transition({ type: TransitionType.Delete, opacity: 0, translate: { x: '-100%' } })
            // 设置进入动画
          .transition({ type: TransitionType.Insert, opacity: 0, translate: { x: '-100%' } })
      }
      
      // 注意 :transition 必须配合着 animateTo 一起使用才有效

      Button('转场动画').onClick((event: ClickEvent) => {
        animateTo({ duration: 1000, curve: Curve.Linear }, () => {
          this.isActive = !this.isActive
        })
      })
    }.width('100%')
    .padding(20)
  }
}

image

5、页面间的转场动画

  • 除了页面内的动画,我们还可以实现页面间转场动画
  • 在push跳转路由及返回上一个路由页面时,默认就有转场动画
  • HarmonyOS也提供了自定义的页面间的转场动画语法
页面A
import router from '@ohos.router'

@Entry
@Component
struct Index {
  pageTransition() {
    // A页面离开动画
    PageTransitionExit({
      type: RouteType.Push,
      duration: 2000,
      curve: Curve.FastOutLinearIn
    }).slide(SlideEffect.Top)

    // A页面进入动画
    PageTransitionEnter({
      type: RouteType.Pop,
      duration: 1000,
      curve: Curve.EaseIn
    }).slide(SlideEffect.Left)
  }

  build() {
    Column() {
      Text('这是页面 =====A=====')
        .fontSize(30)
        .fontWeight(700)
        .width('100%')

      Button('去页面B').onClick((event: ClickEvent) => {
        router.pushUrl({ url: 'pages/demo04/animation/AnimationPage02', params: { id: 1 } })
      })
    }.width('100%')
    .padding(10)
  }
}
页面B
import router from '@ohos.router'

@Entry
@Component
struct Index {
  // 页面转场动画方法组件
  pageTransition() {
    // B页面离开动画
    PageTransitionExit({
      type: RouteType.None,
      duration: 1500,
      curve: Curve.EaseOut
    }).slide(SlideEffect.Right)

    // B页面进入动画
    PageTransitionEnter({
      type: RouteType.Pop,
      duration: 2500,
      curve: Curve.ExtremeDeceleration
    }).slide(SlideEffect.Bottom)
  }

  build() {
    Column() {
      Text('这是页面 *******B*******')
        .fontSize(30)
        .fontWeight(700)
      Button('返回页面A').onClick((event: ClickEvent) => {
        console.log('获取A页面传递的路由参数:' + JSON.stringify(router.getParams()))
        router.back()
      })
    }.width('100%')
    .padding(10)
  }
}

image

标签:动画,width,100%,opacityNum,基础,HarmonyOS,转场,页面
From: https://www.cnblogs.com/ybbit/p/18139399

相关文章

  • 2024.4.16python基础学习
    基本数据类型numberintmoney=6600floatdiscount=1.2boolenisok=trueisok=falsestrings='sssss's="ssssss"ps:单引号与双引号成对出现,不可以混合使用可以单引号嵌套双引号,互相嵌套list(列表)my_list=['足球','篮球']tuple(元组)my_tuple=(12,123,1234)dict(字典)......
  • 读《我和Labview》Labview编程基础3
    3字符串和路径数据3.1字符串数据类型3.2字符串控件3.3数值、时间与字符串之间的的转换3.3.1基础转换函数3.3.2字符串格式化3.3.3时间与字符串之间的转换3.4正则表达式3.5路径3.5.1路径数据3.5.2相对路径3.5.3路径常量3.5.4路径与其他数据类型的转换3.6数据平化3.6.1......
  • C++ 递归与面向对象编程基础
    C++递归递归是一种使函数调用自身的技术。这种技术提供了一种将复杂问题分解为简单问题的方法,从而更容易解决问题。递归可能有点难以理解。理解其工作原理的最佳方法是通过实验来尝试。递归示例将两个数字相加很容易做到,但将一系列数字相加就更复杂了。在下面的示例中,通过将......
  • HarmonyOS开发(一)
    1、安装 DevEcoStudio链接:https://developer.huawei.com/consumer/cn/deveco-studio/2、安装配置环境 为保证DevEcoStudio正常运行,建议电脑配置满足如下要求:操作系统:Windows1064位、Windows1164位内存:8GB及以上硬盘:100GB及以上分辨率:1280*800像素及以上4、配置......
  • java基础模块一
    1java基础(来自B站尚硅谷)1.1字符编码问题1,编码:保存数据的过程2.解码:读数据的过程3.注意:a.编码解码遵守的编码规范必须一致b.常见的两个编码规范: GBK:专门为仲文设计的编码ANSI代表的是GBK一个中文汉字在GBK中占2个字节 UTF-8:一个中文......
  • 洛谷题单指南-数学基础问题-P1403 [AHOI2005] 约数研究
    原题链接:https://www.luogu.com.cn/problem/P1403题意解读:计算1~n每个数的约数个数之和。解题思路:1、数学方法1~n的约数范围也在1~n,要计算每个数的约数个数之和可以从约数出发,比如约数是x,那么在1~n中一共有n/x个数包含x这个约数x从1一直枚举到n,就可以得出每个约数是多少个......
  • 洛谷题单指南-数学基础问题-P3601 签到题
    原题链接:https://www.luogu.com.cn/problem/P3601题意解读:求l~r范围内所有qiandao(x)之和,qiandao(x)为小于等于x的数中,与x不互质的数的个数。注意取模。解题思路:欧拉函数定义:phi(x)=x*(1-1/p1)*(1-1/p2)*...*(1-1/pn),p1,p2...pn为x的所有质因子其中:phi(x)表示1~x中所......
  • Scrapy的基础使用(1)
    Scrapy什么是scrapy​ Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。创建爬虫项目​ scrapy是一个爬虫框架,创建项目与日常新建文件编写代码不同,他需要通过终端创建,在终端中输入下面语句创建......
  • WPF基础:在Canvas上绘制图形
    Canvas介绍Canvas是WPF(WindowsPresentationFoundation)中的一种面板控件,用于在XAML中布置子元素。它提供了绝对定位的能力,允许元素在自由的二维空间中放置。Canvas上的子元素可以通过指定绝对位置(Left和Top属性)来放置,也可以使用附加属性来指定相对于Canvas的位置。Canvas对于需......
  • Java架构核心基础知识硬核整理,赶快收藏起来吧
    Java架构核心基础知识硬核整理,赶快收藏起来吧Java架构核心基础lecture:波哥一、数据结构和算法1.数据结构  数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者......