当前位置:   article > 正文

基础ArkTS组件:帧动画,内置动画组件,跑马灯组件(HarmonyOS学习第三课【3.6】)

基础ArkTS组件:帧动画,内置动画组件,跑马灯组件(HarmonyOS学习第三课【3.6】)

帧动画

帧动画也叫序列帧动画,其原理就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。ArkUI开发框架提供了 ImageAnimator 组件实现帧动画能力,本节笔者介绍一下 ImageAnimator 组件的简单使用。

官方文献

说明

该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

子组件

接口

ImageAnimator()

属性

除支持通用属性外,还支持以下属性:

参数名称

参数类型

参数描述

images

Array<ImageFrameInfo>

设置图片帧信息集合。每一帧的帧信息(ImageFrameInfo)包含图片路径、图片大小、图片位置和图片播放时长信息,详见ImageFrameInfo属性说明。

默认值:[]

说明:

不支持动态更新。

state

AnimationStatus

默认为初始状态,用于控制播放状态。

默认值:AnimationStatus.Initial

duration

number

单位为毫秒,默认时长为1000ms;duration为0时,不播放图片;值的改变只会在下一次循环开始时生效;当images中任意一帧图片设置了单独的duration后,该属性设置无效。

默认值:1000

reverse

boolean

设置播放顺序。false表示从第1张图片播放到最后1张图片; true表示从最后1张图片播放到第1张图片。

默认值:false

fixedSize

boolean

设置图片大小是否固定为组件大小。 true表示图片大小与组件大小一致,此时设置图片的width 、height 、top 和left属性是无效的。false表示每一张图片的width 、height 、top和left属性都要单独设置。

默认值:true

preDecode(deprecated)

number

预解码的图片数量。例如该值设为2,则播放当前页时会提前加载后面两张图片至缓存以提升性能。

从API version9开始废弃。

默认值:0

fillMode

FillMode

设置动画开始前和结束后的状态,可选值参见FillMode说明。

默认值:FillMode.Forwards

iterations

number

默认播放一次,设置为-1时表示无限次播放。

默认值:1

ImageFrameInfo对象说明

参数名称

参数类型

必填

参数描述

src

string | Resource9+

图片路径,图片格式为svg,png和jpg,从API Version9开始支持Resource类型的路径。

width

number | string

图片宽度。

默认值:0

height

number | string

图片高度。

默认值:0

top

number | string

图片相对于组件左上角的纵向坐标。

默认值:0

left

number | string

图片相对于组件左上角的横向坐标。

默认值:0

duration

number

每一帧图片的播放时长,单位毫秒。

默认值:0

事件

除支持通用事件外,还支持以下事件:

名称

功能描述

onStart(event: () => void)

状态回调,动画开始播放时触发。

onPause(event: () => void)

状态回调,动画暂停播放时触发。

onRepeat(event: () => void)

状态回调,动画重复播放时触发。

onCancel(event: () => void)

状态回调,动画取消播放时触发。

onFinish(event: () => void)

状态回调,动画播放完成时触发。

拓展部分

ImageAnimator定义介绍

  1. interface ImageAnimatorInterface {
  2. (): ImageAnimatorAttribute;
  3. }

由源码可知,ImageAnimator 组件不需要设置额外的配置参数。

ImageAnimator属性介绍

  1. declare class ImageAnimatorAttribute extends CommonMethod<ImageAnimatorAttribute> {
  2. images(
  3. value: Array<{
  4. src: string;
  5. width?: number | string;
  6. height?: number | string;
  7. top?: number | string;
  8. left?: number | string;
  9. duration?: number;
  10. }>,
  11. ): ImageAnimatorAttribute;
  12. state(value: AnimationStatus): ImageAnimatorAttribute;
  13. duration(value: number): ImageAnimatorAttribute;
  14. reverse(value: boolean): ImageAnimatorAttribute;
  15. fixedSize(value: boolean): ImageAnimatorAttribute;
  16. preDecode(value: number): ImageAnimatorAttribute;
  17. fillMode(value: FillMode): ImageAnimatorAttribute;
  18. iterations(value: number): ImageAnimatorAttribute;
  19. }
  • images:设置图片帧信息集合。每一帧的帧信息包含图片路径、图片大小、图片位置和图片播放时长信息。详细说明如下:
    • src:图片路径,图片格式为 svg ,png , jpg 和 webp 。
    • width:图片宽度。
    • height:图片高度。
    • top:图片相对于组件左上角的纵向坐标。
    • left:图片相对于组件左上角的横向坐标。
    • duration:每一帧图片的播放时长,单位毫秒。
  • state:设置播放状态, AnimationStatus 定义了以下 4 中状态:
    • Initial(默认值):动画初始状态。
    • Running:动画处于播放状态。
    • Paused:动画处于暂停状态。
    • Stopped:动画处于停止状态。
  • fixedSize:设置图片大小是否固定为组件大小。 true 表示图片大小与组件大小一致,此时设置图片的 width 、 height 、 top 和 left 属性是无效的。 false 表示每一张图片的 width 、 height 、 top 和 left 属性都要单独设置。
  • preDecode:是否启用预解码,默认值为 0 ,即不启用预解码,如该值设为 2 ,则播放当前页时会提前加载后面两张图片至缓存以提升性能。
  • fillMode:设置动画开始前和结束后的状态, FillMode 参数类型说明如下:
    • None:播放完成后恢复初始状态。
    • Forwards:播放完成后保持动画结束时的状态。
  • iterations:设置播放次数,设置为 -1 时表示无限次播放。

