0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS開(kāi)發(fā)案例:【自定義下拉刷新動(dòng)畫(huà)】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-29 16:06 ? 次閱讀

介紹

主要介紹組件動(dòng)畫(huà)animation屬性設(shè)置。當(dāng)組件的某些通用屬性變化時(shí),可以通過(guò)屬性動(dòng)畫(huà)實(shí)現(xiàn)漸變效果,提升用戶體驗(yàn)。效果如圖所示:

說(shuō)明: 本Codelab使用的display接口處于mock階段,在預(yù)覽器上使用會(huì)顯示白屏現(xiàn)象,可選擇在真機(jī)或模擬器上運(yùn)行。

相關(guān)概念

  • [屬性動(dòng)畫(huà)]:組件的某些通用屬性變化時(shí),可以通過(guò)屬性動(dòng)畫(huà)實(shí)現(xiàn)漸變效果,提升用戶體驗(yàn)。支持的屬性包括width、height、backgroundColor、opacity、scale、rotate、translate等。案例中自定義頭部組件的屬性動(dòng)畫(huà)設(shè)置主要涉及duration(動(dòng)畫(huà)時(shí)長(zhǎng))、tempo(動(dòng)畫(huà)速率)、delay(動(dòng)畫(huà)延時(shí))、curve(動(dòng)畫(huà)曲線)、palyMode(動(dòng)畫(huà)模式)和iterations(動(dòng)畫(huà)播放次數(shù))。

環(huán)境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開(kāi)發(fā)板類型:[潤(rùn)和RK3568開(kāi)發(fā)板]。
  • OpenHarmony系統(tǒng):3.2 Release。

環(huán)境搭建

完成本篇Codelab我們首先要完成開(kāi)發(fā)環(huán)境的搭建,本示例以RK3568開(kāi)發(fā)板為例,參照以下步驟進(jìn)行:

  1. [獲取OpenHarmony系統(tǒng)版本]:標(biāo)準(zhǔn)系統(tǒng)解決方案(二進(jìn)制)。以3.2 Release版本為例:
  2. 搭建燒錄環(huán)境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開(kāi)發(fā)板的燒錄](méi)
  3. 搭建開(kāi)發(fā)環(huán)境。
    1. 開(kāi)始前請(qǐng)參考[工具準(zhǔn)備],完成DevEco Studio的安裝和開(kāi)發(fā)環(huán)境配置。
    2. 開(kāi)發(fā)環(huán)境配置完成后,請(qǐng)參考[使用工程向?qū)創(chuàng)建工程(模板選擇“Empty Ability”)。
    3. 工程創(chuàng)建完成后,選擇使用[真機(jī)進(jìn)行調(diào)測(cè)]。
    4. 鴻蒙開(kāi)發(fā)指導(dǎo)文檔:[qr23.cn/FBD4cY]

代碼結(jié)構(gòu)解讀

本篇Codelab只對(duì)核心代碼進(jìn)行講解,完整代碼可以直接從gitee獲取。

├──entry/src/main/ets                      // 代碼區(qū)           
│  ├──common
│  │  ├──constants                     
│  │  │  ├──CommonConstants.ets            // 公共常量類
│  │  │  └──RefreshConstants.ets           // 下拉刷新常量類
│  │  └──utils                 
│  │     ├──DimensionUtil.ets              // 屏幕適配工具類
│  │     └──GlobalContext.ets              // 全局上下文工具類
│  ├──entryability
│  │  └──EntryAbility.ts                   // 程序入口類
│  ├──pages
│  │  ├──FileManagerIndex.ets              // 文件管理Tab頁(yè)
│  │  └──TabIndex.ets                      // Tab管理頁(yè)
│  ├──view
│  │  ├──RefreshAnimHeader.ets             // 動(dòng)畫(huà)刷新組件
│  │  ├──RefreshComponent.ets              // 下拉刷新組件
│  │  └──RefreshDefaultHeader.ets          // 默認(rèn)刷新組件
│  └──viewmodel
│     ├──AnimationModel.ets                // 動(dòng)畫(huà)封裝模型
│     └──CardModel.ets                     // 頁(yè)簽封裝模型
└──entry/src/main/resources                // 資源文件目錄

`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789v直接拿`

搜狗高速瀏覽器截圖20240326151547.png

自定義下拉組件

