成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HarmonyOS ArkUI之聊天列表滑動刪除(TS)

開發(fā) 前端 OpenHarmony
本項目基于ArkUI中TS擴展的聲明式開發(fā)范式,本文介紹列表滑動刪除:列表中只允許滑出其中一項,如果有打開的項,點擊或滑動其他項都會關閉打開的項,點擊刪除,刷新列表界面。

[[436946]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

簡介

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

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

本文介紹列表滑動刪除:

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

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

點擊刪除,刷新列表界面

ArKUI系列文章

效果演示

HarmonyOS ArkUI之聊天列表滑動刪除(TS)-鴻蒙HarmonyOS技術社區(qū)

主要知識點

可滑動的容器組件(Scroll)、觸摸事件(onTouch)

實現(xiàn)思路

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

HarmonyOS ArkUI之聊天列表滑動刪除(TS)-鴻蒙HarmonyOS技術社區(qū)

1、item布局

主要使用scroll包裹內容,scroll設置為橫向滑動(部分代碼)

  1. ..... 
  2. Scroll() { 
  3.       Row() { 
  4.         Text('內容數(shù)據(jù)'
  5.           .width('100%').height(65) 
  6.  
  7.         Button() { 
  8.           Text('刪除'
  9.         } 
  10.         .width(100).height(65) 
  11.       } 
  12.  }.scrollable(ScrollDirection.Horizontal) // 設置為橫向滑動 
  13. ..... 

2、Scroll容器

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

  1. scrollTo( 
  2.     value: { 
  3.     xOffset: number | string, yOffset: number | string, animation? 
  4.         : { duration: number, curve: Curve } 
  5.     } 
  6. ); 

看源碼得知可以設置動畫時間,注意:時間目前好像不能設置300毫秒以上,往下設置可以 (部分代碼)

  1. ..... 
  2. // 初始化控制器 
  3. private scroller= new Scroller() 
  4. Scroll(scroller) { // 控制器綁定到滑動容器中 
  5.       Row() { 
  6.         Text('內容數(shù)據(jù)'
  7.           .width('100%').height(65) 
  8.  
  9.         Button() { 
  10.           Text('刪除'
  11.         } 
  12.         .width(100).height(65) 
  13.       } 
  14.  }.scrollable(ScrollDirection.Horizontal) 
  15.  
  16. Button() { 
  17.   Text('點擊回到原位')            
  18. }.onClick(()=>{ 
  19.   scroller.scrollTo({ xOffset: 0, yOffset: 0, animation: { duration: 200, curve: Curve.Linear } }) 
  20. }) 
  21. ..... 

3、設置觸摸事件

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

  1. ..... 
  2. // 初始化控制器 
  3. private scroller= new Scroller() 
  4. // 按下的x軸坐標 
  5. private downX = 0 
  6. // 刪除按鈕的寬度 
  7. private deleteWidth = 100 
  8.  
  9. Scroll(scroller) { // 控制器綁定到滑動容器中 
  10.       Row() { 
  11.         Text('內容數(shù)據(jù)'
  12.           .width('100%').height(65) 
  13.  
  14.         Button() { 
  15.           Text('刪除'
  16.         } 
  17.         .width(this.deleteWidth).height(65) 
  18.       } 
  19.  }.scrollable(ScrollDirection.Horizontal) 
  20. .onTouch((event: TouchEvent) => { // 觸摸事件 
  21.       // 根據(jù)觸摸類型判斷 
  22.       switch (event.type) { 
  23.         case TouchType.Down: // 觸摸按下 
  24.           // 記錄按下的x軸坐標 
  25.           this.downX = event.touches[0].x 
  26.           break 
  27.         case TouchType.Up: // 觸摸抬起 
  28.           // 觸摸抬起,根據(jù)x軸總偏移量,判斷是否打開刪除 
  29.           let xOffset = event.touches[0].x - this.downX 
  30.           // 滑到目標x軸的位置 
  31.           var toxOffset = 0           
  32.           // 偏移量超過刪除按鈕一半且左滑,設置打開 
  33.           if (Math.abs(xOffset) > vp2px(this.deleteWidth) / 2 && xOffset < 0) { 
  34.               // 刪除布局寬度 
  35.               toxOffset = vp2px(this.deleteWidth) 
  36.           } 
  37.           // 滑動指定位置,設置動畫 
  38.           item.scroller.scrollTo({ xOffset: toxOffset, yOffset: 0, 
  39.             animation: { duration: 300, curve: Curve.Linear } }) 
  40.           // 重置按下的x軸坐標 
  41.           this.downX = 0 
  42.           break 
  43.       } 
  44.     }) 
  45. ..... 

4、使用列表加載

需要主要的點:

  • 需要給每個item綁定控制器,這樣才能控制對應的item打開或關閉
  • 打開的item記錄一下數(shù)據(jù),點擊內容或刪除、滑動其他item:如果有帶打開的item,進行關閉

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

  1. class TestData { 
  2.   content: string 
  3.   scroller: Scroller 
  4.  
  5.   constructor(content: string, scroller: Scroller) { 
  6.     this.content = content 
  7.     this.scroller = scroller 
  8.   } 
  9.  
  10. @Entry 
  11. @Component 
  12. struct SlidingDeleteList { 
  13.   // 刪除按鈕的寬度 
  14.   private deleteWidth = 100 
  15.   // 按下的x軸坐標 
  16.   private downX = 0 
  17.   // 已經(jīng)打開刪除的數(shù)據(jù) 
  18.   private openDeleteData: TestData = null 
  19.   // 測試數(shù)據(jù) 
  20.   @State private listData: Array<TestData> = [ 
  21.     { content: '內容數(shù)據(jù)1', scroller: new Scroller() }, { content: '內容數(shù)據(jù)2', scroller: new Scroller() }, 
  22.     { content: '內容數(shù)據(jù)3', scroller: new Scroller() }, { content: '內容數(shù)據(jù)4', scroller: new Scroller() }, 
  23.     { content: '內容數(shù)據(jù)5', scroller: new Scroller() }, { content: '內容數(shù)據(jù)6', scroller: new Scroller() }, 
  24.     { content: '內容數(shù)據(jù)7', scroller: new Scroller() }, { content: '內容數(shù)據(jù)8', scroller: new Scroller() }, 
  25.   ] 
  26.  
  27.   @Builder CustomItem(item:TestData) { 
  28.     Scroll(item.scroller) { 
  29.       Row() { 
  30.         Text(item.content) 
  31.           .width('100%').height(65) 
  32.           .fontSize(16).textAlign(TextAlign.Center) 
  33.           .onClick(() => { 
  34.             // 如果刪除按鈕打開,關閉刪除按鈕且返回 
  35.             if (this.openDeleteData != null) { 
  36.               this.openDeleteData.scroller.scrollTo({ xOffset: 0, yOffset: 0, 
  37.                 animation: { duration: 100, curve: Curve.Linear } }) 
  38.               this.openDeleteData = null 
  39.               return 
  40.             } 
  41.             console.log('========點擊內容========='
  42.           }) 
  43.  
  44.         Button() { 
  45.           Text('刪除'
  46.             .fontSize(15) 
  47.             .fontColor(Color.White) 
  48.         } 
  49.         .type(ButtonType.Normal) 
  50.         .width(this.deleteWidth).height(65) 
  51.         .backgroundColor(Color.Red) 
  52.         .onClick(() => { 
  53.           // 刪除當前數(shù)據(jù) 
  54.           this.listData.splice(this.listData.indexOf(item), 1) 
  55.  
  56.           // 關閉刪除按鈕 
  57.           if (this.openDeleteData != null) { 
  58.             this.openDeleteData.scroller.scrollTo({ xOffset: 0, yOffset: 0, 
  59.               animation: { duration: 100, curve: Curve.Linear } }) 
  60.             this.openDeleteData = null 
  61.           } 
  62.           console.log('========點擊刪除========='
  63.         }) 
  64.       } 
  65.     }.scrollable(ScrollDirection.Horizontal) 
  66.     .onTouch((event: TouchEvent) => { // 觸摸事件 
  67.       // 判斷是否有打開刪除組件,有則關閉 
  68.       if (this.openDeleteData != null && this.openDeleteData != item) { 
  69.         this.openDeleteData.scroller.scrollTo({ xOffset: 0, yOffset: 0, 
  70.           animation: { duration: 100, curve: Curve.Linear } }) 
  71.       } 
  72.  
  73.       // 根據(jù)觸摸類型判斷 
  74.       switch (event.type) { 
  75.         case TouchType.Down: // 觸摸按下 
  76.           // 記錄按下的x軸坐標 
  77.           this.downX = event.touches[0].x 
  78.           break 
  79.         case TouchType.Up: // 觸摸抬起 
  80.           // 觸摸抬起,根據(jù)x軸總偏移量,判斷是否打開刪除 
  81.           let xOffset = event.touches[0].x - this.downX 
  82.           // 防止消費點擊事件 
  83.           if (xOffset == 0) { 
  84.             return 
  85.           } 
  86.           // 滑到x軸的位置 
  87.           var toxOffset = 0 
  88.           // 開啟刪除的對象置為null 
  89.           this.openDeleteData = null
  90.           // 偏移量超過刪除按鈕一半且左滑,設置打開 
  91.           if (Math.abs(xOffset) > vp2px(this.deleteWidth) / 2 && xOffset < 0) { 
  92.             // 刪除布局寬度 
  93.             toxOffset = vp2px(this.deleteWidth) 
  94.             this.openDeleteData = item 
  95.           } 
  96.           // 滑動指定位置,設置動畫 
  97.           item.scroller.scrollTo({ xOffset: toxOffset, yOffset: 0, 
  98.             animation: { duration: 300, curve: Curve.Linear } }) 
  99.           // 重置按下的x軸坐標 
  100.           this.downX = 0 
  101.           break 
  102.       } 
  103.     }) 
  104.   } 
  105.  
  106.   build() { 
  107.     Column() { 
  108.       List() { 
  109.         ForEach(this.listData, item => { 
  110.           ListItem() { 
  111.             this.CustomItem(item) 
  112.           } 
  113.         }, item => item.toString()) 
  114.       }.divider({ color: '#f1efef', strokeWidth: 1 }) 
  115.     } 
  116.     .width('100%'
  117.     .height('100%'
  118.   } 

結尾

因為ArkUI聲明式開發(fā),是鴻蒙新出的東西,API還不是那么完善,后續(xù)跟進官網(wǎng)更新。以下是需要優(yōu)化點:

ArkUI中的TS沒有JS中的新出的插槽概念,要不然直接封裝成組件,提供兩個對外的接口,一個傳入內容布局、一個操作布局,就像Android的組件庫一樣,使用者不需要知道內部實現(xiàn)。

每天進步一點點、需要付出努力億點點。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關推薦

2021-12-01 10:02:57

鴻蒙HarmonyOS應用

2022-08-23 16:07:02

ArkUI鴻蒙

2022-09-26 15:16:03

ArkUITS

2022-07-20 15:32:25

時鐘翻頁Text組件

2022-04-08 14:47:11

ArkUI列表字母索引鴻蒙

2022-08-08 19:46:26

ArkUI鴻蒙

2021-12-03 09:49:59

鴻蒙HarmonyOS應用

2022-09-02 15:17:04

ArkUI鴻蒙

2014-12-31 14:52:27

SwipeMenuLiSwipeMenu

2022-08-24 16:08:22

ETS鴻蒙

2022-05-20 14:34:20

list組件鴻蒙操作系統(tǒng)

2021-11-23 10:00:55

鴻蒙HarmonyOS應用

2022-11-21 16:15:41

ArkUI鴻蒙

2021-11-24 10:02:53

鴻蒙HarmonyOS應用

2023-08-24 16:42:29

Sample聊天實例應用

2020-10-30 20:54:29

微信新功能移動應用

2021-01-08 09:55:17

鴻蒙HarmonyOS組裝列表

2021-11-16 09:38:10

鴻蒙HarmonyOS應用

2017-03-13 10:11:28

AndroidRecyclerVie功能介紹

2022-07-28 14:26:11

AI作詩應用開發(fā)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品在线一区二区三区 | 国产一区二区三区四区 | 日韩亚洲一区二区 | www日韩欧美 | 一区二区三区中文字幕 | 国产天堂 | 韩日一区二区 | 国产一区二区三区精品久久久 | 仙人掌旅馆在线观看 | 最新日韩在线 | 国产69久久精品成人看动漫 | 一区二区不卡高清 | 日本视频在线播放 | 日日干夜夜操 | 国产精品精品视频一区二区三区 | 久久天天躁狠狠躁夜夜躁2014 | 九九久久在线看 | 国产在线观看一区二区 | 国产精品一区二区三 | 夜夜爆操| 欧美精品一区二区三区在线 | 麻豆精品国产91久久久久久 | 日韩欧美一区二区三区四区 | 国产一区二区在线播放 | 欧美日韩一区在线 | 在线观看视频福利 | 亚洲欧美综合精品久久成人 | 啪啪毛片 | 国产成人99久久亚洲综合精品 | 日韩欧美在线观看 | 免费一级毛片 | 欧美综合自拍 | 亚洲成人高清 | 嫩草视频在线免费观看 | 成人小视频在线观看 | 蜜月aⅴ国产精品 | 一区二区三区在线免费观看视频 | 欧美a区| 亚洲午夜av | 成人在线视频一区二区三区 | 中文字幕日韩一区 |