精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HarmonyOS 自定義組件之上拉抽屜

開發(fā) OpenHarmony
這里給大家提供了一個BottomSheet上拉抽屜的組件,同時通過這個組件示例講解一下HarmonyOS中的幾個自定義控件用到的知識,分享一下自己自定義組件的思路。

[[441431]]

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

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

https://harmonyos.51cto.com

簡介

HarmonyOS 開發(fā)自定義組件目前還不是很豐富,在開發(fā)過程中常常會有一些特殊效果的組件,這就需要我們額外花一些時間實現(xiàn),這里給大家提供了一個BottomSheet上拉抽屜的組件,同時通過這個組件示例講解一下HarmonyOS中的幾個自定義控件用到的知識,分享一下自己自定義組件的思路。

效果演示

#星光計劃2.0# HarmonyOS 自定義組件之上拉抽屜-鴻蒙HarmonyOS技術(shù)社區(qū)

實現(xiàn)思路

1.布局設(shè)計

選擇的是相對布局,蒙層區(qū)來改變內(nèi)容區(qū)隨著抽屜的位置調(diào)節(jié)透明度。

圖1:

#星光計劃2.0# HarmonyOS 自定義組件之上拉抽屜-鴻蒙HarmonyOS技術(shù)社區(qū)
[[441433]]

 

2.手勢判斷

