成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

鴻蒙開源第三方組件——連續滾動圖像組件

開源
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[396827]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

前言

基于安卓平臺的連續滾動圖像組件ContinuousScrollableImageView(https://github.com/Cutta/ContinuousScrollableImageView),實現了鴻蒙化遷移和重構,代碼已經開源到(https://gitee.com/isrc_ohos/continuous-scrollable-image-view_ohos),歡迎各位開發者下載使用并提出寶貴意見!

背景

ContinuousScrollableImageView_ohos組件通過讓圖像連續滾動,來實現動畫效果。組件支持對圖像的滾動效果進行設置,包括:圖像源、縮放類型、持續時間和方向等。該組件提供動態的視覺效果,可以用來開發應用的背景等。

組件效果展示

ContinuousScrollableImageView_ohos組件庫中設置了飛機、云、山三種圖像:飛機的滾動方向設置為“RIGHT”,向右側滾動;云和山的滾動方向設置為“LEFT”,向左滾動。三者組合成一幅完整的、具有連續滾動效果的動畫圖像,如圖1所示。

鸿蒙开源第三方组件——连续滚动图像组件

圖1 ContinuousScrollableImageView_ohos組件運行效果圖

Sample解析

Sample部分主要負責搭建整體的顯示布局,并實例化飛機、云、山三種圖像的對象。通過調用Library提供的接口,對三個對象的滾動效果進行屬性設置。想要實現圖1所示的動畫效果,需要以下3個步驟:

步驟1. 導入ContinuousScrollableImageView類。

步驟2. 實例化類對象并設置各個對象的屬性。

步驟3. 將對象添加到整體顯示布局中。

下面我們來看一下每個步驟涉及的詳細操作。

1、導入ContinuousScrollableImageView類

  1. import com.cunoraz.continuousscrollable.ContinuousScrollableImageView; 

2、實例化類對象并設置各個對象的屬性

圖1中的動畫效果需要實例化3個ContinuousScrollableImageView對象分別代指包含飛機、云、山三種圖像。

設置各對象屬性的方式有兩種:常用方式和Builder方式。常用方式是指通過對象單獨調用類接口的方式;Builder方式即建造者模式。用戶可根據個人需要,自行確定使用哪種方式設置對象屬性。此處為了證明兩種方式的有效性,飛機和云圖像采用常用方式設置屬性,山圖像采用Builder方式設置屬性。 ContinuousScrollableImageView對象的可設置屬性有4個,包括:滾動方向、滾動周期、縮放類型、圖像源。

(1)實例化飛機圖像的對象并進行屬性設置

  1. // 實例化對象 
  2. ContinuousScrollableImageView plane=new ContinuousScrollableImageView(this); 
  3. // 采用常用方式進行屬性設置 
  4. LayoutConfig planeConfig=new LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,0,LayoutConfig.UNSPECIFIED_ALIGNMENT,1); 
  5. plane.setLayoutConfig(planeConfig); 
  6. plane.setDirection(ContinuousScrollableImageView.RIGHT);  //設置滾動方向向右 
  7. plane.setDuration(2500);   //設置滾動周期 
  8. plane.setScaleType(ContinuousScrollableImageView.CENTER_INSIDE);  //設置縮放類型 
  9. plane.setResourceId(ResourceTable.Media_plane);  // 設置圖像源 

(2)實例化云圖像的對象并進行屬性設置

  1. // 實例化對象 
  2. ContinuousScrollableImageView cloud=new ContinuousScrollableImageView(this); 
  3. // 采用常用方法進行屬性設置 
  4. LayoutConfig cloudConfig=new LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,0,LayoutConfig.UNSPECIFIED_ALIGNMENT,1); 
  5. cloud.setLayoutConfig(cloudConfig); 
  6. cloud.setDirection(ContinuousScrollableImageView.LEFT);   //設置滾動方向向左 
  7. cloud.setDuration(4000);    //設置滾動周期 
  8. cloud.setResourceId(ResourceTable.Media_cloud);    //設置圖像源 

(3)實例化山圖像的對象并進行屬性設置

  1. LayoutConfig mountainConfig=new LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,0,LayoutConfig.UNSPECIFIED_ALIGNMENT,1); 
  2. //采用Builder方式進行對象創建和屬性設置 
  3. ContinuousScrollableImageView mountain=new ContinuousScrollableImageView.Builder(this.getAbility()) 
  4.         .setDirection(ContinuousScrollableImageView.LEFT)    //設置方向向左 
  5.         .setDuration(6000)    //設置時間間隔 
  6.         .setResourceId(ResourceTable.Media_mountain)    //設置圖像源 
  7.         .build(); 
  8. mountain.setLayoutConfig(mountainConfig); 

3、對象添加到整體顯示布局中

  1. layout.addComponent(cloud); //飛機對象添加到布局 
  2. layout.addComponent(mountain); //云對象添加到布局 
  3. layout.addComponent(mountain);  //山對象添加到布局 

