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

HarmonyOS 通用的應用引導功能

系統 OpenHarmony
手機APP的引導頁是一個常見的功能,今天和大家一起分享在鴻蒙系統的擼引導頁代碼的經驗。引導的內容文字不宜太長,適當加入一些圖案可以方便用戶理解。開始咱們今天的主題,如何實現應用的引導功能吧!

[[419721]]

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

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

https://harmonyos.51cto.com

手機APP的引導頁是一個常見的功能,今天和大家一起分享在鴻蒙系統的擼引導頁代碼的經驗。

一.應用引導頁的功能

1.1為什么要做應用的引導功能?

幾乎所有的App都會有做一些界面引導,有的是頁面交互的引導,有的是為了介紹新功能。

1.2通用的功能性引導大概分哪些呢?

主功能引導、新功能引導和功能轉移或改名引導。

1.3.通用的應用引導,需要注意哪些?

引導的內容文字不宜太長,適當加入一些圖案可以方便用戶理解。言歸正傳吧,開始咱們今天的主題,如何實現應用的引導功能吧!

二.實現應用的引導功能具體步驟:

首先來看看討論的引導功能的效果吧!點擊引導頁,向上滑動過程,第一個界面圖案和文字漸變消失的過程。而第二頁界面的圖片和文字漸漸清晰可見。底部Next 圖標會下滑隱藏再彈出的動畫效果。

開發準備

搭建鴻蒙開發環境,這里就不做介紹了,如果沒有環境沒有搭建好的同學可以進入學習安裝環境, 安裝好環境以后接下來我們就可以進行開發工作了。

2.1 設計思路

首先我們做的是公用的組件,我們需要使用組件化思想去搭建我們的項目框架,接下來根據組件的需求我們先去設計一下界面,設計好之后我們需要對頁面添加數據,添加完數據之后組件的大體界面已經展示給我們,下來就是在滑動page的時候添加底部button的回彈動畫,并且在此時我們需要操作page的子view。最后我們要去使用我們的組件。

2.2 設計步驟

2.2.1 設計界面

根據我們要實現的功能,我們可以使用PageSlider控件去實現界面布局文件,實現代碼為:

  1. <PageSlider 
  2.      ohos:id="$+id:vertical_view_pager" 
  3.      ohos:width="match_parent" 
  4.      ohos:height="match_parent" > 
  5. </PageSlider> 

(1)添加數據、初始化數據

  1. public void setData() { 
  2.     super.setData(); 
  3.     pageColors = new ArrayList<>(); 
  4.     pageColors.add(getString(ResourceTable.Color_colorAccent)); 
  5.     pageColors.add(getString(ResourceTable.Color_color2)); 
  6.     pageColors.add(getString(ResourceTable.Color_colorPrimary)); 
  7.     pageColors.add(getString(ResourceTable.Color_color3)); 
  8.     pageMoudles = getData(); 
  9.  
  10. private List<PageMoudle> getData() { 
  11.     String textValue = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."
  12.     PageMoudle pageMoudleOne = new PageMoudle(); 
  13.     pageMoudleOne.setRecoureId(ResourceTable.Graphic_intro_second_vector); 
  14.     pageMoudleOne.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(0)))); 
  15.     pageMoudleOne.setTitle("Lorem Ipsum Lorem Ipsum"); 
  16.  
  17.     pageMoudleOne.setText(textValue + textValue + textValue); 
  18.     pageMoudleOne.setTitleSize(17); 
  19.     pageMoudleOne.setTextSize(14); 
  20.     List<PageMoudle> datas = new ArrayList<>(); 
  21.     datas.add(pageMoudleOne); 
  22.  
  23.     PageMoudle pageMoudleTwo = new PageMoudle(); 
  24.     pageMoudleTwo.setRecoureId(ResourceTable.Graphic_four); 
  25.         pageMoudleTwo.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(1)))); 
  26.     pageMoudleTwo.setTitle("Lorem Ipsum Lorem Ipsum "); 
  27.     pageMoudleTwo.setText(textValue + textValue); 
  28.     datas.add(pageMoudleTwo); 
  29.  
  30.     PageMoudle pageMoudleThree = new PageMoudle(); 
  31.     pageMoudleThree.setRecoureId(ResourceTable.Graphic_ohos); 
  32.         pageMoudleThree.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(2)))); 
  33.     pageMoudleThree.setTitle("Lorem Ipsum"); 
  34.     pageMoudleThree.setText(textValue); 
  35.     datas.add(pageMoudleThree); 
  36.  
  37.     PageMoudle pageMoudleFour = new PageMoudle(); 
  38.     pageMoudleFour.setRecoureId(ResourceTable.Media_new_intro); 
  39.         pageMoudleFour.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(3)))); 
  40.     pageMoudleFour.setTitle("Lorem Ipsum"); 
  41.     pageMoudleFour.setText(textValue + textValue + textValue); 
  42.     datas.add(pageMoudleFour); 
  43.     return datas; 

 (2)設置provider

  1. pageSlider = (PageSlider) findComponentById(ResourceTable.Id_vertical_view_pager); 
  2. pageSlider.setOrientation(Component.VERTICAL); 
  3. pageSlider.addPageChangedListener(this); 
  4. pageSlider.setTouchEventListener(this::onTouchEvent); 
  5. adapter = new VerticalIntroPagerAdapter(this, pageMoudles); 
  6. pageSlider.setProvider(adapter); 

