<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

HarmonyOS開發案例:【電子相冊】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-08 09:32 ? 次閱讀

介紹

如何實現一個簡單的電子相冊應用的開發,主要功能包括:

  1. 實現首頁頂部的輪播效果。
  2. 實現頁面跳轉時共享元素的轉場動畫效果。
  3. 實現通過手勢控制圖片的放大、縮小、左右滑動查看細節等效果。

相關概念

  • [Swiper]:滑塊視圖容器,提供子組件滑動輪播顯示的能力。
  • [Grid]:網格容器,由“行”和“列”分割的單元格所組成,通過指定“項目”所在的單元格做出各種各樣的布局。
  • [Navigation]:Navigation組件一般作為Page頁面的根容器,通過屬性設置來展示頁面的標題、工具欄、菜單。
  • [List]:列表包含一系列相同寬度的列表項。適合連續、多行呈現同類數據,例如圖片和文本。
  • [組合手勢]:手勢識別組,多種手勢組合為復合手勢,支持連續識別、并行識別和互斥識別。

環境搭建

軟件要求

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

硬件要求

  • 開發板類型:[潤和RK3568開發板]。
  • OpenHarmony系統:3.2 Release。

環境搭建

完成本篇Codelab我們首先要完成開發環境的搭建,本示例以RK3568開發板為例,參照以下步驟進行:

  1. [獲取OpenHarmony系統版本]:標準系統解決方案(二進制)。以3.2 Release版本為例:
  2. 搭建燒錄環境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開發板的燒錄]
  3. 搭建開發環境。
    1. 開始前請參考[工具準備],完成DevEco Studio的安裝和開發環境配置。
    2. 開發環境配置完成后,請參考[使用工程向導]創建工程(模板選擇“Empty Ability”)。
    3. 工程創建完成后,選擇使用[真機進行調測]。
    4. 開發前請熟悉鴻蒙開發指導文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

代碼結構解讀

本篇Codelab只對核心代碼進行講解,對于完整代碼,我們會在gitee中提供。

├──entry/src/main/ets                // 代碼區
│  ├──common
│  │  ├──constansts
│  │  │  └──Constants.ets            // 常量類
│  │  └──utils
│  │     └──Logger.ets               // Logger公共類
│  ├──entryability
│  │  └──EntryAbility.ts             // 程序入口類
│  ├──pages
│  │  ├──DetailListPage.ets          // 圖片詳情頁面
│  │  ├──DetailPage.ets              // 查看大圖頁面
│  │  ├──IndexPage.ets               // 電子相冊主頁面
│  │  └──ListPage.ets                // 圖片列表頁面
│  └──view
│     └──PhotoItem.ets               // 首頁相冊Item組件
└──entry/src/main/resources          // 資源文件

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

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

構建應用頁面

應用首頁

應用首頁用Column組件來實現縱向布局,從上到下依次是標題組件Text、輪播圖Swiper、相冊列表Grid。標題和輪播圖均設置固定高度,底部相冊列表通過layoutWeight屬性實現自適應占滿剩余空間。

// IndexPage.ets
Column() {
  Row() {
    Text($r('app.string.EntryAbility_label'))
  }

  Swiper(this.swiperController) {
    ForEach(Constants.BANNER_IMG_LIST, (item: Resource) = > {
      Row() {
        Image(item)
        ...
      }
    }, (item: Resource, index: number) = > JSON.stringify(item) + index)
  }
  ...

  Grid() {
    ForEach(IMG_ARR, (photoArr: Array< Resource >) = > {
      GridItem() {
        PhotoItem({ photoArr })
      }
      ...
      .onClick(() = > {
        router.pushUrl({
          url: Constants.URL_LIST_PAGE,
          params: { photoArr: JSON.stringify(photoArr) }
        }).catch((error: Error) = > {
          Logger.error(Constants.TAG_INDEX_PAGE, JSON.stringify(error));
        });
      })
    }, (item: Array< Resource >, index: number) = > JSON.stringify(item) + index)
  }
  ...
  .layoutWeight(1)
}

