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

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

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

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

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

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

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

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

本文介紹列表滑動刪除:

  • 列表中只允許滑出其中一項

  • 如果有打開的項,點擊或滑動其他項都會關閉打開的項

  • 點擊刪除,刷新列表界面

主要知識點

可滑動的容器組件(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

實現(xiàn)思路

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

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

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

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

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

部分代碼如下:

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

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

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

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

部分代碼如下:

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

Scroll(scroller){//控制器綁定到滑動容器中
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軸坐標
this.downX=event.touches[0].x
break
caseTouchType.Up://觸摸抬起
//觸摸抬起,根據(jù)x軸總偏移量,判斷是否打開刪除
letxOffset=event.touches[0].x-this.downX
//滑到目標x軸的位置
vartoxOffset=0
//偏移量超過刪除按鈕一半且左滑,設置打開
if(Math.abs(xOffset)>vp2px(this.deleteWidth)/2&&xOffset0){
//刪除布局寬度
toxOffset=vp2px(this.deleteWidth)
}
//滑動指定位置,設置動畫
item.scroller.scrollTo({xOffset:toxOffset,yOffset:0,
animation:{duration:300,curve:Curve.Linear}})
//重置按下的x軸坐標
this.downX=0
break
}
})
.....
④使用列表加載

需要主要的點:
  • 需要給每個 item 綁定控制器,這樣才能控制對應的 item 打開或關閉

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

以下是完整代碼,可直接粘貼運行使用:

classTestData{
content:string
scroller:Scroller

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

@Entry
@Component
structSlidingDeleteList{
//刪除按鈕的寬度
privatedeleteWidth=100
//按下的x軸坐標
privatedownX=0
//已經(jīng)打開刪除的數(shù)據(jù)
privateopenDeleteData:TestData=null
//測試數(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(()=>{
//如果刪除按鈕打開,關閉刪除按鈕且返回
if(this.openDeleteData!=null){
this.openDeleteData.scroller.scrollTo({xOffset:0,yOffset:0,
animation:{duration:100,curve:Curve.Linear}})
this.openDeleteData=null
return
}
console.log('========點擊內(nèi)容=========')
})

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

//關閉刪除按鈕
if(this.openDeleteData!=null){
this.openDeleteData.scroller.scrollTo({xOffset:0,yOffset:0,
animation:{duration:100,curve:Curve.Linear}})
this.openDeleteData=null
}
console.log('========點擊刪除=========')
})
}
}.scrollable(ScrollDirection.Horizontal)
.onTouch((event:TouchEvent)=>{//觸摸事件
//判斷是否有打開刪除組件,有則關閉
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軸坐標
this.downX=event.touches[0].x
break
caseTouchType.Up://觸摸抬起
//觸摸抬起,根據(jù)x軸總偏移量,判斷是否打開刪除
letxOffset=event.touches[0].x-this.downX
//防止消費點擊事件
if(xOffset==0){
return
}
//滑到x軸的位置
vartoxOffset=0
//開啟刪除的對象置為null
this.openDeleteData=null;
//偏移量超過刪除按鈕一半且左滑,設置打開
if(Math.abs(xOffset)>vp2px(this.deleteWidth)/2&&xOffset0){
//刪除布局寬度
toxOffset=vp2px(this.deleteWidth)
this.openDeleteData=item
}
//滑動指定位置,設置動畫
item.scroller.scrollTo({xOffset:toxOffset,yOffset:0,
animation:{duration:300,curve:Curve.Linear}})
//重置按下的x軸坐標
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%')
}
}

結尾

因為 ArkUI 聲明式開發(fā),是鴻蒙新出的東西,API 還不是那么完善,后續(xù)跟進官網(wǎng)更新。 以下是需要優(yōu)化點:ArkUI 中的 TS 沒有 JS 中的新出的插槽概念,要不然直接封裝成組件,提供兩個對外的接口,一個傳入內(nèi)容布局、一個操作布局,就像 Android 的組件庫一樣,使用者不需要知道內(nèi)部實現(xiàn)。 作者:梁青松
編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8257

    瀏覽量

    149965
  • API
    API
    +關注

    關注

    2

    文章

    1461

    瀏覽量

    61492
  • JS
    JS
    +關注

    關注

    0

    文章

    75

    瀏覽量

    17983
  • 鴻蒙
    +關注

    關注

    56

    文章

    2267

    瀏覽量

    42492