简单样例如下所示:

  1. @Entry
  2. @Component
  3. struct ImageAnimatorTest {
  4. build() {
  5. Column({ space: 10 }) {
  6. ImageAnimator()
  7. .images([ // 序列帧资源数组
  8. {
  9. src: "/pages/loading_01.png", // 图片帧资源
  10. duration: 150 // 播放时长
  11. },
  12. {
  13. src: "/pages/loading_02.png", // 图片帧资源
  14. duration: 150 // 播放时长
  15. },
  16. {
  17. src: "/pages/loading_03.png", // 图片帧资源
  18. duration: 150 // 播放时长
  19. },
  20. {
  21. src: "/pages/loading_04.png", // 图片帧资源
  22. duration: 150 // 播放时长
  23. },
  24. {
  25. src: "/pages/loading_05.png", // 图片帧资源
  26. duration: 150 // 播放时长
  27. },
  28. {
  29. src: "/pages/loading_06.png", // 图片帧资源
  30. duration: 150 // 播放时长
  31. },
  32. {
  33. src: "/pages/loading_07.png", // 图片帧资源
  34. duration: 150 // 播放时长
  35. },
  36. {
  37. src: "/pages/loading_08.png", // 图片帧资源
  38. duration: 150 // 播放时长
  39. },
  40. {
  41. src: "/pages/loading_09.png", // 图片帧资源
  42. duration: 150 // 播放时长
  43. },
  44. {
  45. src: "/pages/loading_10.png", // 图片帧资源
  46. duration: 150 // 播放时长
  47. },
  48. {
  49. src: "/pages/loading_11.png", // 图片帧资源
  50. duration: 150 // 播放时长
  51. },
  52. {
  53. src: "/pages/loading_12.png", // 图片帧资源
  54. duration: 150 // 播放时长
  55. }
  56. ])
  57. .state(AnimationStatus.Running) // 设置正在播放状态
  58. .iterations(-1) // 设置无限循环播放
  59. .preDecode(2) // 预加载2张图片
  60. .width(60)
  61. .height(60)
  62. }
  63. .width('100%')
  64. .height("100%")
  65. .padding(10)
  66. }
  67. }

每一帧图片自行配置即可逐帧播放

官方案例:

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct ImageAnimatorExample {
  5. @State state: AnimationStatus = AnimationStatus.Initial
  6. @State reverse: boolean = false
  7. @State iterations: number = 1
  8. build() {
  9. Column({ space: 10 }) {
  10. ImageAnimator()
  11. .images([
  12. {
  13. src: $r('app.media.img1')
  14. },
  15. {
  16. src: $r('app.media.img2')
  17. },
  18. {
  19. src: $r('app.media.img3')
  20. },
  21. {
  22. src: $r('app.media.img4')
  23. }
  24. ])
  25. .duration(2000)
  26. .state(this.state).reverse(this.reverse)
  27. .fillMode(FillMode.None).iterations(this.iterations).width(340).height(240)
  28. .margin({ top: 100 })
  29. .onStart(() => {
  30. console.info('Start')
  31. })
  32. .onPause(() => {
  33. console.info('Pause')
  34. })
  35. .onRepeat(() => {
  36. console.info('Repeat')
  37. })
  38. .onCancel(() => {
  39. console.info('Cancel')
  40. })
  41. .onFinish(() => {
  42. console.info('Finish')
  43. this.state = AnimationStatus.Stopped
  44. })
  45. Row() {
  46. Button('start').width(100).padding(5).onClick(() => {
  47. this.state = AnimationStatus.Running
  48. }).margin(5)
  49. Button('pause').width(100).padding(5).onClick(() => {
  50. this.state = AnimationStatus.Paused // 显示当前帧图片
  51. }).margin(5)
  52. Button('stop').width(100).padding(5).onClick(() => {
  53. this.state = AnimationStatus.Stopped // 显示动画的起始帧图片
  54. }).margin(5)
  55. }
  56. Row() {
  57. Button('reverse').width(100).padding(5).onClick(() => {
  58. this.reverse = !this.reverse
  59. }).margin(5)
  60. Button('once').width(100).padding(5).onClick(() => {
  61. this.iterations = 1
  62. }).margin(5)
  63. Button('infinite').width(100).padding(5).onClick(() => {
  64. this.iterations = -1 // 无限循环播放
  65. }).margin(5)
  66. }
  67. }.width('100%').height('100%')
  68. }
  69. }

 内置动画组件

