一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS 中的幾個(gè)自定義控件介紹

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

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

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

效果演示如下圖:

實(shí)現(xiàn)思路

①布局設(shè)計(jì)

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

②手勢(shì)判斷

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

/**
*(x,y)是否在view的區(qū)域內(nèi)
*
*@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;
}

③抽屜偏移

步驟如下:

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

手指按下的判斷是否在抽屜上,然后記錄當(dāng)前觸摸 y 坐標(biāo)。

移動(dòng)是算出偏移量 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ā)這概念的,只有事件消費(fèi),ListContainer 先拿到事件,然后是抽屜布局。

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

待抽屜完全展開時(shí),解開 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;
}
});

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

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

⑤背景亮暗變化

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

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

⑥回彈效果

運(yùn)用到了數(shù)值動(dòng)畫,在手勢(shì)抬起時(shí),判斷上下臨界點(diǎn)決定動(dòng)畫的上下。

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

privatevoidcreateAnimator(){
marginBottom=directionalLayout.getMarginBottom();
HiLog.info(logLabel,"createAnimatormarginBottom:"+marginBottom);
//創(chuàng)建數(shù)值動(dòng)畫對(duì)象
AnimatorValueanimatorValue=newAnimatorValue();
//動(dòng)畫時(shí)長(zhǎng)
animatorValue.setDuration(300);
//播放前的延遲時(shí)間
animatorValue.setDelay(0);
//循環(huán)次數(shù)
animatorValue.setLoopedCount(0);
//動(dòng)畫的播放類型
animatorValue.setCurveType(Animator.CurveType.ACCELERATE_DECELERATE);
//設(shè)置動(dòng)畫過程
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));
}
}
});
//開始啟動(dòng)動(dòng)畫
animatorValue.start();
}

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

if(bottom
 

總結(jié)

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

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

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

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

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

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

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

代碼地址:

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

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

文章出處:【微信公眾號(hào):HarmonyOS技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭菁

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

    關(guān)注

    5

    文章

    2140

    瀏覽量

    58192
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    2005

    瀏覽量

    31800

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

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    LabVIEW自定義控件

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

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

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

    2.1 sc界面-自定義控件

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

    LabVIEW制作的漂亮自定義控件

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

    講解一下HarmonyOS幾個(gè)自定義組件用到的知識(shí)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    labview自定義控件

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

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

    labview超快自定義控件制作和普通自定義控件制作
    發(fā)表于 08-21 10:32 ?13次下載