圖片列表頁面

圖片列表頁是網格狀展開的圖片列表,主要使用Grid組件和GridItem組件,GridItem高度通過aspectRatio屬性設置為跟寬度一致。

// ListPage.ets
Navigation() {
  Grid() {
    ForEach(this.photoArr, (img: Resource, index: number) = > {
      GridItem() {
        Image(img)
          .onClick(() = > {
            this.selectedIndex = index;
            router.pushUrl({
              url: Constants.URL_DETAIL_LIST_PAGE,
              params: {
                photoArr: JSON.stringify(this.photoArr),
              }
            }).catch((error: Error) = > {
              Logger.error(Constants.TAG_LIST_PAGE, JSON.stringify(error));
            });
          })
      }
      ...
      .aspectRatio(1)
    }, (item: Resource) = > JSON.stringify(item))
  }
  .columnsTemplate(Constants.GRID_COLUMNS_TEMPLATE)
  .layoutWeight(1)
}

圖片詳情頁面

圖片詳情頁由兩個橫向滾動的List組件完成整體布局,兩個組件之間有聯動的效果。滾動底部的List,上邊展示的圖片會隨著改變,同樣左右滑動上邊的圖片時,底部List組件也會隨之改變。

// DetailListPage.ets
Stack({ alignContent: Alignment.Bottom }) {
  List({ scroller: this.bigScroller, initialIndex: this.selectedIndex }) {
    ForEach(this.photoArr, (img: Resource, index: number) = > {
      ListItem() {
        Image(img)
          ...
          .gesture(PinchGesture({ fingers: Constants.DOUBLE_NUMBER })
            .onActionStart(() = > this.goDetailPage()))
          .onClick(() = > this.goDetailPage())
      }
    }, (item: Resource) = > JSON.stringify(item))
  }
  ...
  .onScroll((scrollOffset, scrollState) = > {
    if (scrollState === ScrollState.Fling) {
      this.bigScrollAction(scrollTypeEnum.SCROLL);
    }
  })
  .onScrollStop(() = > this.bigScrollAction(scrollTypeEnum.STOP))

  List({ scroller: this.smallScroller, space: Constants.LIST_ITEM_SPACE, initialIndex: this.selectedIndex }) {
    ForEach(this.smallPhotoArr, (img: Resource, index: number) = > {
      ListItem() {
        this.SmallImgItemBuilder(img, index)
      }
    }, (item: Resource, index: number) = > JSON.stringify(item) + index)
  }
  ...
  .listDirection(Axis.Horizontal)
  .onScroll((scrollOffset, scrollState) = > {
    if (scrollState === ScrollState.Fling) {
      this.smallScrollAction(scrollTypeEnum.SCROLL);
    }
  })
  .onScrollStop(() = > this.smallScrollAction(scrollTypeEnum.STOP))
}

查看大圖頁面

查看大圖頁面由一個橫向滾動的List組件來實現圖片左右滑動時切換圖片的功能,和一個Row組件實現圖片的縮放和拖動查看細節功能。對圖片進行縮放時會從List組件切換成Row組件來實現對單張圖片的操作,對單張圖片進行滑動操作時,也會由Row組件轉換為List組件來實現圖片的切換功能。