LoadingProgress 

用于显示加载动效的组件。 

说明

该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

子组件

接口

LoadingProgress()

创建加载进展组件。

从API version 9开始,该接口支持在ArkTS卡片中使用。

属性

名称

参数类型

描述

color

ResourceColor

设置加载进度条前景色。

从API version 9开始,该接口支持在ArkTS卡片中使用。

 官方案例:

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct LoadingProgressExample {
  5. build() {
  6. Column({ space: 5 }) {
  7. Text('Orbital LoadingProgress ').fontSize(9).fontColor(0xCCCCCC).width('90%')
  8. LoadingProgress()
  9. .color(Color.Blue)
  10. }.width('100%').margin({ top: 5 })
  11. }
  12. }

跑马灯组件

跑马灯组件,用于滚动展示一段单行文本,仅当文本内容宽度超过跑马灯组件宽度时滚动。

使用跑马灯组件我们可以按照自己想要的样式来设定跑马灯

Marquee

说明

该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

子组件

接口

Marquee(value: { start: boolean, step?: number, loop?: number, fromStart?: boolean, src: string })

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名

参数类型

必填

参数描述

start

boolean

控制跑马灯是否进入播放状态。

说明:

有限的滚动次数播放完毕后,不可以通过改变start重置滚动次数重新开始播放。

step

number

滚动动画文本滚动步长。

默认值:6,单位vp

loop

number

设置重复滚动的次数,小于等于零时无限循环。

默认值:-1

说明:

ArkTS卡片上该参数设置任意值都仅在可见时滚动一次。

fromStart

boolean

设置文本从头开始滚动或反向滚动。

默认值:true

src

string

需要滚动的文本。

属性

除支持文本通用属性:fontColor、fontSize、fontWeight、fontFamily外,还支持以下属性:

名称

参数类型

描述

allowScale

boolean

是否允许文本缩放。

暂不支持该接口。

默认值:false

事件

名称

功能描述

onStart(event: () => void)

开始滚动时触发回调。

从API version 9开始,该接口支持在ArkTS卡片中使用。

onBounce(event: () => void)

完成一次滚动时触发,若循环次数不为1,则该事件会多次触发。

从API version 9开始,该接口支持在ArkTS卡片中使用。

onFinish(event: () => void)

滚动全部循环次数完成时触发回调。

从API version 9开始,该接口支持在ArkTS卡片中使用。

官方案例:

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct MarqueeExample {
  5. @State start: boolean = false
  6. private fromStart: boolean = true
  7. private step: number = 50
  8. private loop: number = Infinity
  9. private src: string = "Running Marquee starts rolling"
  10. build() {
  11. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  12. Marquee({
  13. start: this.start,
  14. step: this.step,
  15. loop: this.loop,
  16. fromStart: this.fromStart,
  17. src: this.src
  18. })
  19. .width(360)
  20. .height(80)
  21. .fontColor('#FFFFFF')
  22. .fontSize(48)
  23. .fontWeight(700)
  24. .backgroundColor('#182431')
  25. .margin({ bottom: 40 })
  26. .onStart(() => {
  27. console.info('Marquee animation complete onStart')
  28. })
  29. .onBounce(() => {
  30. console.info('Marquee animation complete onBounce')
  31. })
  32. .onFinish(() => {
  33. console.info('Marquee animation complete onFinish')
  34. })
  35. Button('Start')
  36. .onClick(() => {
  37. if(this.start==false){
  38. this.start = true //播放
  39. }else{
  40. this.start = false; //暂停
  41. }
  42. })
  43. .width(120)
  44. .height(40)
  45. .fontSize(16)
  46. .fontWeight(500)
  47. .backgroundColor('#007DFF')
  48. }
  49. .width('100%')
  50. .height('100%')
  51. }
  52. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/568799
推荐阅读
相关标签
  

闽ICP备14008679号