RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

HarmonyOS 中的幾個自定義控件介紹

OpenHarmony技術社區(qū) ? 來源:HarmonyOS技術社區(qū) ? 作者:HarmonyOS技術社區(qū) ? 2022-01-04 13:49 ? 次閱讀

HarmonyOS 開發(fā)自定義組件目前還不是很豐富,在開發(fā)過程中常常會有一些特殊效果的組件,這就需要我們額外花一些時間實現(xiàn)。

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

效果演示如下圖:

實現(xiàn)思路

①布局設計

選擇的是相對布局,蒙層區(qū)來改變內容區(qū)隨著抽屜的位置調節(jié)透明度。如圖 1:

②手勢判斷

先得出 Component 在屏幕的上下左右的坐標,然后手指的坐標是否在 Component 內。

/**
*(x,y)是否在view的區(qū)域內
*
*@paramcomponent
*@paramx
*@paramy
*@return
*/
privatebooleanisTouchPointInComponent(Componentcomponent,floatx,floaty){
int[]locationOnScreen=component.getLocationOnScreen();
intleft=locationOnScreen[0];
inttop=locationOnScreen[1];
intright=left+component.getEstimatedWidth();
intbottom=top+component.getEstimatedHeight();
booleaninY=y>=top&&y<=?bottom;
????boolean?inX?=?x?>=left&&x<=?right;
????return?inY?&&?inX;
}

③抽屜偏移

步驟如下:

這里采用的是整個 component 對 Touch 事件的監(jiān)聽。

手指按下的判斷是否在抽屜上,然后記錄當前觸摸 y 坐標。

移動是算出偏移量 offY。

setTouchEventListener(newTouchEventListener(){
@Override
publicbooleanonTouchEvent(Componentcomponent,TouchEventtouchEvent){
HiLog.info(logLabel,"onTouchEventaction:"+touchEvent.getAction());
switch(touchEvent.getAction()){
caseTouchEvent.PRIMARY_POINT_DOWN:
marginBottom=directionalLayout.getMarginBottom();
MmiPointposition=touchEvent.getPointerScreenPosition(0);
if(isTouchPointInComponent(directionalLayout,position.getX(),position.getY())){
dragStartPointY=touchEvent.getPointerPosition(0).getY();
returntrue;
}
break;
caseTouchEvent.PRIMARY_POINT_UP:
onTouchUp();
break;
caseTouchEvent.POINT_MOVE:
floaty=touchEvent.getPointerPosition(0).getY();
floatoffY=dragStartPointY-y;
setDrawerMarginBottom((int)offY);
break;
}
returnfalse;
}
});

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