自定義下拉刷新通過(guò)自定義List組件RefreshComponent實(shí)現(xiàn)。在List容器中添加自定義刷新頭部組件和其它的需要刷新部件,RefreshComponent提供了頭部樣式設(shè)置,刷新部件樣式設(shè)置和刷新回調(diào)方法設(shè)置。

// FileManagerIndex.ets
RefreshComponent({
  headerStyle: RefreshHeaderStyle.CLOUD, // 頭部樣式設(shè)置
  itemLayout: () = > this.ContentBody(), // 刷新部件樣式
  displayHeight: (
    px2vp(this.deviceDisplay.height) - DimensionUtil.getVp($r('app.float.file_index_title_height'))),
  onRefresh: () = > { // 刷新回調(diào)方法
    ......
  }
})
  • 頭部樣式設(shè)置
    本Codelab提供了DEFAULT默認(rèn)刷新樣式和CLOUD云朵動(dòng)畫(huà)刷新樣式設(shè)置,在RefreshComponent組件初始化時(shí),判斷當(dāng)前刷新樣式進(jìn)行渲染。

    // RefreshComponent.ets
    if (this.headerStyle === RefreshHeaderStyle.DEFAULT) {
      RefreshDefaultHeader().height(RefreshConstants.REFRESH_HEADER_HEIGHT)
    } else if (this.headerStyle === RefreshHeaderStyle.CLOUD) {
      RefreshAnimHeader().height(RefreshConstants.REFRESH_HEADER_HEIGHT)
    }
    
  • 刷新部件樣式
    刷新部件樣式itemLayout為嵌入RefreshComponent組件中的元素,通過(guò)@BuilderParam裝飾符定義,可根據(jù)具體業(yè)務(wù)需求,當(dāng)前為默認(rèn)的Image組件樣式。

    // FileManagerIndex.ets
    @Builder ContentBody() {
      Image($r('app.media.bg_content'))
        .width(CommonConstants.FULL_LENGTH)
        .height(DimensionUtil.getVp($r('app.float.content_height')))
        .objectFit(ImageFit.Fill)
    }
    
  • 刷新回調(diào)方法設(shè)置
    刷新回調(diào)方法是RefreshComponent提供的當(dāng)下拉一定范圍距離松手后,調(diào)用頁(yè)面刷新的方法。實(shí)現(xiàn)步驟是:
    1.設(shè)置RefreshComponent刷新組件state狀態(tài)的更新。

    // RefreshComponent.ets
    @Consume(RefreshConstants.REFRESH_STATE_TAG) @Watch('onStateChanged') state: RefreshState;
    @BuilderParam itemLayout: () = > void;
    
    private onStateChanged() {
      switch (this.state) {
        case RefreshState.REFRESHING:
          if (this.onRefresh) {
            this.onRefresh();
          }
          break;
        ......
      }
    }
    

    2.監(jiān)聽(tīng)RefreshComponent組件的觸摸事件,當(dāng)手指松開(kāi)且List組件下拉距離超出可刷新距離時(shí),修改當(dāng)前狀態(tài)為REFRESHING,回調(diào)“onStateChanged”方法觸發(fā)外部傳入的onRefresh事件。

    // RefreshComponent.ets
    case TouchType.Move:
      if (this.state === RefreshState.DRAGGING
      && this.listController.currentOffset().yOffset <= -RefreshConstants.REFRESH_EFFECTIVE_HEIGHT) {
        this.state = RefreshState.DRAGGING_REFRESHABLE;
      }
      break;
    case TouchType.Up:
      if (this.state === RefreshState.DRAGGING_REFRESHABLE) {
        this.headerOffset = 0;
        this.state = RefreshState.REFRESHING;
      }
      break;
    

    3.本Codelab中onRefresh事件沒(méi)有做相關(guān)刷新動(dòng)作,只做了模擬延時(shí)操作,開(kāi)發(fā)者可以自行加入真實(shí)網(wǎng)絡(luò)加載動(dòng)作。

    // RefreshComponent.ets
    onRefresh: () = > {
      setTimeout(() = > {
        this.state = RefreshState.COMPLETE;
      }, CommonConstants.REFRESH_DEFAULT_TIMEOUT);
    }
    

自定義刷新動(dòng)畫(huà)

