0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在鸿蒙上实现聊天列表滑动删除功能

OpenHarmony技术社区 来源:鸿蒙技术社区 作者:鸿蒙技术社区 2021-12-03 10:55 次阅读

本项目基于 ArkUI 中 TS 扩展的声明式开发范式,关于语法和概念直接看官网。

基于 TS 扩展的声明式开发范式 1

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-ts-overview-0000001192705715
基于 TS 扩展的声明式开发范式 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

实现思路

我把界面精简了一下,减少代码量,帮助更好的理解主要逻辑。

①item 布局 主要使用 scroll 包裹内容,scroll 设置为横向滑动。部分代码如下:
.....
Scroll(){
Row(){
Text('内容数据')
.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('内容数据')
.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}})
})
.....
③设置触摸事件

根据移动的偏移量,判断大于删除布局宽度的一半则:打开删除布局。

部分代码如下:

.....
//初始化控制器
privatescroller=newScroller()
//按下的x轴坐标
privatedownX=0
//删除按钮的宽度
privatedeleteWidth=100

Scroll(scroller){//控制器绑定到滑动容器中
Row(){
Text('内容数据')
.width('100%').height(65)

Button(){
Text('删除')
}
.width(this.deleteWidth).height(65)
}
}.scrollable(ScrollDirection.Horizontal)
.onTouch((event:TouchEvent)=>{//触摸事件
//根据触摸类型判断
switch(event.type){
caseTouchType.Down://触摸按下
//记录按下的x轴坐标
this.downX=event.touches[0].x
break
caseTouchType.Up://触摸抬起
//触摸抬起,根据x轴总偏移量,判断是否打开删除
letxOffset=event.touches[0].x-this.downX
//滑到目标x轴的位置
vartoxOffset=0
//偏移量超过删除按钮一半且左滑,设置打开
if(Math.abs(xOffset)>vp2px(this.deleteWidth)/2&&xOffset< 0){
//删除布局宽度
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 记录一下数据,点击内容或删除、滑动其他 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
//已经打开删除的数据
privateopenDeleteData:TestData=null
//测试数据
@StateprivatelistData:Array=[
{content:'内容数据1',scroller:newScroller()},{content:'内容数据2',scroller:newScroller()},
{content:'内容数据3',scroller:newScroller()},{content:'内容数据4',scroller:newScroller()},
{content:'内容数据5',scroller:newScroller()},{content:'内容数据6',scroller:newScroller()},
{content:'内容数据7',scroller:newScroller()},{content:'内容数据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('========点击内容=========')
})

Button(){
Text('删除')
.fontSize(15)
.fontColor(Color.White)
}
.type(ButtonType.Normal)
.width(this.deleteWidth).height(65)
.backgroundColor(Color.Red)
.onClick(()=>{
//删除当前数据
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}})
}

//根据触摸类型判断
switch(event.type){
caseTouchType.Down://触摸按下
//记录按下的x轴坐标
this.downX=event.touches[0].x
break
caseTouchType.Up://触摸抬起
//触摸抬起,根据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&&xOffset< 0){
//删除布局宽度
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 声明式开发,是鸿蒙新出的东西,API 还不是那么完善,后续跟进官网更新。 以下是需要优化点:ArkUI 中的 TS 没有 JS 中的新出的插槽概念,要不然直接封装成组件,提供两个对外的接口,一个传入内容布局、一个操作布局,就像 Android 的组件库一样,使用者不需要知道内部实现。 作者:梁青松
编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7635

    浏览量

    148452
  • API
    API
    +关注

    关注

    2

    文章

    1381

    浏览量

    60986
  • JS
    JS
    +关注

    关注

    0

    文章

    73

    浏览量

    17846
  • 鸿蒙
    +关注

    关注

    55

    文章

    1613

    浏览量

    42115

原文标题:在鸿蒙上实现聊天列表滑动删除功能!

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙OS开发实例:【HarmonyHttpClient】网络框架

    鸿蒙上使用的Http网络框架,里面包含纯Java实现的HttpNet,类似okhttp使用,支持同步和异步两种请求方式;还有鸿蒙版retrofit,和Android版Retrofit相似的使用,解放双手般优雅使用注解、自动解析j
    的头像 发表于 04-12 16:58 284次阅读
    <b class='flag-5'>鸿蒙</b>OS开发实例:【HarmonyHttpClient】网络框架

    鸿蒙OS开发学习:【尺寸适配实现

    鸿蒙开发中,尺寸适配是一个重要的概念,它可以帮助我们在不同屏幕尺寸的设备上正确显示和布局我们的应用程序。本文将介绍如何在鸿蒙开发中实现尺寸适配的方法。
    的头像 发表于 04-10 16:05 626次阅读
    <b class='flag-5'>鸿蒙</b>OS开发学习:【尺寸适配<b class='flag-5'>实现</b>】

    鸿蒙实战开发ArkTS运用:【ai聊天框】

    用一个ArkTS编写的HarmonyOS原生聊天UI框架,提供了开箱即用的聊天对话组件。
    的头像 发表于 03-08 15:38 257次阅读
    <b class='flag-5'>鸿蒙</b>实战开发ArkTS运用:【ai<b class='flag-5'>聊天</b>框】

    鸿蒙实战项目开发:【短信服务】

    送短信的功能。 效果预览 新建联系人 首页 短信页 使用说明: 首页点击创建联系人,弹框输入联系人姓名和电话,点击确定按钮后,联系人列表中添加该联系人; 点击管理,该按钮变成取消,联系人列表
    发表于 03-03 21:29

    鸿蒙实战:HarmonyOS NEXT【城市选择】

    ,通过滑动选择城市首拼,快速定位相关首拼城市。 实现思路 场景:通过AlphabetIndexer实现索引条导航 城市列表中的右侧首拼索引条,通过AlphabetIndexer组件
    发表于 02-29 15:50

    使用CSD检测自电容的方式,可否实现滑动条多点(2点)触摸的检测?为什么?

    使用CSD检测自电容的方式,可否实现滑动条多点(2点)触摸的检测?为什么? 应用:在一个滑动条上,2个手指距离一定间隙,能否检测到这两个手指各自的位置?
    发表于 02-02 11:20

    何在鸿蒙系统上安装Google Play

    。但是,通过以下简易步骤仍然可以在鸿蒙系统上安装Google Play。 了解鸿蒙系统和Google Play之间的不兼容性 鸿蒙系统的背景介绍 鸿蒙系统是华为自主研发的操作系统,致力
    的头像 发表于 01-31 17:13 3694次阅读

    滑动变阻器的作用 滑动变阻器怎么看电阻变大变小

    滑动变阻器是一种用于调节电阻大小的电子元件,通常由一个可滑动的滑片连接两个电阻器端点,通过改变滑片的位置,可以实现电阻值的变化。 滑动变阻器的作用:
    的头像 发表于 01-30 11:35 862次阅读

    滑动变阻器的调节方法有哪些?

    滑动变阻器的调节方法有哪些? 滑动变阻器是一种调节电阻值的装置,可以通过滑动变阻器来调整电路中的电阻,从而实现对电流、电压和功率等电路参数的调节。
    的头像 发表于 01-18 15:28 748次阅读

    labview多列列表框写入数据

    LabVIEW是一种图形化编程环境,广泛应用于工业自动化领域。多列列表框是LabVIEW中常用的界面控件,可用于显示和编辑多个列的数据。本文将详细介绍如何通过LabVIEW实现多列列表框数据的写入
    的头像 发表于 12-26 13:49 1547次阅读

    python列表和数组的区别

    Python是一种功能强大的编程语言,为开发者提供了许多数据结构来处理和操作数据。其中,列表和数组是常用的数据结构,用于存储和组织一系列元素。在本文中,我们将详细比较Python中的列表和数
    的头像 发表于 11-21 15:13 843次阅读

    何在AT32 MCU上使用FPU功能

    何在AT32 MCU上使用FPU功能
    的头像 发表于 11-01 17:18 3655次阅读
    如<b class='flag-5'>何在</b>AT32 MCU上使用FPU<b class='flag-5'>功能</b>

    恒讯科技分析:如何在Linux上使用rm命令删除文件和目录?

    本指南展示了如何在Linux中使用rm命令行删除文件、目录和其他内容?
    的头像 发表于 06-09 17:02 853次阅读

    鸿蒙上实现文件上传功能

    此帖主要讲解通过开发文档示例代码写一个完整 Demo,方便初学者理解开发文档内容。
    的头像 发表于 05-22 10:51 2803次阅读
    <b class='flag-5'>鸿蒙上</b><b class='flag-5'>实现</b>文件上传<b class='flag-5'>功能</b>

    何在Proteus中实现单片机的串口调试功能呢?

    何在Proteus中实现单片机的串口调试功能呢?有什么方法吗?
    发表于 04-26 15:56