当前位置:   article > 正文

案例:自定义下拉刷新动画(ArkTS)_arkts 下拉刷新

arkts 下拉刷新

介绍

本篇Codelab主要介绍组件动画animation属性设置。当组件的某些通用属性变化时,可以通过属性动画实现渐变效果,提升用户体验。

本Codelab使用的display接口处于mock阶段,在预览器上使用会显示白屏现象,可选择在真机或模拟器上运行。

相关概念

  • 属性动画:组件的某些通用属性变化时,可以通过属性动画实现渐变效果,提升用户体验。支持的属性包括width、height、backgroundColor、opacity、scale、rotate、translate等。案例中自定义头部组件的属性动画设置主要涉及duration(动画时长)、tempo(动画速率)、delay(动画延时)、curve(动画曲线)、palyMode(动画模式)和iterations(动画播放次数)。

完整示例

gitee源码地址

源码下载

自定义下拉刷新动画(ArkTS).zip

环境搭建

我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。

软件要求

硬件要求

  • 设备类型:华为手机或运行在DevEco Studio上的华为手机设备模拟器。
  • HarmonyOS系统:3.1.0 Developer Release。

环境搭建

  1. 安装DevEco Studio,详情请参考下载和安装软件
  2. 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境: 
    • 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
    • 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境
  3. 开发者可以参考以下链接,完成设备调试的相关配置: 

代码结构解读

本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在源码下载或gitee中提供。

  1. ├──entry/src/main/ets // 代码区
  2. │ ├──common
  3. │ │ ├──constants
  4. │ │ │ ├──CommonConstants.ets // 公共常量类
  5. │ │ │ └──RefreshConstants.ets // 下拉刷新常量类
  6. │ │ └──utils
  7. │ │ ├──DimensionUtil.ets // 屏幕适配工具类
  8. │ │ └──GlobalContext.ets // 全局上下文工具类
  9. │ ├──entryability
  10. │ │ └──EntryAbility.ets // 程序入口类
  11. │ ├──pages
  12. │ │ ├──FileManagerIndex.ets // 文件管理Tab页
  13. │ │ └──TabIndex.ets // Tab管理页
  14. │ ├──view
  15. │ │ ├──RefreshAnimHeader.ets // 动画刷新组件
  16. │ │ ├──RefreshComponent.ets // 下拉刷新组件
  17. │ │ └──RefreshDefaultHeader.ets // 默认刷新组件
  18. │ └──viewmodel
  19. │ ├──AnimationModel.ets // 动画封装类
  20. │ └──CardModel.ets // 页签封装类
  21. └──entry/src/main/resources // 资源文件目录

自定义下拉组件