本Codelab中自定義刷新是5個(gè)圖片的組合動(dòng)畫(huà)效果。

  1. 每個(gè)Image通過(guò)iconItem參數(shù)分別設(shè)置各自的x軸偏移量和延時(shí)播放的屬性動(dòng)畫(huà)效果。
    // RefreshAnimHeader.ets
    @Builder AttrAnimIcons(iconItem: ClassifyModel) {
      Image(iconItem.imgRes)
        .width(px2vp(DimensionUtil.adaptDimension(this.iconWidth)))
        .position({ x: iconItem.posX })
        .objectFit(ImageFit.Contain)
        .animation({
          duration: CommonConstants.REFRESH_HEADER_ITEM_ANIM_DURATION,
          tempo: CommonConstants.REFRESH_HEADER_ITEM_ANIM_TEMPO,
          delay: iconItem.delay,
          curve: Curve.Linear,
          playMode: PlayMode.Alternate,
          iterations: CommonConstants.REFRESH_HEADER_ITEM_ANIM_ITERATIONS
        })
    }
    
  2. 監(jiān)聽(tīng)RefreshComponent刷新組件state狀態(tài)的變化,當(dāng)前狀態(tài)為REFRESHING狀態(tài)時(shí),啟動(dòng)動(dòng)畫(huà)效果。
    // RefreshAnimHeader.ets
    @Consume(RefreshConstants.REFRESH_STATE_TAG) @Watch('onStateCheck') state: RefreshState;
    @State iconWidth: number = CommonConstants.REFRESH_HEADER_ITEM_DEFAULT_WIDTH;
    
    private onStateCheck() {
      if (this.state === RefreshState.REFRESHING) {
        this.iconWidth = CommonConstants.REFRESH_HEADER_ITEM_SCALE_WIDTH;
      } else {
        this.iconWidth = CommonConstants.REFRESH_HEADER_ITEM_DEFAULT_WIDTH;
      }
    }
    

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1946

    瀏覽量

    29740
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3548

    瀏覽量

    15743
  • 鴻蒙OS
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    4336
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS開(kāi)發(fā)實(shí)例:【自定義Emitter】

    使用[Emitter]實(shí)現(xiàn)事件的訂閱和發(fā)布,使用[自定義彈窗]設(shè)置廣告信息。
    的頭像 發(fā)表于 04-14 11:37 ?883次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)</b>實(shí)例:【<b class='flag-5'>自定義</b>Emitter】

    HarmonyOS開(kāi)發(fā)案例:【 自定義彈窗】

    基于ArkTS的聲明式開(kāi)發(fā)范式實(shí)現(xiàn)了三種不同的彈窗,第一種直接使用公共組件,后兩種使用CustomDialogController實(shí)現(xiàn)自定義彈窗
    的頭像 發(fā)表于 05-16 18:18 ?1060次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【 <b class='flag-5'>自定義</b>彈窗】

    HarmonyOS開(kāi)發(fā)案例:【抽獎(jiǎng)轉(zhuǎn)盤(pán)】

    基于畫(huà)布組件、顯式動(dòng)畫(huà),實(shí)現(xiàn)的一個(gè)自定義抽獎(jiǎng)圓形轉(zhuǎn)盤(pán)。
    的頭像 發(fā)表于 05-07 10:10 ?575次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【抽獎(jiǎng)轉(zhuǎn)盤(pán)】

    講解一下HarmonyOS中的幾個(gè)自定義組件用到的知識(shí)

    HarmonyOS 的 Component 組件對(duì)外提供了一個(gè) DrawTask 接口,通過(guò) addDrawTask 方法為組件添加一個(gè) DrawTask,讓開(kāi)發(fā)者可以進(jìn)行自定義繪制邏輯。首先我們
    發(fā)表于 03-16 16:05

    請(qǐng)問(wèn)鴻蒙自定義控件中如何刷新canvas?

      自定義控件通過(guò)addDrawTask在DrawTask中使用canvas進(jìn)行繪制,需要實(shí)現(xiàn)一個(gè)動(dòng)畫(huà)效果,需要刷新一下canvas,不知道通過(guò)哪個(gè)方法進(jìn)行刷新
    發(fā)表于 05-31 16:16

    C#教程之自定義動(dòng)畫(huà)鼠標(biāo)

    C#教程之自定義動(dòng)畫(huà)鼠標(biāo),很好的C#資料,快來(lái)學(xué)習(xí)吧。
    發(fā)表于 04-20 14:46 ?4次下載

    android 水滴動(dòng)畫(huà)下拉刷新

    android 水滴動(dòng)畫(huà)下拉刷新
    發(fā)表于 12-17 17:22 ?0次下載

    鴻蒙系統(tǒng)如何設(shè)置自定義下拉刷新控件

    Ohos-MaterialRefreshLayout 是一個(gè)自定義 Material 風(fēng)格下拉刷新控件,支持設(shè)置水波紋效果,支持下拉刷新侵入
    的頭像 發(fā)表于 09-13 09:24 ?3155次閱讀

    HarmonyOS 中的幾個(gè)自定義控件介紹

    HarmonyOS 開(kāi)發(fā)自定義組件目前還不是很豐富,在開(kāi)發(fā)過(guò)程中常常會(huì)有一些特殊效果的組件,這就需要我們額外花一些時(shí)間實(shí)現(xiàn)。
    的頭像 發(fā)表于 01-04 13:49 ?2089次閱讀

    自定義下拉刷新控件

    這是一個(gè)自定義下拉刷新控件,包含有趣的動(dòng)畫(huà)。 概述 支持下拉刷新
    發(fā)表于 03-22 09:30 ?2次下載

    在16x2 LCD顯示器上創(chuàng)建自定義動(dòng)畫(huà)

    電子發(fā)燒友網(wǎng)站提供《在16x2 LCD顯示器上創(chuàng)建自定義動(dòng)畫(huà).zip》資料免費(fèi)下載
    發(fā)表于 10-24 09:28 ?0次下載
    在16x2 LCD顯示器上創(chuàng)建<b class='flag-5'>自定義</b><b class='flag-5'>動(dòng)畫(huà)</b>

    自定義算子開(kāi)發(fā)

    一個(gè)完整的自定義算子應(yīng)用過(guò)程包括注冊(cè)算子、算子實(shí)現(xiàn)、含自定義算子模型轉(zhuǎn)換和運(yùn)行含自定義op模型四個(gè)階段。在大多數(shù)情況下,您的模型應(yīng)該可以通過(guò)使用hb_mapper工具完成轉(zhuǎn)換并順利部署到地平線芯片上……
    的頭像 發(fā)表于 04-07 16:11 ?2515次閱讀
    <b class='flag-5'>自定義</b>算子<b class='flag-5'>開(kāi)發(fā)</b>

    HarmonyOS開(kāi)發(fā)案例:【抽獎(jiǎng)轉(zhuǎn)盤(pán)】

    基于畫(huà)布組件、動(dòng)畫(huà)樣式,實(shí)現(xiàn)的一個(gè)自定義抽獎(jiǎng)圓形轉(zhuǎn)盤(pán)。
    的頭像 發(fā)表于 04-24 21:58 ?233次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【抽獎(jiǎng)轉(zhuǎn)盤(pán)】

    HarmonyOS開(kāi)發(fā)案例:【UIAbility和自定義組件生命周期】

    本文檔主要描述了應(yīng)用運(yùn)行過(guò)程中UIAbility和自定義組件的生命周期。對(duì)于UIAbility,描述了Create、Foreground、Background、Destroy四種生命周期。對(duì)于頁(yè)面
    的頭像 發(fā)表于 05-10 15:31 ?902次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)案</b>例:【UIAbility和<b class='flag-5'>自定義</b>組件生命周期】

    【AWTK使用經(jīng)驗(yàn)】如何自定義combo_box下拉框樣式

    AWTK是基于C語(yǔ)言開(kāi)發(fā)的跨平臺(tái)GUI框架?!禔WTK使用經(jīng)驗(yàn)》系列文章將介紹開(kāi)發(fā)AWTK過(guò)程中一些常見(jiàn)問(wèn)題與解決方案,例如:如何加載外部資源?如何設(shè)計(jì)自定義進(jìn)度條?這些都會(huì)在系列文章進(jìn)行解答。假設(shè)
    的頭像 發(fā)表于 05-23 08:25 ?292次閱讀
    【AWTK使用經(jīng)驗(yàn)】如何<b class='flag-5'>自定義</b>combo_box<b class='flag-5'>下拉</b>框樣式