一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲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)不再提示

如何在鴻蒙上實(shí)現(xiàn)聊天列表滑動(dòng)刪除功能

OpenHarmony技術(shù)社區(qū) ? 來源:鴻蒙技術(shù)社區(qū) ? 作者:鴻蒙技術(shù)社區(qū) ? 2021-12-03 10:55 ? 次閱讀

本項(xiàng)目基于 ArkUI 中 TS 擴(kuò)展的聲明式開發(fā)范式,關(guān)于語法和概念直接看官網(wǎng)。

基于 TS 擴(kuò)展的聲明式開發(fā)范式 1

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-ts-overview-0000001192705715
基于 TS 擴(kuò)展的聲明式開發(fā)范式 2
https://developer.harmonyos.com/cn/docs/documentation/doc-references/ts-framework-directory-0000001111581264

本文介紹列表滑動(dòng)刪除:

  • 列表中只允許滑出其中一項(xiàng)

  • 如果有打開的項(xiàng),點(diǎn)擊或滑動(dòng)其他項(xiàng)都會(huì)關(guān)閉打開的項(xiàng)

  • 點(diǎn)擊刪除,刷新列表界面

主要知識(shí)點(diǎn)

可滑動(dòng)的容器組件(Scroll):

https://developer.harmonyos.com/cn/docs/documentation/doc-references/ts-container-scroll-0000001163543527

觸摸事件(onTouch):

https://developer.harmonyos.com/cn/docs/documentation/doc-references/ts-universal-events-touch-0000001158261221

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

我把界面精簡(jiǎn)了一下,減少代碼量,幫助更好的理解主要邏輯。

①item 布局 主要使用 scroll 包裹內(nèi)容,scroll 設(shè)置為橫向滑動(dòng)。部分代碼如下:
.....
Scroll(){
Row(){
Text('內(nèi)容數(shù)據(jù)')
.width('100%').height(65)

Button(){
Text('刪除')
}
.width(100).height(65)
}
}.scrollable(ScrollDirection.Horizontal)//設(shè)置為橫向滑動(dòng)
.....
②Scroll 容器

給 Scroll 容器綁定滑動(dòng)組件的控制器,只用到其中的一個(gè)方法:滑動(dòng)到指定位置 scrollTo。

scrollTo(
value:{
xOffset:number|string,yOffset:number|string,animation?
:{duration:number,curve:Curve}
}
);
看源碼得知可以設(shè)置動(dòng)畫時(shí)間,注意:時(shí)間目前好像不能設(shè)置 300 毫秒以上,往下設(shè)置可以。

部分代碼如下:

.....
//初始化控制器
privatescroller=newScroller()
Scroll(scroller){//控制器綁定到滑動(dòng)容器中
Row(){
Text('內(nèi)容數(shù)據(jù)')
.width('100%').height(65)

Button(){
Text('刪除')
}
.width(100).height(65)
}
}.scrollable(ScrollDirection.Horizontal)

Button(){
Text('點(diǎn)擊回到原位')
}.onClick(()=>{
scroller.scrollTo({xOffset:0,yOffset:0,animation:{duration:200,curve:Curve.Linear}})
})
.....
③設(shè)置觸摸事件

根據(jù)移動(dòng)的偏移量,判斷大于刪除布局寬度的一半則:打開刪除布局。

部分代碼如下:

.....
//初始化控制器
privatescroller=newScroller()
//按下的x軸坐標(biāo)
privatedownX=0
//刪除按鈕的寬度
privatedeleteWidth=100

Scroll(scroller){//控制器綁定到滑動(dòng)容器中
Row(){
Text('內(nèi)容數(shù)據(jù)')
.width('100%').height(65)

Button(){
Text('刪除')
}
.width(this.deleteWidth).height(65)
}
}.scrollable(ScrollDirection.Horizontal)
.onTouch((event:TouchEvent)=>{//觸摸事件
//根據(jù)觸摸類型判斷
switch(event.type){
caseTouchType.Down://觸摸按下
//記錄按下的x軸坐標(biāo)
this.downX=event.touches[0].x
break
caseTouchType.Up://觸摸抬起
//觸摸抬起,根據(jù)x軸總偏移量,判斷是否打開刪除
letxOffset=event.touches[0].x-this.downX
//滑到目標(biāo)x軸的位置
vartoxOffset=0
//偏移量超過刪除按鈕一半且左滑,設(shè)置打開
if(Math.abs(xOffset)>vp2px(this.deleteWidth)/2&&xOffset0){
//刪除布局寬度
toxOffset=vp2px(this.deleteWidth)
}
//滑動(dòng)指定位置,設(shè)置動(dòng)畫
item.scroller.scrollTo({xOffset:toxOffset,yOffset:0,
animation:{duration:300,curve:Curve.Linear}})
//重置按下的x軸坐標(biāo)
this.downX=0
break
}
})
.....
④使用列表加載