自定义下拉刷新通过自定义List组件RefreshComponent实现。在List容器中添加自定义刷新头部组件和其它的需要刷新部件,RefreshComponent提供了头部样式设置,刷新部件样式设置和刷新回调方法设置。

  1. // FileManagerIndex.ets
  2. RefreshComponent({
  3. headerStyle: RefreshHeaderStyle.CLOUD, // 头部样式设置
  4. itemLayout: (): void => this.ContentBody(), // 刷新部件样式
  5. displayHeight: (
  6. px2vp(this.deviceDisplay.height) - DimensionUtil.getVp($r('app.float.file_index_title_height'))),
  7. onRefresh: () => { // 刷新回调方法
  8. ...
  9. }
  10. })
  • 头部样式设置。本Codelab提供了DEFAULT默认刷新样式和CLOUD云朵动画刷新样式设置,在RefreshComponent组件初始化时,判断当前刷新样式进行渲染。
  1. // RefreshComponent.ets
  2. if (this.headerStyle === RefreshHeaderStyle.DEFAULT) {
  3. RefreshDefaultHeader().height(RefreshConstants.REFRESH_HEADER_HEIGHT)
  4. } else if (this.headerStyle === RefreshHeaderStyle.CLOUD) {
  5. RefreshAnimHeader().height(RefreshConstants.REFRESH_HEADER_HEIGHT)
  6. }
  • 刷新部件样式。刷新部件样式itemLayout为嵌入RefreshComponent组件中的元素,通过@BuilderParam装饰符定义,可根据具体业务需求,当前为默认的Image组件样式。
  1. // FileManagerIndex.ets
  2. @Builder
  3. ContentBody() {
  4. Image($r('app.media.bg_content'))
  5. .width(CommonConstants.FULL_LENGTH)
  6. .height(DimensionUtil.getVp($r('app.float.content_height')))
  7. .objectFit(ImageFit.Fill)
  8. }
  • 刷新回调方法设置。在手指拖拽刷新头部滑出的过程中计算滑出的距离是否超出可刷新距离,松开手指时如果超出可刷新距离则调用“onRefresh”方法。
  1. // RefreshComponent.ets
  2. // 设置RefreshComponent刷新组件state状态的更新。
  3. @Consume(RefreshConstants.REFRESH_STATE_TAG) @Watch('onStateChanged') state: number;
  4. private onStateChanged() {
  5. switch (this.state) {
  6. case RefreshState.REFRESHING:
  7. if (this.onRefresh !== undefined) {
  8. this.onRefresh();
  9. }
  10. break;
  11. ...
  12. }
  13. }
  14. // 监听RefreshComponent中List组件的触摸事件。
  15. List({ scroller: this.listController }) {
  16. ListItem() {
  17. Column() {
  18. ...
  19. }
  20. ...
  21. }
  22. }
  23. ...
  24. .onTouch((event?: TouchEvent) => {
  25. if (!event) {
  26. return;
  27. }
  28. switch (event.type) {
  29. case TouchType.Down:
  30. if (this.state === RefreshState.IDLE) {
  31. this.state = RefreshState.DRAGGING;
  32. }
  33. break;
  34. case TouchType.Move:
  35. if (this.state === RefreshState.DRAGGING
  36. && this.listController.currentOffset().yOffset <= -RefreshConstants.REFRESH_EFFECTIVE_HEIGHT) {
  37. this.state = RefreshState.DRAGGING_REFRESHABLE;
  38. }
  39. break;
  40. case TouchType.Up:
  41. if (this.state === RefreshState.DRAGGING_REFRESHABLE) {
  42. this.headerOffset = 0;
  43. this.state = RefreshState.REFRESHING;
  44. }
  45. break;
  46. default:
  47. break;
  48. }
  49. // FileManagerIndex.ets
  50. //onRefresh事件没有做相关刷新,只做了模拟延时操作,开发者可以自行加入真实网络加载动作。
  51. onRefresh: () => {
  52. setTimeout(() => {
  53. this.state = RefreshState.COMPLETE;
  54. }, CommonConstants.REFRESH_DEFAULT_TIMEOUT);
  55. }

自定义刷新动画

本Codelab中自定义刷新是由5个图片的组合动画效果。

  • 每个Image通过iconItem参数分别设置各自的x轴偏移量和延时播放的属性动画效果。
  1. // RefreshAnimHeader.ets
  2. @Builder AttrAnimIcons(iconItem: ClassifyModel) {
  3. Image(iconItem.imgRes)
  4. .width(px2vp(DimensionUtil.adaptDimension(this.iconWidth)))
  5. .position({ x: iconItem.posX })
  6. .objectFit(ImageFit.Contain)
  7. .animation({
  8. duration: CommonConstants.REFRESH_HEADER_ITEM_ANIM_DURATION,
  9. tempo: CommonConstants.REFRESH_HEADER_ITEM_ANIM_TEMPO,
  10. delay: iconItem.delay,
  11. curve: Curve.Linear,
  12. playMode: PlayMode.Alternate,
  13. iterations: CommonConstants.REFRESH_HEADER_ITEM_ANIM_ITERATIONS
  14. })
  15. }
  • 监听RefreshComponent刷新组件state状态的变化,当前状态为REFRESHING状态时,改变@State修饰的图片宽度变量iconWidth来启动动画。
  1. // RefreshAnimHeader.ets
  2. @Consume(RefreshConstants.REFRESH_STATE_TAG) @Watch('onStateCheck') state: number;
  3. private onStateCheck() {
  4. if (this.state === RefreshState.REFRESHING) {
  5. this.iconWidth = CommonConstants.REFRESH_HEADER_ITEM_SCALE_WIDTH;
  6. } else {
  7. this.iconWidth = CommonConstants.REFRESH_HEADER_ITEM_DEFAULT_WIDTH;
  8. }
  9. }

总结

您已经完成了本次Codelab的学习,并了解到以下知识点:

  1. 使用属性动画实现自定义下拉组件。
  2. 使用属性动画实现自定义刷新组件。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/219047
推荐阅读
相关标签
  

闽ICP备14008679号