先得出Component在屏幕的上下左右的坐標(biāo),然后手指的坐標(biāo)是否在Component內(nèi)。

  1. /** 
  2.  * (x,y)是否在view的區(qū)域內(nèi) 
  3.  * 
  4.  * @param component 
  5.  * @param x 
  6.  * @param y 
  7.  * @return 
  8.  */ 
  9. private boolean isTouchPointInComponent(Component component, float x, float y) { 
  10.     int[] locationOnScreen = component.getLocationOnScreen(); 
  11.     int left = locationOnScreen[0]; 
  12.     int top = locationOnScreen[1]; 
  13.     int right = left + component.getEstimatedWidth(); 
  14.     int bottom = top + component.getEstimatedHeight(); 
  15.     boolean inY = y >= top && y <= bottom; 
  16.     boolean inX = x >= left && x <= right
  17.     return inY && inX; 

3.抽屜偏移

  • 這里采用的是整個component對Touch事件的監(jiān)聽;
  • 手指按下的判斷是否在抽屜上,然后記錄當(dāng)前觸摸y坐標(biāo);
  • 移動是算出偏移量offY;
  1. setTouchEventListener(new TouchEventListener() { 
  2.     @Override 
  3.     public boolean onTouchEvent(Component component, TouchEvent touchEvent) { 
  4.         HiLog.info(logLabel, "onTouchEvent action:" + touchEvent.getAction()); 
  5.         switch (touchEvent.getAction()) { 
  6.             case TouchEvent.PRIMARY_POINT_DOWN: 
  7.                 marginBottom = directionalLayout.getMarginBottom(); 
  8.                 MmiPoint position = touchEvent.getPointerScreenPosition(0); 
  9.                 if (isTouchPointInComponent(directionalLayout, position.getX(), position.getY())) { 
  10.                     dragStartPointY = touchEvent.getPointerPosition(0).getY(); 
  11.                     return true
  12.                 } 
  13.                 break; 
  14.             case TouchEvent.PRIMARY_POINT_UP: 
  15.                 onTouchUp(); 
  16.                 break; 
  17.             case TouchEvent.POINT_MOVE: 
  18.                 float y = touchEvent.getPointerPosition(0).getY(); 
  19.                 float offY = dragStartPointY - y; 
  20.                 setDrawerMarginBottom((int) offY); 
  21.                 break; 
  22.         } 
  23.         return false
  24.     } 
  25. }); 

根據(jù)偏移量改變抽屜的位置;

  1. private void setDrawerMarginBottom(int offY) { 
  2.     int bottom = marginBottom + offY; 
  3.     if (bottom > 0) { 
  4.         bottom = 0; 
  5.         listContainer.setEnabled(true); 
  6.     } 
  7.  
  8.     if (bottom < -H / 2) { 
  9.         bottom = -H / 2; 
  10.     } 
  11.     HiLog.info(logLabel, "setDrawerMarginBottom bottom:" + bottom); 
  12.  
  13.     float alpha = (0.5f - Math.abs((float) bottom / (float) H)) * 0.5f; 
  14.     HiLog.info(logLabel, "setDrawerMarginBottom alpha:" + alpha); 
  15.     bgComponent.setAlpha(alpha); 
  16.     directionalLayout.setMarginBottom(bottom); 

4.事件沖突解決

首先發(fā)現(xiàn)不能按安卓的思想去處理:

  • HarmonyOS中是沒有事件分發(fā)這概念的,只有事件消費,ListContainer先拿到事件,然后是抽屜布局;
  • 根據(jù)抽屜在完全展開的位置,在ListContainer收到觸摸事件時,把ListContainer事件靜止掉,不讓其消費;
  • 待抽屜完全展開時,解開ListContainer的事件;
  1. listContainer.setTouchEventListener(new TouchEventListener() { 
  2.     @Override 
  3.     public boolean onTouchEvent(Component component, TouchEvent touchEvent) { 
  4.         marginBottom = directionalLayout.getMarginBottom(); 
  5.         boolean drag_down = listContainer.canScroll(DRAG_DOWN); 
  6.         boolean drag_UP = listContainer.canScroll(DRAG_UP); 
  7.         if (marginBottom == 0 && drag_down) { 
  8.             component.setEnabled(true); 
  9.             return true
  10.         } 
  11.         component.setEnabled(false); 
  12.         return false
  13.     } 
  14. }); 

這里是抽屜容器定位抽屜時,判斷是否打開ListContainer事件。

  1. private void setDrawerMarginBottom(int offY) { 
  2.     int bottom = marginBottom + offY; 
  3.     if (bottom > 0) { 
  4.         bottom = 0; 
  5.         listContainer.setEnabled(true); 
  6.     } 
  7.     ....... 

5.背景亮暗變化

  • 首先我們XML布局參照上述布局設(shè)計—圖1;
  • 背景亮暗的改變根據(jù)抽屜位置按比例設(shè)置蒙層的透明度;
  1. float alpha = (0.5f - Math.abs((float) bottom / (float) H)) * 0.5f; 
  2. bgComponent.setAlpha(alpha); 

6.回彈效果

運用到了數(shù)值動畫,在手勢抬起時,判斷上下臨界點決定動畫的上下。

  1. private void onTouchUp() { 
  2.     HiLog.info(logLabel, "onTouchUp"); 
  3.     createAnimator(); 
  1. private void createAnimator() { 
  2.     marginBottom = directionalLayout.getMarginBottom(); 
  3.     HiLog.info(logLabel, "createAnimator marginBottom:" + marginBottom); 
  4.     //創(chuàng)建數(shù)值動畫對象 
  5.     AnimatorValue animatorValue = new AnimatorValue(); 
  6.     //動畫時長 
  7.     animatorValue.setDuration(300); 
  8.     //播放前的延遲時間 
  9.     animatorValue.setDelay(0); 
  10.     //循環(huán)次數(shù) 
  11.     animatorValue.setLoopedCount(0); 
  12.     //動畫的播放類型 
  13.     animatorValue.setCurveType(Animator.CurveType.ACCELERATE_DECELERATE); 
  14.     //設(shè)置動畫過程 
  15.     animatorValue.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() { 
  16.         @Override 
  17.         public void onUpdate(AnimatorValue animatorValue, float value) { 
  18.             HiLog.info(logLabel, "createAnimator value:" + value); 
  19.             if (marginBottom > -H / 4) { // top 
  20.                 HiLog.info(logLabel, "createAnimator top:" + value); 
  21.                 setDrawerBottomOrToP((int) (marginBottom - value * marginBottom)); 
  22.             } else { // bottom 
  23.                 HiLog.info(logLabel, "createAnimator bottom:" + value); 
  24.                 int top = H / 2 + marginBottom; 
  25.                 setDrawerBottomOrToP((int) (marginBottom - value *top)); 
  26.             } 
  27.         } 
  28.     }); 
  29.     //開始啟動動畫 
  30.     animatorValue.start(); 
  1. private void setDrawerBottomOrToP(int bottom) { 
  2.     if (bottom > 0) { 
  3.         bottom = 0; 
  4.         listContainer.setEnabled(true); 
  5.     } 
  6.  
  7.     if (bottom < -H / 2) { 
  8.         bottom = -H / 2; 
  9.     } 
  10.   
  11.     float alpha = (0.5f - Math.abs((float) bottom / (float) H)) * 0.5f; 
  12.  
  13.     bgComponent.setAlpha(alpha); 
  14.     directionalLayout.setMarginBottom(bottom); 

總結(jié)

自定義組件步驟及思考方向:

明確父容器和子view的關(guān)系;

如何繪制一般采用以下三個方向:

  1. 已有控件組合;
  2. 采用畫布繪制等;
  3. 繼承控件擴展功能;

若涉及到觸摸事件,需要考慮如何處理事件分發(fā)與消費;

動畫選擇,可根據(jù)需求選擇合適動畫(本文采用屬性動畫);

計算問題,復(fù)雜的需要豐富的數(shù)學(xué)知識;

性能問題(過度計算,重復(fù)繪制,對象重復(fù)創(chuàng)建)。

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

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

https://harmonyos.51cto.com

 

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

2022-04-24 15:17:56

鴻蒙操作系統(tǒng)

2023-02-20 15:20:43

啟動頁組件鴻蒙

2021-11-01 10:21:36

鴻蒙HarmonyOS應(yīng)用

2022-07-15 16:45:35

slider滑塊組件鴻蒙

2022-06-30 14:02:07

鴻蒙開發(fā)消息彈窗組件

2021-09-15 10:19:15

鴻蒙HarmonyOS應(yīng)用

2022-10-26 15:54:46

canvas組件鴻蒙

2022-10-25 15:12:24

自定義組件鴻蒙

2022-07-06 20:24:08

ArkUI計時組件

2022-06-20 15:43:45

switch開關(guān)鴻蒙

2022-02-21 15:16:30

HarmonyOS鴻蒙操作系統(tǒng)

2021-11-22 10:00:33

鴻蒙HarmonyOS應(yīng)用

2022-02-16 16:09:12

鴻蒙游戲操作系統(tǒng)

2021-12-24 15:46:23

鴻蒙HarmonyOS應(yīng)用

2022-07-12 16:56:48

自定義組件鴻蒙

2022-02-16 15:25:31

JS代碼Canvas鴻蒙

2022-06-23 07:23:34

自定義組件計時器

2025-09-22 08:03:34

2021-01-11 11:36:23

鴻蒙HarmonyOSApp開發(fā)

2009-06-24 15:13:36

自定義JSF組件
點贊
收藏

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

久久久久毛片免费观看| 欧美一区1区三区3区公司| 熟女熟妇伦久久影院毛片一区二区| 超碰在线公开97| 老熟妇高潮一区二区高清视频 | 91精品久久久久久久久久久久久| 国产人妻黑人一区二区三区| 午夜激情视频在线| 久久99久久人婷婷精品综合| 亚洲午夜视频在线| 92福利视频午夜1000合集在线观看 | 性国产高清在线观看| 免费精品99久久国产综合精品| 亚洲国产精品热久久| 400部精品国偷自产在线观看| 在线观看国产精品视频| 欧洲激情综合| 欧美三级电影在线观看| 相泽南亚洲一区二区在线播放 | 青青影院在线观看| 日本aⅴ免费视频一区二区三区| 精品视频久久久| 大j8黑人w巨大888a片| 二区三区在线视频| 久久国产精品99久久久久久老狼| 在线中文字幕日韩| 天天爽天天爽夜夜爽| 国产综合视频一区二区三区免费| 久久高清国产| 亚洲午夜久久久影院| 中文字幕乱码人妻综合二区三区| 日本视频在线观看一区二区三区 | 欧美国产日韩一区| 国内av免费观看| 欧美videosex性极品hd| 国产suv精品一区二区三区| 欧美激情视频一区| 欧美一级特黄高清视频| 精品99re| 欧美日本一道本| 福利在线小视频| 亚洲va欧美va| 性娇小13――14欧美| 一本色道久久88精品综合| 色乱码一区二区三区在线| 免费在线毛片网站| 欧美激情一二三区| 91pron在线| 国产精品午夜影院| 日本a级不卡| 日韩免费观看高清完整版| 阿v天堂2017| bbbbbbbbbbb在线视频| 韩国视频一区二区| 性欧美办公室18xxxxhd| 微拍福利一区二区| 日韩一区二区三区精品视频第3页| 午夜久久久久久久久| 亚洲高清在线观看一区| 亚洲av无码专区在线| 国产精品1区2区3区| 欧美在线激情网| 老熟妻内射精品一区| 四虎884aa成人精品最新| 欧美男生操女生| 亚洲国产精品久久久久婷蜜芽| av在线电影播放| 中文在线一区二区| 精品国产中文字幕| 国产女同91疯狂高潮互磨| 99精品国产福利在线观看免费| 在线性视频日韩欧美| 无码少妇精品一区二区免费动态| av一区二区在线观看| 中文字幕久热精品视频在线| 无码人妻精品中文字幕| 欧美精选在线| 伊人久久五月天| 懂色av蜜臀av粉嫩av永久| 日韩深夜福利| 亚洲一区二区久久| 国产老头老太做爰视频| 好看的日韩av电影| 日韩一区二区久久久| 精品夜夜澡人妻无码av| 秋霞影院一区| 亚洲精品国精品久久99热一| 亚洲精品成人无码| 老司机凹凸av亚洲导航| 欧美一区在线视频| 香蕉视频禁止18| 精品视频在线播放一区二区三区| 日韩欧美色综合网站| 黄色片视频免费观看| 人人爱人人干婷婷丁香亚洲| 亚洲国产精品成人精品| 中文字幕第10页| 欧美亚洲色图校园春色| 亚洲成人久久一区| 久久久久亚洲av无码a片| 欧美激情第二页| 久色乳综合思思在线视频| 黄色免费一级视频| 国产一区二区亚洲| 亚洲视屏在线播放| 最近中文字幕免费视频| 亚洲亚洲免费| 亚洲人成网站免费播放| 日韩三级在线观看视频| 国产精品呻吟| 97精品伊人久久久大香线蕉| 无码一区二区三区在线观看| 天堂影院一区二区| 国产精品扒开腿做爽爽爽的视频| 成人在线免费看视频| 国产欧美成人| 亚洲www在线观看| 国产免费a∨片在线观看不卡| 久久久噜噜噜久噜久久综合| 欧美日韩一区二区视频在线观看| 免费黄色在线视频网站| 国产拍欧美日韩视频二区| 成人精品视频在线播放| 激情国产在线| 欧美日韩亚洲激情| 熟女少妇精品一区二区| 国产精品videossex撒尿| 欧美亚洲丝袜传媒另类| 91小视频在线播放| 97超碰成人| 精品国产人成亚洲区| 插我舔内射18免费视频| 亚洲网色网站| 午夜精品一区二区三区在线视频| 99久久精品国产成人一区二区| 国产欧美一区二区精品性色| 久久综合色视频| 加勒比中文字幕精品| 欧美极品美女电影一区| 婷婷激情五月网| www.久久久久久久久| 欧美在线视频一区二区三区| 嗯啊主人调教在线播放视频| 亚洲第一区在线观看| 久久亚洲av午夜福利精品一区| 国产亚洲激情| 精品视频一区在线| 美女的胸无遮挡在线观看 | 在线免费看毛片| 国产精品私人自拍| 污污的视频免费| jizz性欧美23| 欧美激情免费看| 天天干视频在线| 国产精品久久久久久久第一福利 | 黄色av免费在线| 午夜精品福利久久久| 亚洲香蕉中文网| 久久精品高清| 91精品国产九九九久久久亚洲| 亚洲av综合一区| 成人午夜免费视频| 亚洲欧美日韩另类精品一区二区三区| 三级成人在线| 欧美精品一区二区三区四区| 日本三级视频在线| 久久99久久99| 致1999电视剧免费观看策驰影院| 蜜桃视频在线观看播放| 日韩av在线免费| 欧美丰满熟妇bbbbbb| 久久综合婷婷| 一级做a爰片久久| 亚洲欧美一区二区三区| 日韩一区二区在线播放| 老头老太做爰xxx视频| 美女爽到高潮91| 米仓穗香在线观看| 美女主播精品视频一二三四| 国产91久久婷婷一区二区| 欧美 日韩 国产 成人 在线| 中文字幕亚洲不卡| 日本新janpanese乱熟| 99久久99久久精品国产片桃花| 欧美一级大片在线观看| 狠狠躁夜夜躁av无码中文幕| 欧美性猛交丰臀xxxxx网站| 午夜福利三级理论电影| 一区二区蜜桃| 久久久99爱| 九色porny丨国产首页在线| 亚洲深夜福利在线| 国产福利资源在线| 亚洲欧美电影一区二区| 亚洲高清免费在线观看| 91久久视频| 国产精品久久久久久久天堂第1集| 黄色网在线免费看| 日韩av资源在线播放| 91好色先生tv| 国产精品成人一区二区三区夜夜夜| 麻豆传媒在线看| 欧美日韩国产在线一区| 欧美日韩综合久久| 亚洲国产高清在线观看| 国产成人精品在线观看| 欧美日韩激情视频一区二区三区| 91.com视频| 欧美日韩国产精品一区二区三区 | 99国产精品免费视频| 视频一区在线播放| 国产高清www| 国产高清一区| 日产精品高清视频免费| 国产日韩电影| 一区二区三区在线播放欧美| 成人精品在线播放| 91精品国产高清一区二区三区| 国产主播第一页| 中文字幕第一页久久| 波多野结衣影院| 国产成人精品三级麻豆| 免费看涩涩视频| 日韩一区精品视频| 日产精品高清视频免费| 日韩中文av| 激情五月综合色婷婷一区二区 | 一级片一级片一级片| 中文字幕免费不卡| xxx在线播放| 91麻豆高清视频| 91n.com在线观看| 午夜亚洲视频| 69堂免费视频| 夜夜嗨一区二区| 人妻夜夜添夜夜无码av| 九九热爱视频精品视频| 国产日本一区二区三区| 成人精品电影在线| 国产91在线视频| 亚洲最大网站| 日本精品免费观看| 美女日韩欧美| 国产99久久精品一区二区| 周于希免费高清在线观看| 日本精品久久电影| 欧洲亚洲两性| 欧美大胆a视频| 三级av在线| 亚洲欧美日韩网| 国产乱淫a∨片免费观看| 懂色av中文一区二区三区天美| 欧洲第一无人区观看| 亚洲黄色免费网站| 国产熟女一区二区| 国产日韩精品一区二区三区 | 一级特黄免费视频| 欧日韩精品视频| 久久亚洲AV无码| 五月婷婷色综合| 亚洲天堂av片| 欧美午夜在线一二页| 91九色蝌蚪91por成人| 91麻豆精品国产91久久久久久| 国产成a人亚洲精v品无码| 精品三级av在线| 亚洲天堂网视频| 91精品在线观看入口| 亚洲精品成人电影| 亚洲男人天堂2019| 蜜桃视频在线观看www社区| 欧美日韩高清区| 尤物视频在线免费观看| 久热精品视频在线观看一区| ****av在线网毛片| 久久国产精品久久国产精品| 免费毛片在线看片免费丝瓜视频 | 日本久久久精品视频| 日韩高清在线不卡| 中文字幕在线视频一区二区| 菠萝蜜视频在线观看一区| 午夜av中文字幕| 日本中文字幕一区二区有限公司| 中文字幕免费高清在线| 成熟亚洲日本毛茸茸凸凹| www在线观看免费视频| 亚洲日韩欧美一区二区在线| 丰满的亚洲女人毛茸茸| 久久色在线观看| 免费a在线观看播放| 国产精品视频免费| 国产欧美一区二区三区在线观看视频| 亚洲欧美一区二区视频| 五月天婷婷综合网| 亚洲va欧美va天堂v国产综合| 欧美一区免费看| 日韩免费电影网站| av在线电影播放| 97视频com| 日本免费一区二区三区视频| 蜜桃91精品入口| 亚洲另类春色校园小说| 天天做天天爱天天高潮| 麻豆精品网站| 亚洲av午夜精品一区二区三区| 国产激情一区二区三区四区| 91网站免费入口| 亚洲国产精品视频| 日韩欧美三级视频| 正在播放亚洲一区| 国产日本在线观看| 欧美与黑人午夜性猛交久久久| 精品视频一区二区三区| 亚洲精品国产一区| 久久成人一区| 国产高清自拍视频| 亚洲午夜电影网| 精品国产无码AV| 亚洲国产精品高清久久久| 九七电影韩国女主播在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 中文久久电影小说| 精品国产一区二区三| 欧美日韩国产高清| 欧美日韩理论片| 国产精品少妇自拍| 免费黄色一级大片| 亚洲免费中文字幕| 松下纱荣子在线观看| 国内一区在线| 伊人精品视频| 精品久久久噜噜噜噜久久图片| 波多野结衣精品在线| 麻豆影视在线播放| 日韩欧美不卡一区| 视频在线观看入口黄最新永久免费国产 | 国产成人一区在线| 麻豆明星ai换脸视频| 51精品久久久久久久蜜臀| 色网站在线看| 国产在线视频不卡| 91精品国产调教在线观看| 久久成人福利视频| 高清视频一区二区| 国产真实乱偷精品视频| 91传媒视频在线播放| 国产三级午夜理伦三级| 久久精品国产视频| 天堂av中文在线观看| 久久99精品久久久久子伦| 99在线观看免费视频精品观看| 99re这里只有| 狠狠久久五月精品中文字幕| 青草久久伊人| 国产精品激情av电影在线观看 | 亚洲视频精选| 亚洲精品无码国产| 91亚洲资源网| 国产一区二区三区在线视频观看| 69精品人人人人| 色呦呦在线播放| 精品麻豆av| 手机精品视频在线观看| 国产wwwwxxxx| 日韩欧美国产wwwww| 中文在线а√天堂| 亚洲v国产v| 国产成人午夜99999| 在线观看亚洲欧美| 最近2019中文字幕一页二页| 麻豆网站免费在线观看| 日本一区二区免费看| 美腿丝袜在线亚洲一区| 黄色一级片中国| 亚洲精品乱码久久久久久金桔影视| 天天综合网天天| 黄黄视频在线观看| 91麻豆免费观看| 国产精品久久久久久免费免熟| 久久久免费在线观看| 国产精品亚洲欧美一级在线| 欧美日韩无遮挡| 精品在线免费观看| 国产做受高潮漫动| 日日骚久久av| 美女视频亚洲色图| 亚洲日本黄色片| 欧美午夜性色大片在线观看| 色综合久久久久综合一本到桃花网| 高清av免费一区中文字幕| 天天插综合网| 黄色免费看视频| 欧美日韩精品是欧美日韩精品| 国产第一页在线| 成人三级在线| 久久人人精品| 久久久久久久久久久久国产| 一区二区三区在线播放欧美| 国产精品久久久久av蜜臀| 免费拍拍拍网站|