需要主要的點(diǎn):
  • 需要給每個(gè) item 綁定控制器,這樣才能控制對(duì)應(yīng)的 item 打開或關(guān)閉

  • 打開的 item 記錄一下數(shù)據(jù),點(diǎn)擊內(nèi)容或刪除、滑動(dòng)其他 item:如果有帶打開的 item,進(jìn)行關(guān)閉

以下是完整代碼,可直接粘貼運(yùn)行使用:

classTestData{
content:string
scroller:Scroller

constructor(content:string,scroller:Scroller){
this.content=content
this.scroller=scroller
}
}

@Entry
@Component
structSlidingDeleteList{
//刪除按鈕的寬度
privatedeleteWidth=100
//按下的x軸坐標(biāo)
privatedownX=0
//已經(jīng)打開刪除的數(shù)據(jù)
privateopenDeleteData:TestData=null
//測(cè)試數(shù)據(jù)
@StateprivatelistData:Array=[
{content:'內(nèi)容數(shù)據(jù)1',scroller:newScroller()},{content:'內(nèi)容數(shù)據(jù)2',scroller:newScroller()},
{content:'內(nèi)容數(shù)據(jù)3',scroller:newScroller()},{content:'內(nèi)容數(shù)據(jù)4',scroller:newScroller()},
{content:'內(nèi)容數(shù)據(jù)5',scroller:newScroller()},{content:'內(nèi)容數(shù)據(jù)6',scroller:newScroller()},
{content:'內(nèi)容數(shù)據(jù)7',scroller:newScroller()},{content:'內(nèi)容數(shù)據(jù)8',scroller:newScroller()},
]

@BuilderCustomItem(item:TestData){
Scroll(item.scroller){
Row(){
Text(item.content)
.width('100%').height(65)
.fontSize(16).textAlign(TextAlign.Center)
.onClick(()=>{
//如果刪除按鈕打開,關(guān)閉刪除按鈕且返回
if(this.openDeleteData!=null){
this.openDeleteData.scroller.scrollTo({xOffset:0,yOffset:0,
animation:{duration:100,curve:Curve.Linear}})
this.openDeleteData=null
return
}
console.log('========點(diǎn)擊內(nèi)容=========')
})

Button(){
Text('刪除')
.fontSize(15)
.fontColor(Color.White)
}
.type(ButtonType.Normal)
.width(this.deleteWidth).height(65)
.backgroundColor(Color.Red)
.onClick(()=>{
//刪除當(dāng)前數(shù)據(jù)
this.listData.splice(this.listData.indexOf(item),1)

//關(guān)閉刪除按鈕
if(this.openDeleteData!=null){
this.openDeleteData.scroller.scrollTo({xOffset:0,yOffset:0,
animation:{duration:100,curve:Curve.Linear}})
this.openDeleteData=null
}
console.log('========點(diǎn)擊刪除=========')
})
}
}.scrollable(ScrollDirection.Horizontal)
.onTouch((event:TouchEvent)=>{//觸摸事件
//判斷是否有打開刪除組件,有則關(guān)閉
if(this.openDeleteData!=null&&this.openDeleteData!=item){
this.openDeleteData.scroller.scrollTo({xOffset:0,yOffset:0,
animation:{duration:100,curve:Curve.Linear}})
}

//根據(jù)觸摸類型判斷
switch(event.type){
caseTouchType.Down://觸摸按下
//記錄按下的x軸坐標(biāo)
this.downX=event.touches[0].x
break
caseTouchType.Up://觸摸抬起
//觸摸抬起,根據(jù)x軸總偏移量,判斷是否打開刪除
letxOffset=event.touches[0].x-this.downX
//防止消費(fèi)點(diǎn)擊事件
if(xOffset==0){
return
}
//滑到x軸的位置
vartoxOffset=0
//開啟刪除的對(duì)象置為null
this.openDeleteData=null;
//偏移量超過刪除按鈕一半且左滑,設(shè)置打開
if(Math.abs(xOffset)>vp2px(this.deleteWidth)/2&&xOffset0){
//刪除布局寬度
toxOffset=vp2px(this.deleteWidth)
this.openDeleteData=item
}
//滑動(dòng)指定位置,設(shè)置動(dòng)畫
item.scroller.scrollTo({xOffset:toxOffset,yOffset:0,
animation:{duration:300,curve:Curve.Linear}})
//重置按下的x軸坐標(biāo)
this.downX=0
break
}
})
}

build(){
Column(){
List(){
ForEach(this.listData,item=>{
ListItem(){
this.CustomItem(item)
}
},item=>item.toString())
}.divider({color:'#f1efef',strokeWidth:1})
}
.width('100%')
.height('100%')
}
}

結(jié)尾

