自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HarmonyOS 通用的應(yīng)用引導(dǎo)功能

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

[[419721]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

手機APP的引導(dǎo)頁是一個常見的功能,今天和大家一起分享在鴻蒙系統(tǒng)的擼引導(dǎo)頁代碼的經(jīng)驗。

一.應(yīng)用引導(dǎo)頁的功能

1.1為什么要做應(yīng)用的引導(dǎo)功能?

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

1.2通用的功能性引導(dǎo)大概分哪些呢?

主功能引導(dǎo)、新功能引導(dǎo)和功能轉(zhuǎn)移或改名引導(dǎo)。

1.3.通用的應(yīng)用引導(dǎo),需要注意哪些?

引導(dǎo)的內(nèi)容文字不宜太長,適當加入一些圖案可以方便用戶理解。言歸正傳吧,開始咱們今天的主題,如何實現(xiàn)應(yīng)用的引導(dǎo)功能吧!

二.實現(xiàn)應(yīng)用的引導(dǎo)功能具體步驟:

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

開發(fā)準備

搭建鴻蒙開發(fā)環(huán)境,這里就不做介紹了,如果沒有環(huán)境沒有搭建好的同學(xué)可以進入學(xué)習(xí)安裝環(huán)境, 安裝好環(huán)境以后接下來我們就可以進行開發(fā)工作了。

2.1 設(shè)計思路

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

2.2 設(shè)計步驟

2.2.1 設(shè)計界面

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

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

(1)添加數(shù)據(jù)、初始化數(shù)據(jù)

  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)設(shè)置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的上彈和下彈操作,上彈和下彈是和我們手指滑動的方向是有關(guān)系的,所以這里我們必須實現(xiàn)手指的觸摸事件,在觸摸事件中獲取我們手機滑動的距離,如果距離大于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設(shè)置動畫.動畫用的是屬性動畫,屬性動畫大體實現(xiàn)是初始化動畫,設(shè)置動畫持續(xù)時間,實現(xiàn)動畫屬性值變化監(jiān)聽事件,最后啟動動畫。大體代碼如下:

  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的操作監(jiān)聽接口,查看api后沒有這樣的接口獲取方法,那就得我們自己去考慮怎么實現(xiàn)呢,我這里的實現(xiàn)思路是在PageSlider設(shè)置provider的時候保存所有的子view對象,然后再使用的時候拿出子view再進行操作。我們這里例子是改變子view的透明度.代碼實現(xiàn)如下:

(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.         } 

到這里我們的豎直引導(dǎo)工具組件就已經(jīng)封裝好了。

2.2.4 使用組件

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

三. 結(jié)語

到此我們的整個設(shè)計流程就完了,通過上面的操作,相信小伙伴們就可以實現(xiàn)應(yīng)用引導(dǎo)功能了。

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-04-23 16:08:08

鴻蒙HarmonyOS應(yīng)用

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操作系統(tǒng)技術(shù)

2012-07-20 11:06:00

JavaJava框架

2011-12-15 21:24:46

應(yīng)用

2022-08-09 16:01:24

應(yīng)用開發(fā)鴻蒙

2010-02-23 17:54:36

2010-03-11 16:50:27

Python應(yīng)用

2024-01-15 06:05:05

DockerGol ang應(yīng)用程序

2020-03-24 14:21:26

蘋果MaciOS

2023-12-08 13:19:00

前端Reactour流行庫

2021-06-22 09:44:56

鴻蒙HarmonyOS應(yīng)用

2021-06-03 09:36:38

鴻蒙HarmonyOS應(yīng)用

2011-10-11 10:10:57

2015-10-10 16:31:58

2017-03-13 16:30:50

React Route構(gòu)建JavaScript

2015-08-20 09:00:48

紅帽Linux容器開源
點贊
收藏

51CTO技術(shù)棧公眾號