// DetailPage.ets
Stack() {
  List({ scroller: this.scroller, initialIndex: this.selectedIndex }) {
    ForEach(this.photoArr, (img: Resource) = > {
      ListItem() {
        Image(img)
          ...
          .onClick(() = > router.back()
          )
      }
      .gesture(PinchGesture({ fingers: Constants.DOUBLE_NUMBER })
        .onActionStart(() = > {
          this.resetImg();
          this.isScaling = true;
          this.imgOffSetX = 0;
          this.imgOffSetY = 0;
        })
        .onActionUpdate((event: GestureEvent) = > {
          this.imgScale = this.currentScale * event.scale;
        })
        .onActionEnd(() = > {
          if (this.imgScale < 1) {
            this.resetImg();
            this.imgOffSetX = 0;
            this.imgOffSetY = 0;
          } else {
            this.currentScale = this.imgScale;
          }
        })
      )
    }, (item: Resource) = > JSON.stringify(item))
  }
  ...
  .onScrollStop(() = > {
    let currentIndex = Math.round((this.scroller.currentOffset()
      .xOffset + (this.imageWidth / Constants.DOUBLE_NUMBER)) / this.imageWidth);
    this.selectedIndex = currentIndex;
    this.scroller.scrollTo({ xOffset: currentIndex * this.imageWidth, yOffset: 0 });
  })
  .visibility(this.isScaling ? Visibility.Hidden : Visibility.Visible)

  Row() {
    Image(this.photoArr[this.selectedIndex])
    ...
  }
  .visibility(this.isScaling ? Visibility.Visible : Visibility.Hidden)
}

通過手勢控制圖片

大圖瀏覽界面雙指捏合時通過改變Image組件的scale來控制圖片的縮放,單手拖動時通過改變Image的偏移量來控制圖片的位置,手勢操作調用組合手勢GestureGroup實現。其中PinchGesture實現雙指縮放手勢,PanGesture實現單指拖動手勢。

// DetailPage.ets 
Row() {
    Image(this.photoArr[this.selectedIndex])
      .position({ x: this.imgOffSetX, y: this.imgOffSetY })
      .scale({ x: this.imgScale, y: this.imgScale })
  }
  .gesture(GestureGroup(GestureMode.Exclusive,
  PinchGesture({ fingers: Constants.DOUBLE_NUMBER })
    .onActionUpdate((event: GestureEvent) = > {
      this.imgScale = this.currentScale * event.scale;
    })
    .onActionEnd(() = > {
      if (this.imgScale < 1) {
        this.resetImg();
        this.imgOffSetX = 0;
        this.imgOffSetY = 0;
      } else {
        this.currentScale = this.imgScale;
      }
    }),
  PanGesture()
    .onActionStart(() = > {
      this.preOffsetX = this.imgOffSetX;
      this.preOffsetY = this.imgOffSetY;
    })
    .onActionUpdate((event: GestureEvent) = > {
      this.imgOffSetX = this.preOffsetX + event.offsetX;
      this.imgOffSetY = this.preOffsetY + event.offsetY;
    })
    .onActionEnd(() = > this.handlePanEnd())
  ))

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    55

    文章

    1765

    瀏覽量

    42153
  • OpenHarmony
    +關注

    關注

    23

    文章

    3377

    瀏覽量

    15194