原文標題:在鴻蒙上實現(xiàn)聊天列表滑動刪除功能!

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

    鴻蒙OS開發(fā)實例:【HarmonyHttpClient】網(wǎng)絡框架

    鴻蒙上使用的Http網(wǎng)絡框架,里面包含純Java實現(xiàn)的HttpNet,類似okhttp使用,支持同步和異步兩種請求方式;還有鴻蒙版retrofit,和Android版Retrofit相似的使用,解放雙手般優(yōu)雅使用注解、自動解析j
    的頭像 發(fā)表于 04-12 16:58 ?704次閱讀
    <b class='flag-5'>鴻蒙</b>OS開發(fā)實例:【HarmonyHttpClient】網(wǎng)絡框架

    鴻蒙OS開發(fā)學習:【尺寸適配實現(xiàn)

    鴻蒙開發(fā)中,尺寸適配是一個重要的概念,它可以幫助我們在不同屏幕尺寸的設備上正確顯示和布局我們的應用程序。本文將介紹如何在鴻蒙開發(fā)中實現(xiàn)尺寸適配的方法。
    的頭像 發(fā)表于 04-10 16:05 ?1465次閱讀
    <b class='flag-5'>鴻蒙</b>OS開發(fā)學習:【尺寸適配<b class='flag-5'>實現(xiàn)</b>】

    訪問控制列表什么?ACL的功能特點

    (如文件、目錄、網(wǎng)絡端口、服務等)執(zhí)行何種操作(如讀取、寫入、執(zhí)行、刪除、修改等)。其主要目的是確保信息系統(tǒng)的安全性,防止未經(jīng)授權的訪問、篡改或破壞。 以下是訪問控制功能(ACL)的主要特點和組成部分: 1. 主體(Subject):訪問資源的實體,通常包括用戶、進程、設
    的頭像 發(fā)表于 04-03 13:57 ?551次閱讀

    鴻蒙實戰(zhàn)開發(fā)ArkTS運用:【ai聊天框】

    用一個ArkTS編寫的HarmonyOS原生聊天UI框架,提供了開箱即用的聊天對話組件。
    的頭像 發(fā)表于 03-08 15:38 ?669次閱讀
    <b class='flag-5'>鴻蒙</b>實戰(zhàn)開發(fā)ArkTS運用:【ai<b class='flag-5'>聊天</b>框】

    鴻蒙實戰(zhàn)項目開發(fā):【短信服務】

    送短信的功能。 效果預覽 新建聯(lián)系人 首頁 短信頁 使用說明: 首頁點擊創(chuàng)建聯(lián)系人,彈框輸入聯(lián)系人姓名和電話,點擊確定按鈕后,聯(lián)系人列表中添加該聯(lián)系人; 點擊管理,該按鈕變成取消,聯(lián)系人列表
    發(fā)表于 03-03 21:29

    鴻蒙實戰(zhàn):HarmonyOS NEXT【城市選擇】

    ,通過滑動選擇城市首拼,快速定位相關首拼城市。 實現(xiàn)思路 場景:通過AlphabetIndexer實現(xiàn)索引條導航 城市列表中的右側(cè)首拼索引條,通過AlphabetIndexer組件
    發(fā)表于 02-29 15:50

    何在鴻蒙系統(tǒng)上安裝Google Play

    。但是,通過以下簡易步驟仍然可以在鴻蒙系統(tǒng)上安裝Google Play。 了解鴻蒙系統(tǒng)和Google Play之間的不兼容性 鴻蒙系統(tǒng)的背景介紹 鴻蒙系統(tǒng)是華為自主研發(fā)的操作系統(tǒng),致力
    的頭像 發(fā)表于 01-31 17:13 ?1.3w次閱讀

    滑動變阻器的作用 滑動變阻器怎么看電阻變大變小

    滑動變阻器是一種用于調(diào)節(jié)電阻大小的電子元件,通常由一個可滑動的滑片連接兩個電阻器端點,通過改變滑片的位置,可以實現(xiàn)電阻值的變化。 滑動變阻器的作用:
    的頭像 發(fā)表于 01-30 11:35 ?1663次閱讀

    鴻蒙ArkUI開發(fā)-實現(xiàn)增刪Tab頁簽

    本文以瀏覽器中增加或刪除頁簽為例,實現(xiàn)Tabs中頁簽的增刪功能。
    的頭像 發(fā)表于 01-29 18:43 ?1436次閱讀
    <b class='flag-5'>鴻蒙</b>ArkUI開發(fā)-<b class='flag-5'>實現(xiàn)</b>增刪Tab頁簽

    滑動變阻器的調(diào)節(jié)方法有哪些?

    滑動變阻器的調(diào)節(jié)方法有哪些? 滑動變阻器是一種調(diào)節(jié)電阻值的裝置,可以通過滑動變阻器來調(diào)整電路中的電阻,從而實現(xiàn)對電流、電壓和功率等電路參數(shù)的調(diào)節(jié)。
    的頭像 發(fā)表于 01-18 15:28 ?2623次閱讀

    python列表和數(shù)組的區(qū)別

    Python是一種功能強大的編程語言,為開發(fā)者提供了許多數(shù)據(jù)結構來處理和操作數(shù)據(jù)。其中,列表和數(shù)組是常用的數(shù)據(jù)結構,用于存儲和組織一系列元素。在本文中,我們將詳細比較Python中的列表和數(shù)組,從
    的頭像 發(fā)表于 11-21 15:13 ?1872次閱讀

    何在AT32 MCU上使用FPU功能

    何在AT32 MCU上使用FPU功能
    的頭像 發(fā)表于 11-01 17:18 ?3867次閱讀
    如<b class='flag-5'>何在</b>AT32 MCU上使用FPU<b class='flag-5'>功能</b>