HarmonyOS应用开发入门(四)

一、动画

属性值的变化,通常会引起UI的变化。动画可在UI发生改变时,添加流畅的过渡效果。如果不加入动画,属性将在一瞬间完成变化。造成突兀感的同时,容易导致用户失去视觉焦点。

1、属性动画

通过设置组件animation属性来给组件添加动画,当组件的width、height、Opacity、backgroundColor、scale、rotate、translate等属性变更时,可以实现渐变过渡效果。

接口:

animation(value: {
        duration?: number,        //  设置动画时长。单位为毫秒,默认动画时长为1000毫秒。
        tempo?: number,        // 动画播放速度。数值越大,播放速度越快,值为0时,表示不存在动画。默认值:1
        curve?: string | Curve | ICurve,        // 设置动画曲线。默认曲线为线性。默认值:Curve.Linear
        delay?:number,        // 设置动画延迟执行的时长。单位为毫秒。默认值:0
        iterations: number,        // 设置播放次数。默认播放一次,设置为-1时表示无限次播放。
        playMode?: PlayMode,        // 设置动画播放模式,默认播放完成后重头开始播放。默认值:PlayMode.Normal
        onFinish?: () => void        // 状态回调,动画播放完成时触发。

})

练习: 

@Entry
@Component
struct Animation{
  // 小鱼坐标
  @State X: number = 200
  @State Y: number = 180
  // 角度
  @State angle: number = 0
  // 图片
  @State src: Resource = $r('app.media.smallfish')

  build(){
    Row(){
      Stack(){
        Image($r('app.media.fish'))

        Image(this.src)
            .position({ x: this.X-20, y: this.Y-20})
            .rotate({ angle: this.angle, centerX: '50%', centerY: '50%'})
            .width(40).height(40)
            .animation({ duration: 500 })

          // 操作按钮
          Row(){
            Button('←').backgroundColor('#20101010')
            .onClick(() => {
              this.X -= 20
              this.src = $r('app.media.smallfish')
            })
            Column({ space:40 }){
              Button('↑').backgroundColor('#20101010')
                .onClick(() => {
                  this.Y -= 20
                })
              Button('↓').backgroundColor('#20101010')
                .onClick(() => {
                  this.Y += 20
                })
            }
            Button('→').backgroundColor('#20101010')
              .onClick(() => {
                this.X += 20
                this.src = $r('app.media.rsmallfish')
              })
          }.height(240)
          .width(240)
      }
    }
  }
}

2、显示动画

通过提供全局animateTo显示动画接口,当闭包代码导致状态变化时,插入过渡动画。 

animateTo(value: AnimateParam, event: () => void): void

value指定动画参数(包括时长、曲线等),event为动画的闭包函数,闭包内变量改变产生的属性动画将遵循相同的动画参数。

AnimateParam对象:

 练习:

将上面的练习用显示动画实现:

            Button('↑').backgroundColor('#20101010')
                .onClick(() => {
                  animateTo(
                    {
                      duration: 500
                    },
                    () => {
                      this.Y -= 20
                    }
                  )
                })
              Button('↓').backgroundColor('#20101010')
                .onClick(() => {
                  animateTo(
                    {
                      duration: 500
                    },
                    () => {
                      this.Y += 20
                    }
                  )
                })
            }
            Button('→').backgroundColor('#20101010')
              .onClick(() => {
                animateTo(
                  {
                    duration: 500
                  },
                  () => {
                    this.X += 20
                    this.src = $r('app.media.rsmallfish')
                  }
                )
              })

3、组件转场动画

页面入场和页面退场时自定义转场效果。通过组件的transition属性来配置。

参数名称参数类型必填参数描述
typeTransitionType类型,默认包括组件新增和删除。默认是ALL。
opacitynumber不透明度,为插入时起点和删除时终点的值,默认值:1,取值范围:[0,1]。
translate

{

x?:number|string,
y?:number|string,

z?:number|string

}

平移效果,为插入时起点和删除时终点的值。

-x:横向的平移距离;

-y:纵向的平移距离;

-z:竖向的平移距离。

scale

{

x?:number|string,
y?:number|string,

z?:number|string,

centerX?:number|string,
centerY? :number|string

}

