在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

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

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

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

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

效果演示如下圖:

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

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

選擇的是相對(duì)布局,蒙層區(qū)來(lái)改變內(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)聽(tīng)。

手指按下的判斷是否在抽屜上,然后記錄當(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 中是沒(méi)有事件分發(fā)這概念的,只有事件消費(fèi),ListContainer 先拿到事件,然后是抽屜布局。

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

待抽屜完全展開(kāi)時(shí),解開(kāi) 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í),判斷是否打開(kāi) 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)畫(huà),在手勢(shì)抬起時(shí),判斷上下臨界點(diǎn)決定動(dòng)畫(huà)的上下。

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

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

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

if(bottom
 

總結(jié)

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

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

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

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

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

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

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

    關(guān)注

    5

    文章

    2140

    瀏覽量

    58147
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    2005

    瀏覽量

    31748

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

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

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

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

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

    LabVIEW自定義控件

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

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

    如上圖是一個(gè)狀態(tài)機(jī)的獲取隊(duì)列引用。最左邊是枚舉的自定義類(lèi)型控件。如果不用自定義枚舉控件只用枚舉應(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í)

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

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

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

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

    C#教程之自定義水晶按鈕控件,很好的C#資料,快來(lái)學(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 ?3573次閱讀

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

    C#自定義開(kāi)關(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>開(kāi)關(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次下載

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品
    主站蜘蛛池模板: 亚洲精品久久婷婷爱久久婷婷 | 日日日日人人人夜夜夜2017 | 韩国精品视频 | 俺来也俺去啦久久综合网 | 久久免费99精品久久久久久 | 一级毛片看真人在线视频 | 人人爽人人干 | 国产女主播精品大秀系列在线 | 国产女同在线观看 | 亚洲成av人片在线观看无码 | 欧美最猛黑人xxxx黑人猛交黄 | 日本午夜大片免费观看视频 | 亚洲第一成人影院 | 天堂中文资源在线观看 | 69精品在线 | 中文字幕在线一区 | 午夜在线观看视频 | 免费在线观看的网站 | 久艹精品| 亚州 色 图 综合 | 国产h视频在线 | 中文字幕在线观看一区二区 | 日韩专区一区 | 天天操夜夜操视频 | 国产色秀视频在线观看 | 国产激烈床戏无遮挡观看 | 奇米影视四色首页手机在线 | 网红和老师啪啪对白清晰 | 四虎国产精品免费观看 | 国产码一区二区三区 | 黄 色 片免费观看 | 毛片天天看 | 午夜在线观看免费视频 | 婷婷丁香亚洲 | 久久系列| 激情综合网五月激情 | 美女被免费网站在线视频九色 | 色噜噜狠狠大色综合 | 色狠狠成人综合网 | 免费看国产精品久久久久 | 在线免费黄色 |