收藏 人收藏

    評論

    相關推薦

    一個非常不錯的電子相冊制作工具 MemoriesOnTV

    一個非常不錯的電子相冊制作工具 MemoriesOnTV該軟件上手非常容易,制作的電子相冊的過場特效非常專業,現在你還可以要相冊中添加視頻及文本幻燈,同時增加了相片特效。你不但可以用它來刻錄
    發表于 05-14 11:47

    如何制作兒童電子相冊?(教程)

    美好記憶保留在腦海中。為了保留寶寶每個瞬間,父母們會給寶寶拍了許許多多的照片,如果這些照片(馬伊琍女兒照片)變成了一份精彩的電子相冊!連寶寶自己純真的眼睛看著他的照片在電視上翩翩飛舞,都會不由自主喜歡
    發表于 07-20 12:28

    單片機電子相冊DIY

    `單片機電子相冊DIY`
    發表于 08-15 22:57

    51單片機2.8寸液晶開發板,運行游戲,電子相冊,手寫板,...

    資料更新中。。。51單片機液晶開發板,可運行游戲,電子相冊,手寫板,電子書還可以做測試板用,可以配套2.4寸2.6寸2.8寸3.2寸提供的學習資源有:1,游戲開發(俄羅斯方塊,拼圖游戲
    發表于 06-10 15:40

    求一個基于frambuffer電子相冊制作的源程序?(基于linux高級編程的);

    新手一名,需要一個電子相冊的程序,可以播放音樂的,謝了!
    發表于 09-10 10:23

    51單片機TFT2.8 彩屏 -9325ok 電子相冊

    `這個壓縮包是自己無意在電腦中發現的,看了下,還是挺好。 包括彩色屏顯示,觸摸,以及使用方式,例程,還有一個電子相冊的制作說明。所以上傳上來。 覺得有需要的就下載。還有寫資料上傳不了。。。不知道咋回事。 `
    發表于 04-30 01:29

    基于FATFS文件系統的電子相冊

    的圖片沒有原子的高級11.電子相冊.rar (324.46 KB )FATFS淺談.pdf (248.35 KB )37-文件系統源碼(R.007c).rar (1.22 MB )
    發表于 07-16 08:00

    ARM裸機開發之基于Mini2451開發板的電子相冊開發步驟

    該項目的制作是用的友善之臂的Mini2451開發板。簡單先介紹一下該電子相冊的主要功能即操作:開發板上一共有4個按鍵,K1是進入選擇界面,選擇界面中K2為手動切換,K3為自動切換,在自動切換模式中
    發表于 05-19 14:36

    HarmonyOS做一個可以手勢控制的電子相冊應用(ArkTS)

    介紹 本篇Codelab介紹了如何實現一個簡單的電子相冊應用,主要功能包括: 實現首頁頂部的輪播效果。 實現頁面多種布局方式。 實現通過手勢控制圖片的放大、縮小、左右滑動查看細節等效果。 相關概念
    發表于 10-23 14:14

    【迪文COF結構智能屏試用體驗】基于串口通信的電子相冊(動態平滑、完整代碼)

    分享。 這篇分享,涉及或需要了解下面的知識: 迪文COF智能屏基礎了解 運行時內存中數據存儲的原理 迪文DBUS GUI開發軟件 串口指令的基本使用 串口傳送圖片數據的原理 電子相冊的原理 Python
    發表于 12-06 15:58

    JAVA教程之電子相冊

    JAVA教程之電子相冊,很好的JAVA的資料,快來學習吧
    發表于 04-11 17:14 ?5次下載

    基于Web電子相冊3D翻頁效果實現

    隨著科技的不斷進步,在個人用戶體驗的操作系統中已包含了眾多圖形算法和桌面渲染。隨著3D技術的發展,人們越來越傾向于基于Web的3D真實感體驗,研究人員目前正在大力研究這個問題。電子相冊制作
    發表于 11-16 09:24 ?6次下載
    基于Web<b class='flag-5'>電子相冊</b>3D翻頁效果實現

    視頻電子相冊制作中視頻不清晰的原因和辦法

    用戶在使用艾奇電子相冊制作軟件的時候,可能會遇到制作出的視頻播放不清晰的情況。艾奇KTV電子相冊視頻制作軟件,為了強化輸出質量,默認的輸出分辨率是比較高的。所以默認參數下制作輸出的視頻文件會比較大,同時清晰度也會高。
    發表于 08-08 16:19 ?5094次閱讀

    華為開發者分論壇HarmonyOS學生公開課-OpenHarmony Codelabs開發案

    2021華為開發者分論壇HarmonyOS學生公開課-OpenHarmony Codelabs開發案
    的頭像 發表于 10-24 11:25 ?1635次閱讀
    華為<b class='flag-5'>開發</b>者分論壇<b class='flag-5'>HarmonyOS</b>學生公開課-OpenHarmony Codelabs<b class='flag-5'>開發案</b>例

    基于Java Web電子相冊

    基于Java web的電子相冊系統
    發表于 06-26 15:25 ?0次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>