缩放效果,为插入时起点和删除时终点的值。
-x:横向放大倍数(或缩小比例);

-y:纵向放大倍数(或缩小比例);

-z:当前为二维显示,该参数无效。
centerX、centerY指缩放中心点,centerX和centerY默认值是"50%"。

-中心点为0时,默认的是组件的左上角。

rotate

{

x?:number|string,
y?:number|string,

z?:number|string,

angle:number|string,

centerX?:number|string,
centerY? :number|string

}

旋转效果。
angle是旋转角度,其它参数与scale类似。

练习: 

为上面的练习加上入场动画:

@Entry
@Component
struct Animation{
  ...
  // 是否开始游戏
  @State isBegin: boolean = false

  build(){
    Row(){
      Stack(){
        Image($r('app.media.fish'))

        if (!this.isBegin){
          // 开始按钮
          Button('开始游戏')
            .onClick(() => {
              animateTo(
                {duration: 1000},
                () => {
                  this.isBegin = true
                }
              )
            })
        }else {
          Image(this.src)
            .position({ x: this.X - 20, y: this.Y - 20 })
            .rotate({ angle: this.angle, centerX: '50%', centerY: '50%' })
            .width(40).height(40)
            .transition({
              type: TransitionType.Insert,
              opacity: 0,
              translate: {x: -250}
            })
          }
        // 操作按钮
        Row() {
          ...
        }
        .height(240).width(240).justifyContent(FlexAlign.Center).position({x: 0, y: 450})
        }.height('100%')
        .width('100%')
      }
    }
}

二、Stage模型

随着系统的演进发展,先后提供了两种应用模型:

  • FA(Feature Ability)模型:从API 7开始支持的模型,已经不再主推。

  • Stage模型:从API 9开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。

1、概述

学习链接:Stage模型开发概述-Stage模型开发指导-Ability Kit(程序框架服务)-应用框架 | 华为开发者联盟 (huawei.com)

Stage模型有两类Ability:

  • UIAbility:负责用户界面和用户交互;
  • ExtensionAbility:负责UIAbility以为的事情;

HarmonyOS应用发布形态为APP,它由一个或多个HAP包及描述APP Pack属性的pack.info文件组成。HAP是Ability的部署包,它由一个或者多个Ability组成。是HormonyOS应用安装的基本单位,包括编译后的代码、资源、第三方库及配置文件,可分为Entry和Feature两种类型。

2、应用配置文件 

(1)app.json5--应用的全局配置信息,包括应用包名、生产厂商、版本号等基本信息;icon可设置应用列表中的应用图标,label可设置应用列表中的应用名。

(2)module.json5--Module的配置信息,HAP包的配置信息,包含每个Ability必须定义的基本属性(如包名、类名、类型以及Ablity提供的能力)标签下的配置只对当前HAP包生效;abilities中的icon可设置桌面的应用图标,label可设置桌面的应用名称。

3、UIAbility生命周期

学习链接:UIAbility组件-Stage模型应用组件-Stage模型开发指导-Ability Kit(程序框架服务)-应用框架 | 华为开发者联盟 (huawei.com)

UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。例如,在支付应用中,可以将入口功能和收付款功能分别配置为独立的UIAbility。每一个UIAbility组件实例都会在最近任务列表中显示一个对应的任务。

生命周期:Create---->Foreground<====>Background---->Destroy

  • Create状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate()回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI展示。
  • Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。
  • Destroy状态在UIAbility实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。

4、页面及组件生命周期

页面生命周期:

  • OnPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。

  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。

  • onBackPress:当用户点击返回按钮时触发。

组件生命周期:

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。

  • aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

5、UIAbility的启动模式 

在module.json5中的abilities配置launchType。

  • Singleton启动模式:单实例模式,也是默认情况下的启动模式。系统中只存在唯一一个该UIAbility实例,即在最近任务列表中只存在一个该类型的UIAbility实例。
  • Standard启动模式:多实例模式。每次启动UIAbility都会创建一个新实例。在任务列表中可能存在一个或多个相同的UIAbility。
  • Specified启动模式:指定实例模式,每个UIAbility实例可以设置Key标示,启动UIAbility时,需要指定Key,存在Key相同实例直接被拉起,不存在则创建新实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值