2.2.2 添加動畫

這里我們使用屬性動畫去完成底部button的上彈和下彈操作,上彈和下彈是和我們手指滑動的方向是有關系的,所以這里我們必須實現手指的觸摸事件,在觸摸事件中獲取我們手機滑動的距離,如果距離大于0則是下滑,如果小于0則是下滑.

(1) 獲取是上滑還是下滑代碼如下:

  1. @Override 
  2. public boolean onTouchEvent(Component component, TouchEvent touchEvent) { 
  3.         int action = touchEvent.getAction(); 
  4.         switch (action) { 
  5.             case TouchEvent.PRIMARY_POINT_DOWN: 
  6.                 pageSlider.setSlidingPossible(true); 
  7.                 startPointY = getTouchY(touchEvent, 0, component); 
  8.                 return true
  9.             case TouchEvent.POINT_MOVE: 
  10.                 movePointY = getTouchY(touchEvent, touchEvent.getIndex(), component) - startPointY; 
  11.                 if (page != 0 && movePointY > 0) { 
  12.                     WindowManager.getInstance().getTopWindow().get().setStatusBarColor(getColorByString(pageColors.get(page - 1))); 
  13.                 } 
  14.                 return true
  15.             case TouchEvent.PRIMARY_POINT_UP: 
  16.                 return true
  17.             default
  18.         } 
  19.         return false

(2) 獲取到上滑還是下滑后,接下來就去給底部button設置動畫.動畫用的是屬性動畫,屬性動畫大體實現是初始化動畫,設置動畫持續時間,實現動畫屬性值變化監聽事件,最后啟動動畫。大體代碼如下:

  1. private void startChangeButtonBg(int direction, int duration) { 
  2.         if (animatorValue == null) { 
  3.             animatorValue = new AnimatorValue(); 
  4.         } 
  5.         animatorValue.setCurveType(Animator.CurveType.LINEAR); 
  6.         animatorValue.setDuration(duration); 
  7.         animatorValue.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() { 
  8.             @Override 
  9.             public void onUpdate(AnimatorValue animatorValue, float v) { 
  10.                 if (direction <= 0) { 
  11.                     double value = ((1 - (double)v) * nextHeight) * direction; 
  12.                     next.setMarginBottom((int) value); 
  13.                 } else { 
  14.                     float value = -(v * nextHeight); 
  15.                     next.setMarginBottom((int) value); 
  16.                     if (v > 0.9) { 
  17.                         if (page == 3) { 
  18.                             skip.setVisibility(Component.INVISIBLE); 
  19.                             next.setText("DONE"); 
  20.                             next.setNormalColor(pageColors.get(1)); 
  21.                         } else { 
  22.                             skip.setVisibility(Component.VISIBLE); 
  23.                             next.setText("NEXT"); 
  24.                             next.setNormalColor(pageColors.get(page + 1)); 
  25.                         } 
  26.                         next.setMarginBottom(0); 
  27.                     } 
  28.                 } 
  29.             } 
  30.         }); 
  31.         setAnimStateChangeList(direction); 
  32.         animatorValue.start(); 
  33.  
  34. private void setAnimStateChangeList(int direction) { 
  35.         animatorValue.setStateChangedListener(new Animator.StateChangedListener() { 
  36.             @Override 
  37.             public void onStart(Animator animator) { 
  38.                 if (direction <= 0) { 
  39.                     if (page == 3) { 
  40.                         skip.setVisibility(Component.INVISIBLE); 
  41.                         next.setText("DONE"); 
  42.                         next.setNormalColor(pageColors.get(1)); 
  43.                     } else { 
  44.                         skip.setVisibility(Component.VISIBLE); 
  45.                         next.setText("NEXT"); 
  46.                         next.setNormalColor(pageColors.get(page + 1)); 
  47.                     } 
  48.                 } 
  49.             } 
  50.             @Override 
  51.             public void onStop(Animator animator) { 
  52.             } 
  53.             @Override 
  54.             public void onCancel(Animator animator) { 
  55.             } 
  56.             @Override 
  57.             public void onEnd(Animator animator) { 
  58.                 movePointY = 0; 
  59.             } 
  60.             @Override 
  61.             public void onPause(Animator animator) { 
  62.             } 
  63.             @Override 
  64.             public void onResume(Animator animator) { 
  65.             } 
  66.         }); 
  67.     } 

2.2.3 操作子view

如何去操作子view呢?首先我們先去看看PageSlider是否有子view的操作監聽接口,查看api后沒有這樣的接口獲取方法,那就得我們自己去考慮怎么實現呢,我這里的實現思路是在PageSlider設置provider的時候保存所有的子view對象,然后再使用的時候拿出子view再進行操作。我們這里例子是改變子view的透明度.代碼實現如下:

(1) 保存子view

  1. public class VerticalIntroPagerAdapter extends PageSliderProvider { 
  2.     LinkedHashMap<Integer, Component> pageComonents; 
  3.         public VerticalIntroPagerAdapter(Context context, List<PageMoudle> datas) { 
  4.             this.context = context; 
  5.             this.datas = datas; 
  6.             pageComonent = new ArrayList<>(); 
  7.     // 初始化用來添加子view的集合,注意這里是一個有序集合 
  8.             pageComonents = new LinkedHashMap<Integer, Component>(); 
  9.     } 
  10.     //添加子view 
  11.     @Override 
  12.     public Object createPageInContainer(ComponentContainer componentContainer, int i) { 
  13.         if (!pageComonents.containsValue(component)) { 
  14.                 pageComonents.put(i, component); 
  15.             } 
  16.     } 

(2) 操作子view

  1. private void setPageApale(int currentPage, int targetPage, float offset) { 
  2.         if (adapter.pageComonents != null && adapter.pageComonents.get(currentPage) != null 
  3.             && adapter.pageComonents.get(targetPage) != null) { 
  4.             float alpha = new BigDecimal(1.0f).subtract(new BigDecimal(offset).multiply(new BigDecimal(2))).floatValue(); 
  5.             if (offset >= 0.4 && offset <= 0.9) { 
  6.                 offset = new BigDecimal(offset).subtract(new BigDecimal( 0.4f)).floatValue(); 
  7.             } else if (offset < 0.4) { 
  8.                 offset = 0.0f; 
  9.             } else { 
  10.                 offset = 1.0f; 
  11.             } 
  12.             setApale(currentPage, targetPage, alpha, offset); 
  13.         } 

到這里我們的豎直引導工具組件就已經封裝好了。

2.2.4 使用組件

如何去使用我們的組件呢?這里我們用的是組件化思想.所以我們呢只需要在我們的項目中引入我們的組件,然后再我們的ablity中集成我們封裝好的VerticalIntroSlice對象就行,最后我們再把封裝一個添加數據的接口,把我們的數據變成動態添加的就行。

三. 結語

到此我們的整個設計流程就完了,通過上面的操作,相信小伙伴們就可以實現應用引導功能了。

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

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

https://harmonyos.51cto.com

 

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

2021-04-23 16:08:08

鴻蒙HarmonyOS應用

2022-11-24 16:11:27

2022-11-23 10:22:12

組件庫前端

2009-02-25 10:14:44

GRE通用路由

2021-10-14 07:28:03

Kubernetes通用排查

2019-08-28 09:27:33

Linux操作系統技術

2012-07-20 11:06:00

JavaJava框架

2011-12-15 21:24:46

應用

2022-08-09 16:01:24

應用開發鴻蒙

2010-03-11 16:50:27

Python應用

2010-02-23 17:54:36

2021-06-22 09:44:56

鴻蒙HarmonyOS應用

2021-06-03 09:36:38

鴻蒙HarmonyOS應用

2024-01-15 06:05:05

DockerGol ang應用程序

2020-03-24 14:21:26

蘋果MaciOS

2011-10-11 10:10:57

2023-12-08 13:19:00

前端Reactour流行庫

2020-11-09 11:56:49

HarmonyOS

2015-10-10 16:31:58

2017-03-13 16:30:50

React Route構建JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲免费在线 | 国产高清在线精品 | 婷婷免费视频 | 欧美日韩一区二区在线 | 国产综合av | 日韩免费在线 | 精品一级毛片 | 欧美一区二区三区高清视频 | 欧美精品乱码久久久久久按摩 | 一个色在线 | 久久国产精品网站 | 一区天堂| 欧美精品久久久久 | 一级片网址 | 91在线精品播放 | 国产精品成人一区二区三区 | 成人免费小视频 | 国产1区在线 | 午夜黄色 | 国产精品美女久久久久aⅴ国产馆 | 国产91在线精品 | 亚洲成人一二区 | 亚洲a一区| 国产欧美二区 | 91精品国产一区二区三区香蕉 | 91精品国产综合久久久久久丝袜 | 精品在线一区 | 久久福利网站 | 2020亚洲天堂| 日韩欧美精品在线播放 | 99热.com| 国产97在线视频 | 看av网址 | 玖玖视频国产 | 天天拍天天色 | 亚洲a网 | 亚洲综合99 | 白浆在线 | 成人国产在线视频 | 国产精品毛片一区二区三区 | 在线观看免费av网 |