privatevoidsetDrawerMarginBottom(intoffY){
intbottom=marginBottom+offY;
if(bottom>0){
bottom=0;
listContainer.setEnabled(true);
}

if(bottom

④事件沖突解決

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

HarmonyOS 中是沒有事件分發(fā)這概念的,只有事件消費,ListContainer 先拿到事件,然后是抽屜布局。

根據(jù)抽屜在完全展開的位置,在 ListContainer 收到觸摸事件時,把 ListContainer 事件靜止掉,不讓其消費。

待抽屜完全展開時,解開 ListContainer 的事件。

listContainer.setTouchEventListener(newTouchEventListener(){
@Override
publicbooleanonTouchEvent(Componentcomponent,TouchEventtouchEvent){
marginBottom=directionalLayout.getMarginBottom();
booleandrag_down=listContainer.canScroll(DRAG_DOWN);
booleandrag_UP=listContainer.canScroll(DRAG_UP);
if(marginBottom==0&&drag_down){
component.setEnabled(true);
returntrue;
}
component.setEnabled(false);
returnfalse;
}
});

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

privatevoidsetDrawerMarginBottom(intoffY){
intbottom=marginBottom+offY;
if(bottom>0){
bottom=0;
listContainer.setEnabled(true);
}
.......
}

⑤背景亮暗變化

首先我們 XML 布局參照上述布局設計—如圖 1。背景亮暗的改變根據(jù)抽屜位置按比例設置蒙層的透明度。

floatalpha=(0.5f-Math.abs((float)bottom/(float)H))*0.5f;
bgComponent.setAlpha(alpha);

⑥回彈效果

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

privatevoidonTouchUp(){
HiLog.info(logLabel,"onTouchUp");
createAnimator();
}

privatevoidcreateAnimator(){
marginBottom=directionalLayout.getMarginBottom();
HiLog.info(logLabel,"createAnimatormarginBottom:"+marginBottom);
//創(chuàng)建數(shù)值動畫對象
AnimatorValueanimatorValue=newAnimatorValue();
//動畫時長
animatorValue.setDuration(300);
//播放前的延遲時間
animatorValue.setDelay(0);
//循環(huán)次數(shù)
animatorValue.setLoopedCount(0);
//動畫的播放類型
animatorValue.setCurveType(Animator.CurveType.ACCELERATE_DECELERATE);
//設置動畫過程
animatorValue.setValueUpdateListener(newAnimatorValue.ValueUpdateListener(){
@Override
publicvoidonUpdate(AnimatorValueanimatorValue,floatvalue){
HiLog.info(logLabel,"createAnimatorvalue:"+value);
if(marginBottom>-H/4){//top
HiLog.info(logLabel,"createAnimatortop:"+value);
setDrawerBottomOrToP((int)(marginBottom-value*marginBottom));
}else{//bottom
HiLog.info(logLabel,"createAnimatorbottom:"+value);
inttop=H/2+marginBottom;
setDrawerBottomOrToP((int)(marginBottom-value*top));
}
}
});
//開始啟動動畫
animatorValue.start();
}

privatevoidsetDrawerBottomOrToP(intbottom){
if(bottom>0){
bottom=0;
listContainer.setEnabled(true);
}

if(bottom
 

總結

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

明確父容器和子 view 的關系。

如何繪制一般采用以下三個方向:已有控件組合;采用畫布繪制等;繼承控件擴展功能。

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

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

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

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

代碼地址:

https://gitee.com/guangdong-wangduoyu/touch-event-demo

原文標題:HarmonyOS“上拉抽屜”效果實現(xiàn)!

文章出處:【微信公眾號:HarmonyOS技術社區(qū)】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 安卓
    +關注

    關注

    5

    文章

    2126

    瀏覽量

    57144
  • HarmonyOS
    +關注

    關注

    79

    文章

    1973

    瀏覽量

    30139

原文標題:HarmonyOS“上拉抽屜”效果實現(xiàn)!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    LabVIEW如何制作漂亮的自定義控件(按鈕)

    :使用LabVIEW制作自定義控件1、打開LabVIEW8.6,新建【自定義控件】,如圖:2、在前面板添加
    發(fā)表于 01-06 11:22

    LabVIEW自定義控件

    首先看下面的 這個例 子:這個程序可以做出一些 動畫的 效果,其實實現(xiàn)起來是十分簡單的。主要的工作就是將布爾控件和滑動桿控件做了自定義 的處理 。我們在具體的程序,也可以使用
    發(fā)表于 01-07 10:57

    LabVIEW自定義控件的好處是什么?

    如上圖是一個狀態(tài)機的獲取隊列引用。最左邊是枚舉的自定義類型控件。如果不用自定義枚舉控件只用枚舉應該也是同樣的效果。那為什么要用自定義枚舉
    發(fā)表于 05-13 07:57

    2.1 sc界面-自定義控件

    自定義控件很多時候在前面板上都需要自定義控件,我們介紹下操作步驟:第一步:新建一個自定義
    發(fā)表于 08-29 06:45

    LabVIEW制作的漂亮自定義控件

    LabVIEW制作的漂亮自定義控件文檔介紹
    發(fā)表于 07-29 16:25

    講解一下HarmonyOS幾個自定義組件用到的知識

    開發(fā)自定義組件目前還不是很豐富,在開發(fā)過程中常常會有一些特殊效果的組件,這就需要我們額外花一些時間實現(xiàn),這里給大家提供了一個 BottomSheet 上拉抽屜的組件,同時通過這個組件示例講解一下 HarmonyOS
    發(fā)表于 03-16 16:05

    HarmonyOS實現(xiàn)自定義控件的過程分享

    ,100圓的繪圖,為設置的筆畫}4.在xml布局引用自定義控件:<?xml 版本="1.0" 編碼="utf-8"
    發(fā)表于 05-07 11:48

    C#教程之自定義水晶按鈕控件

    C#教程之自定義水晶按鈕控件,很好的C#資料,快來學習吧。
    發(fā)表于 04-20 10:50 ?5次下載

    如何在LabVIEW實現(xiàn)自定義控件

    本文檔的主要內容詳細介紹的是如何在LabVIEW實現(xiàn)自定義控件。
    發(fā)表于 01-14 17:17 ?48次下載
    如何在LabVIEW<b class='flag-5'>中</b>實現(xiàn)<b class='flag-5'>自定義</b><b class='flag-5'>控件</b>

    鴻蒙系統(tǒng)如何設置自定義下拉刷新控件

    Ohos-MaterialRefreshLayout 是一個自定義 Material 風格下拉刷新控件,支持設置水波紋效果,支持下拉刷新侵入式和非侵入式,初始化自動刷新及上滑加載更多,支持刷新頭部
    的頭像 發(fā)表于 09-13 09:24 ?3347次閱讀

    C#自定義開關按鈕控件(WINFORM)

    C#自定義開關按鈕控件(WINFORM)轉載于:https://www.cnblogs.com/macT/p/10212711.html
    發(fā)表于 10-21 18:36 ?17次下載
    C#<b class='flag-5'>自定義</b>開關按鈕<b class='flag-5'>控件</b>(WINFORM)

    精美的TF自定義控件源文件合集

    精美的自定義控件源文件100+,滿足優(yōu)秀界面的需求,分享給大家。
    發(fā)表于 01-13 14:13 ?31次下載

    自定義屏幕圖案解鎖控件教程案例

    一個自定義屏幕圖案解鎖控件,該庫使您可以輕松,快速地在應用程序實現(xiàn)模式鎖定機制。它非常易于使用,并且提供了許多自定義選項,可以更改此視圖的功能和外觀以滿足您的需求。它還支持RxJav
    發(fā)表于 04-11 09:40 ?1次下載

    labview自定義控件

    labview自定義精美控件
    發(fā)表于 05-15 16:46 ?17次下載

    labview超快自定義控件制作和普通自定義控件制作

    labview超快自定義控件制作和普通自定義控件制作
    發(fā)表于 08-21 10:32 ?13次下載
    RM新时代网站-首页