国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

[[419721]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

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

https://harmonyos.51cto.com

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

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

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

幾乎所有的App都會(huì)有做一些界面引導(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)容文字不宜太長,適當(dāng)加入一些圖案可以方便用戶理解。言歸正傳吧,開始咱們今天的主題,如何實(shí)現(xiàn)應(yīng)用的引導(dǎo)功能吧!

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

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

開發(fā)準(zhǔn)備

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

2.1 設(shè)計(jì)思路

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

2.2 設(shè)計(jì)步驟

2.2.1 設(shè)計(jì)界面

根據(jù)我們要實(shí)現(xiàn)的功能,我們可以使用PageSlider控件去實(shí)現(xiàn)界面布局文件,實(shí)現(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 添加動(dòng)畫

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

  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后沒有這樣的接口獲取方法,那就得我們自己去考慮怎么實(shí)現(xiàn)呢,我這里的實(shí)現(xiàn)思路是在PageSlider設(shè)置provider的時(shí)候保存所有的子view對(duì)象,然后再使用的時(shí)候拿出子view再進(jìn)行操作。我們這里例子是改變子view的透明度.代碼實(shí)現(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的集合,注意這里是一個(gè)有序集合 
  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 使用組件

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

三. 結(jié)語

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

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

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通用路由

2019-08-28 09:27:33

Linux操作系統(tǒng)技術(shù)

2021-10-14 07:28:03

Kubernetes通用排查

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-03-11 16:50:27

Python應(yīng)用

2010-02-23 17:54:36

2021-06-22 09:44:56

鴻蒙HarmonyOS應(yīng)用

2021-06-03 09:36:38

鴻蒙HarmonyOS應(yīng)用

2024-01-15 06:05:05

DockerGol ang應(yīng)用程序

2020-11-09 11:56:49

HarmonyOS

2020-03-24 14:21:26

蘋果MaciOS

2023-12-08 13:19:00

前端Reactour流行庫

2011-10-11 10:10:57

2017-03-13 16:30:50

React Route構(gòu)建JavaScript

2015-10-10 16:31:58

點(diǎn)贊
收藏

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

亚洲欧美日韩国产yyy| 国产伦一区二区三区色一情| 一不卡在线视频| 粉嫩久久99精品久久久久久夜| 久久人人爽人人| 在线成人视屏| 日韩av中文字幕在线免费观看| 国产一级免费在线观看| 亚洲风情在线资源站| 日本超碰在线观看| 成人av在线看| 成人在线观看毛片| 青青草国产成人99久久| 久久久久久欧美精品色一二三四| 先锋资源久久| 国产日韩精品入口| 久操精品在线| 97精品在线视频| 精品亚洲a∨一区二区三区18| 在线亚洲午夜片av大片| 国产乱码午夜在线视频| 欧美精品日韩精品| 精品av中文字幕在线毛片| 精品久久在线播放| 在线观看麻豆视频| 亚洲韩国一区二区三区| 91精品婷婷国产综合久久性色 | 在线视频国产一区| 三级在线播放| 色综合夜色一区| 国产黄在线看| 欧美中文字幕亚洲一区二区va在线| 最新亚洲人成网站在线观看| 亚洲成人动漫一区| 久草在线网址| 3d动漫精品啪啪一区二区竹菊| 毛片在线播放a| 欧美一级在线观看| 超碰资源在线| 美女av一区二区三区| 大型av综合网站| 国产女人18毛片水18精品| 狠狠色综合网| 日本不卡免费新一二三区| 国产一区二区三区香蕉| 成人免费在线小视频| 亚洲国产激情av| 中文在线a在线| 日韩精品一区二区三区蜜臀| 另类图片综合电影| 久久久免费观看| 欧美在线观看视频一区| 国产一区二区高清视频| 国产主播一区二区| 天堂网在线免费观看| 欧美日韩国产在线播放| 99久久精品免费观看国产| 亚洲无限av看| 亚州国产精品| 国严精品久久久久久亚洲影视| 国产一区二区三区免费播放| 天天操天天爱天天爽| 欧美日韩色婷婷| 呦呦在线视频| 国内精品美女av在线播放| 欧美黄色一区| 国产va亚洲va在线va| 亚洲综合免费观看高清完整版在线 | 亚洲黄色在线| 国产精品久久网| 精品日韩视频| 国产一区在线观看麻豆| 日韩欧美黄色大片| 亚洲成人黄色影院| 国产不卡人人| 91精品91久久久久久| 91精品国产自产在线观看永久∴| 亚洲一区二区三区四区中文| 国产精品免费看片| 91在线中文| 欧美伊久线香蕉线新在线| 午夜在线观看免费一区| 欧美日韩在线观看不卡| 精品少妇一区二区三区日产乱码| 国产亚洲精品美女久久| 免费影院在线观看一区| 中文字幕一区在线观看| free性m.freesex欧美| 国产精品久久久久久影视| 黑人巨大精品欧美黑白配亚洲| 免费观看黄色网| 综合激情国产一区| 免费看涩涩视频| 欧美日韩精品欧美日韩精品| 57pao成人永久免费| 精品无人区一区二区三区竹菊 | 一区二区三区不卡在线| 一个色免费成人影院| 91人成网站www| www.日韩在线| 天天综合天天操| 亚洲免费色视频| 欧美激情二区| 国产午夜精品理论片a级探花| 黄色小视频在线免费观看| 日韩二区三区在线| 亚洲毛片在线免费| 欧美高清在线观看| 日韩欧美中文字幕一区二区三区| 久久久精品免费视频| 婷婷亚洲图片| 成年在线观看视频| 精品成人乱色一区二区| 欧美性爽视频| 欧洲s码亚洲m码精品一区| 99精品国产高清一区二区麻豆| 色多多国产成人永久免费网站 | 激情六月丁香婷婷| 91精品欧美久久久久久动漫| blacked蜜桃精品一区| 久久久久久久久久久免费视频| 亚洲高清一二三区| 免费在线成人| 国产精品免费观看| 91在线视频成人| 欧美色xxxx| 欧美成人自拍| 先锋av资源在线| 国产精品一区二区久久久久| 日本护士...精品国| 国产精品高潮呻吟久久av无限 | 久久国产精品免费观看| 日韩精品一区二区三区视频播放| 久久成人一区| 欧美色图天堂| 欧美xxxx黑人又粗又长密月| 91精品国产欧美一区二区成人| 亚洲精品资源| 天天干狠狠干| 亚洲 欧美 综合 另类 中字| 欧美成人精品xxx| 成人一区二区三区视频在线观看| 亚洲精品日韩一| 国产在线播放精品| 久草综合在线观看| 久久精品中文字幕免费mv| 国产精品538一区二区在线| 国产精品—色呦呦| 国产人妻人伦精品| 美女性感视频久久久| 国产精品乱子久久久久| 精品亚洲成人| 国产在线一二三区| 鲁鲁狠狠狠7777一区二区| 亚洲成人黄色网址| 99久久精品免费精品国产| 欧美一级二级三级视频| 午夜黄色在线观看| 免费试看一区| 在线性视频日韩欧美| 亚洲欧美日韩国产手机在线| 狠狠入ady亚洲精品经典电影| 日本aa在线| 欧美 日本 亚洲| 国产成人欧美在线观看| 欧美日韩免费在线视频| 国产在线不卡一卡二卡三卡四卡| 96sao精品免费视频观看| 一级特黄视频| 色综合666| 欧美乱人伦中文字幕在线| 亚洲综合视频网| 亚洲久久视频| 欧美另类激情| h网址在线观看| 欧美精品在线一区| 久久久久北条麻妃免费看| 亚洲综合色婷婷| 日韩电影一区二区三区四区| 亚洲日本va午夜在线电影| 国产二区在线播放| 免费观看国产精品视频| 国产精品嫩草影院久久久| 亚洲激情电影中文字幕| 亚洲人精品午夜| 奇米综合一区二区三区精品视频| 一区二区三区亚洲变态调教大结局| 日韩大胆视频| 无罩大乳的熟妇正在播放| 国产精品久久久久久久午夜 | 欧美一区二区私人影院日本| 99久免费精品视频在线观看| 日韩电影免费网站| 成人勉费视频| 日韩资源在线| 亚洲精品99999| a在线播放不卡| 综合激情在线| 日本亚洲视频| 高清毛片在线观看|