Library解析

Library向開發者提供ContinuousScrollableImageView類對象的啟動接口和屬性設置接口。以圖1的效果為例,通過調用啟動接口,可以讓飛機、云和山對象開始滾動;通過調用屬性設置接口,可以改變上述對象的滾動效果。由Sample部分可知,ContinuousScrollableImageView類對象的屬性設置有兩種方式,本節將揭示,不同屬性設置方式下屬性設置接口的功能實現也存在差異。

1、ContinuousScrollableImageView類對象啟動接口

該接口的功能實現內容較多,但主要邏輯較為清晰,主要可以分為四個部分:設置布局、創建數值動畫、對不同的滾動方向設置監聽和啟動動畫。

(1)設置布局

圖2 兩個布局依次出現

如圖2所示,畫面中所有的ContinuousScrollableImageView類對象都需要具有循環滾動的效果,以飛機為例:飛機滾動至最右側時,逐漸顯示的部分需要在最左側重新出現。為此,設計了兩個布局:firstImage和secondImage,二者布局相同且循環顯示,其中一個布局顯示另一個布局消失的部分。

  1. private void setImages() { 
  2.     ...... 
  3.     firstImage = (Image) this.findComponentById(ResourceTable.Id_first_image); 
  4.     secondImage = (Image) this.findComponentById(ResourceTable.Id_second_image); 
  5.     firstImage.setImageAndDecodeBounds(resourceId); 
  6.     secondImage.setImageAndDecodeBounds(resourceId); 
  7.     setScaleType(scaleType); 

(2)創建數值動畫

飛機、云和山都是靜態的,想讓實現滾動效果,需要借助動畫類。此處采用的是數值動畫的方式,來啟動各對象。同時還需要設置動畫的循環次數、線性變化、循環周期等屬性。

  1. animator.setLoopedCount(AnimatorValue.INFINITE);  //動畫無限重復 
  2. animator.setCurveType(Animator.CurveType.LINEAR);  //動畫線性變化 
  3. animator.setDuration(duration);   //動畫的持續時間 

(3)對不同的滾動方向設置監聽

飛機、云和山都可以設置不同的滾動方向,針對不同的方向設置不同的值動畫監聽,以飛機為例:當飛機橫向滾動時,通過設置firstImage和secondImage的橫坐標變化,達到二者循環顯示的目的。當飛機豎向滾動動,通過設置firstImage和secondImage的坐標變化,達到二者循環顯示的目的。

  1. switch (DEFAULT_ASYMPTOTE) { 
  2.     case HORIZONTAL:   // 橫向滾動 
  3.         animator.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() {       //值動畫監聽 
  4.             @Override 
  5.             public void onUpdate(AnimatorValue animatorValue, float v) { 
  6.                 // firstImage和secondImage循環顯示算法 
  7.                 float progress; 
  8.                 if (DIRECTION_MULTIPLIER == 1) 
  9.                     progress = DIRECTION_MULTIPLIER * (v); 
  10.                 else 
  11.                     progress = DIRECTION_MULTIPLIER * (-v); 
  12.                 float width = DIRECTION_MULTIPLIER * (-firstImage.getWidth()); 
  13.                 float translationX = width * progress; 
  14.                 firstImage.setTranslationX(translationX);  //設置firstImage的橫坐標 
  15.                 secondImage.setTranslationX(translationX - width); //設置secondImage的橫坐標 
  16.             } 
  17.         }); 
  18.         break; 
  19. ...... 

(4)啟動動畫

動畫啟動后,飛機、云和山的坐標就會發生變化,此時他們的動畫效果就由靜態的變成滾動的。

  1. animator.start();      //動畫啟動 

2、常用方式下屬性設置接口功能實現

飛機和云采用常用方式設置屬性,其屬性包含:滾動周期、滾動方向、圖像源、圖像縮放類型。各接口的功能實現較為簡單,值得注意的是,在滾動方向和滾動周期功能實現中分別調用了啟動接口,此處是為了適應下文即將指出的Builder方式,具體原因將在下文講述。若開發者只采用常用方式進行屬性設置,可以將啟動接口從滾動方向和滾動周期功能實現中分離出來,通過飛機或者云的對象單獨調用。

  1. //設置滾動周期 
  2. public void setDuration(int duration) { 
  3.     this.duration = duration; 
  4.     isBuilt = false
  5.     build(); 
  6. //設置方向 
  7. public void setDirection(@Directions int direction) { 
  8.     this.direction = direction; 
  9.     isBuilt = false
  10.     setDirectionFlags(direction); 
  11.     build(); 
  12. //設置圖像源 
  13. public void setResourceId(int resourceId) { 
  14.     this.resourceId = resourceId; 
  15.     firstImage.setImageAndDecodeBounds(this.resourceId); 
  16.     secondImage.setImageAndDecodeBounds(this.resourceId); 
  17. //設置圖像縮放類型 
  18. public void setScaleType(@ScaleType int scaleType) { 
  19.     if (firstImage == null || secondImage == null) { 
  20.         throw new NullPointerException(); 
  21.     } 
  22.     Image.ScaleMode type = Image.ScaleMode.CENTER; 
  23.     switch (scaleType) { 
  24.     ··· 
  25.     } 
  26.     this.scaleType = scaleType; 
  27.     firstImage.setScaleMode(type); 
  28.     secondImage.setScaleMode(type); 

3、Builder方式設置屬性

對山采用Builder方式進行屬性設置,各屬性在功能實現時分別調用了常用方式下的屬性設置接口,但是缺少啟動接口的調用。

為了在Builder方式下也能正常啟動動畫,常用方式下的滾動方向和滾動周期功能實現中包含了啟動接口,這樣當在Builder方式下調用上述接口時,就可以實現動畫的啟動。

  1. public static final class Builder { 
  2.     private ContinuousScrollableImageView scrollableImage; 
  3.     public Builder(Ability ability) { 
  4.         scrollableImage = new ContinuousScrollableImageView(ability); 
  5.     } 
  6.     //設置滾動周期 
  7.     public Builder setDuration(int duration) { 
  8.         scrollableImage.setDuration(duration); 
  9.         return this; 
  10.     } 
  11.     //設置圖像源 
  12.     public Builder setResourceId(int resourceId) { 
  13.         scrollableImage.setResourceId(resourceId); 
  14.         return this; 
  15.     } 
  16.    //設置滾動方向 
  17.     public Builder setDirection(@Directions int direction) { 
  18.         scrollableImage.setDirection(direction); 
  19.         return this; 
  20.     } 
  21.     //設置縮放類型 
  22.     public Builder setScaleType(@ScaleType int scaleType) { 
  23.         scrollableImage.setScaleType(scaleType); 
  24.         return this; 
  25.     } 
  26.     public ContinuousScrollableImageView build() { 
  27.         return scrollableImage; 
  28.     } 

項目貢獻人

劉磊 鄭森文 朱偉 陳美汝 王佳思 張馨心

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-03-10 15:03:40

鴻蒙HarmonyOS應用

2021-03-24 09:30:49

鴻蒙HarmonyOS應用

2021-03-03 09:42:26

鴻蒙HarmonyOS圖片裁剪

2021-08-03 10:07:41

鴻蒙HarmonyOS應用

2021-03-01 14:00:11

鴻蒙HarmonyOS應用

2021-08-26 16:07:46

鴻蒙HarmonyOS應用

2021-07-06 18:21:31

鴻蒙HarmonyOS應用

2021-04-08 14:57:52

鴻蒙HarmonyOS應用

2021-04-20 15:06:42

鴻蒙HarmonyOS應用

2021-08-30 17:55:58

鴻蒙HarmonyOS應用

2021-08-05 15:06:30

鴻蒙HarmonyOS應用

2021-11-17 15:37:43

鴻蒙HarmonyOS應用

2021-07-20 15:20:40

鴻蒙HarmonyOS應用

2021-04-15 17:47:38

鴻蒙HarmonyOS應用

2021-03-12 16:35:33

鴻蒙HarmonyOS應用

2021-01-27 10:04:46

鴻蒙HarmonyOS動畫

2021-11-02 14:54:21

鴻蒙HarmonyOS應用

2017-12-11 15:53:56

2021-08-10 15:23:08

鴻蒙HarmonyOS應用

2021-10-19 10:04:51

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人欧美一区二区三区黑人孕妇 | www成人免费 | 国产精品久久久久久久久久 | 国产91精品在线 | 男女网站视频 | 久久精品中文 | 久久久久久成人 | 一级片视频免费观看 | 6080yy精品一区二区三区 | 国产一区二区三区四区 | 中文字幕第九页 | 黄色男女网站 | 亚洲午夜精品视频 | 久久久亚洲 | 国产农村妇女毛片精品久久麻豆 | 亚洲三区在线 | 在线精品亚洲欧美日韩国产 | 日韩免费在线视频 | 观看av | 欧美日本在线观看 | 久久亚洲一区二区三区四区 | 久久久久国产 | 精品国产乱码久久久久久图片 | 久久国产精品99久久久大便 | 96av麻豆蜜桃一区二区 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 一区二区三区国产视频 | 国产一级在线观看 | 亚洲国产一区二区视频 | 激情亚洲 | 91精品国产高清一区二区三区 | 99精品国自产在线 | 国产成人精品久久二区二区 | 日韩不卡一二区 | 国产美女特级嫩嫩嫩bbb片 | 91色视频在线观看 | 精品国产伦一区二区三区观看体验 | 一级毛片免费看 | 色黄网站| 久久免费精品视频 | 日韩一区二区免费视频 |