因?yàn)?ArkUI 聲明式開發(fā),是鴻蒙新出的東西,API 還不是那么完善,后續(xù)跟進(jìn)官網(wǎng)更新。 以下是需要優(yōu)化點(diǎn):ArkUI 中的 TS 沒有 JS 中的新出的插槽概念,要不然直接封裝成組件,提供兩個(gè)對(duì)外的接口,一個(gè)傳入內(nèi)容布局、一個(gè)操作布局,就像 Android 的組件庫一樣,使用者不需要知道內(nèi)部實(shí)現(xiàn)。 作者:梁青松
編輯:jq
聲明:本文內(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)注

    33

    文章

    8885

    瀏覽量

    152990
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1555

    瀏覽量

    63315
  • JS
    JS
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    18349
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2469

    瀏覽量

    43652

原文標(biāo)題:在鴻蒙上實(shí)現(xiàn)聊天列表滑動(dòng)刪除功能!

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Get這個(gè)秘籍,鴻蒙原生應(yīng)用頁面滑動(dòng)絲滑無比

    。 華為此次推出的ArkUI與Web頁面滑動(dòng)白塊/白屏解決方案,不僅優(yōu)化了鴻蒙應(yīng)用的頁面加載性能,更顯著降低了開發(fā)者實(shí)現(xiàn)高性能滑動(dòng)效果的門檻。歡迎更多開發(fā)者應(yīng)用廠商使用和反饋,共同提升
    發(fā)表于 03-06 14:41

    HarmonyOS NEXT 原生應(yīng)用開發(fā):社交聊天對(duì)話過程實(shí)現(xiàn)

    一、實(shí)現(xiàn)思路 本DEMO旨在展示如何在HarmonyOS NEXT平臺(tái)上,利用ArkTS開發(fā)語言構(gòu)建一個(gè)簡(jiǎn)易的社交聊天對(duì)話界面。用戶可以在此界面上查看聊天記錄,并發(fā)送新的消息。此示例中
    發(fā)表于 01-07 10:55

    鴻蒙原生頁面高性能解決方案上線OpenHarmony社區(qū) 助力打造高性能原生應(yīng)用

    高性能鴻蒙原生應(yīng)用。 Nodepool:優(yōu)化頁面滑動(dòng)流暢性Nodepool旨在解決應(yīng)用頁面滑動(dòng)卡頓問題。開發(fā)中,相似頁面因業(yè)務(wù)和代碼差異,組件復(fù)用性差,引發(fā)卡頓、丟幀,影響用戶體驗(yàn)。Nodepool通過
    發(fā)表于 01-02 18:00

    HarmonyOS NEXT 應(yīng)用開發(fā)練習(xí):智能視頻推薦

    一、整體思路 本DEMO展示了如何在HarmonyOS NEXT平臺(tái)上開發(fā)一個(gè)智能視頻推薦應(yīng)用。應(yīng)用通過模擬的用戶偏好數(shù)據(jù),為用戶推薦可能感興趣的視頻。用戶可以通過滑動(dòng)屏幕查看推薦的視頻列表,并點(diǎn)擊
    發(fā)表于 01-02 16:26

    滑動(dòng)變阻器的優(yōu)缺點(diǎn)對(duì)比

    滑動(dòng)變阻器的優(yōu)點(diǎn) 1. 精確控制 滑動(dòng)變阻器能夠提供精確的電阻值調(diào)整,這對(duì)于需要精細(xì)控制電流的實(shí)驗(yàn)和應(yīng)用至關(guān)重要。通過改變滑動(dòng)觸點(diǎn)的位置,可以實(shí)現(xiàn)對(duì)電阻值的連續(xù)調(diào)整,從而精確控制電路中
    的頭像 發(fā)表于 11-25 15:13 ?1802次閱讀

    滑動(dòng)變阻器的接線方法 滑動(dòng)變阻器的常見故障與維修

    滑動(dòng)變阻器的接線方法 串聯(lián)接線法 : 將滑動(dòng)變阻器的一端接到電路的正極,另一端接到電路的負(fù)載(如燈泡)。 負(fù)載的另一端接到電路的負(fù)極。 滑動(dòng)變阻器的滑動(dòng)觸點(diǎn)通過一個(gè)旋鈕或滑塊連接到電路
    的頭像 發(fā)表于 11-25 15:03 ?2502次閱讀

    滑動(dòng)變阻器的應(yīng)用領(lǐng)域 滑動(dòng)變阻器在電路中的作用

    觀察和理解電路中電流和電壓的變化。 2. 工業(yè)自動(dòng)化 在工業(yè)自動(dòng)化領(lǐng)域,滑動(dòng)變阻器被用于控制電機(jī)的速度和力矩。通過調(diào)整電阻值,可以精確控制電機(jī)的電流,從而實(shí)現(xiàn)對(duì)電機(jī)運(yùn)行狀態(tài)的精細(xì)調(diào)節(jié)。 3. 音頻設(shè)備 在音頻設(shè)備中,滑動(dòng)變阻
    的頭像 發(fā)表于 11-25 15:01 ?3265次閱讀

    滑動(dòng)變阻器有哪些分類?

    是一種基于數(shù)字信號(hào)處理技術(shù)的變阻器,可以實(shí)現(xiàn)對(duì)電阻值的精確調(diào)節(jié)和快速切換。數(shù)字變阻器通常采用微處理器或數(shù)字信號(hào)處理器作為核心控制器,通過改變滑動(dòng)觸點(diǎn)在固定電阻體上的位置,實(shí)現(xiàn)對(duì)電阻值的數(shù)字控制。數(shù)字
    發(fā)表于 11-07 10:08

    Taro 鴻蒙技術(shù)內(nèi)幕系列(二):如何讓 W3C 標(biāo)準(zhǔn)的 CSS跑在鴻蒙上

    作者:京東零售 馬銀濤 ? 基于 Taro 打造的京東鴻蒙 APP 已跟隨鴻蒙 Next 系統(tǒng)公測(cè),本系列文章將深入解析 Taro 如何實(shí)現(xiàn)使用 React 開發(fā)高性能鴻蒙應(yīng)用的技術(shù)內(nèi)
    的頭像 發(fā)表于 10-31 10:54 ?387次閱讀
    Taro <b class='flag-5'>鴻蒙</b>技術(shù)內(nèi)幕系列(二):如何讓 W3C 標(biāo)準(zhǔn)的 CSS跑在<b class='flag-5'>鴻蒙上</b>

    滑動(dòng)變阻器的作用是什么?

    的電壓大小。這對(duì)于實(shí)現(xiàn)對(duì)電子設(shè)備的精確控制具有重要意義。 滑動(dòng)變阻器還可以用于實(shí)現(xiàn)電路的分壓功能,在某些電路中,需要將電源電壓分成幾個(gè)不同的電壓值。這時(shí),可以使用
    發(fā)表于 10-08 16:39

    滑動(dòng)變阻器調(diào)到最大阻值的目的

    滑動(dòng)變阻器是一種常用的電子元件,其主要功能是通過改變電阻值來控制電路中的電流。在許多電子設(shè)備和實(shí)驗(yàn)中,滑動(dòng)變阻器的調(diào)節(jié)能力對(duì)于實(shí)現(xiàn)精確控制和優(yōu)化性能至關(guān)重要。本文將探討
    的頭像 發(fā)表于 08-05 11:03 ?3836次閱讀

    探究電流與電壓的關(guān)系滑動(dòng)變阻器的作用

    組成。 電阻體是滑動(dòng)變阻器的核心部分,通常由碳膜、金屬膜或線繞等材料制成。電阻體的長(zhǎng)度決定了滑動(dòng)變阻器的最大阻值?;瑝K是滑動(dòng)變阻器的關(guān)鍵部件,通過移動(dòng)滑塊,可以改變電阻體的有效長(zhǎng)度,從而實(shí)現(xiàn)
    的頭像 發(fā)表于 07-24 14:53 ?2987次閱讀

    鴻蒙ArkTS聲明式開發(fā):跨平臺(tái)支持列表 SwipeGesture之基礎(chǔ)手勢(shì)

    用于觸發(fā)滑動(dòng)事件,滑動(dòng)速度大于100vp/s時(shí)可識(shí)別成功。
    的頭像 發(fā)表于 06-18 14:59 ?502次閱讀
    <b class='flag-5'>鴻蒙</b>ArkTS聲明式開發(fā):跨平臺(tái)支持<b class='flag-5'>列表</b> SwipeGesture之基礎(chǔ)手勢(shì)

    鴻蒙ArkTS聲明式開發(fā):跨平臺(tái)支持列表【觸摸事件】

    當(dāng)手指在組件上按下、滑動(dòng)、抬起時(shí)觸發(fā)。
    的頭像 發(fā)表于 05-27 09:34 ?703次閱讀
    <b class='flag-5'>鴻蒙</b>ArkTS聲明式開發(fā):跨平臺(tái)支持<b class='flag-5'>列表</b>【觸摸事件】

    鴻蒙ArkUI開發(fā):常用布局【 創(chuàng)建列表(List)】

    列表容器是為了高效處理長(zhǎng)列表的容器,能支持橫向、豎向滾動(dòng),數(shù)據(jù)分組,分組頭懸浮等功能
    的頭像 發(fā)表于 05-15 15:30 ?1064次閱讀
    <b class='flag-5'>鴻蒙</b>ArkUI開發(fā):常用布局【 創(chuàng)建<b class='flag-5'>列表</b>(List)】