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

    文章

    9444

    浏览量

    156136
  • API
    API
    +关注

    关注

    2

    文章

    2147

    浏览量

    66229
  • JS
    JS
    +关注

    关注

    0

    文章

    79

    浏览量

    18804
  • 鸿蒙
    +关注

    关注

    60

    文章

    2858

    浏览量

    45349

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    滑动开关详解:类型、规格和应用

    动作实现连接或断开。这篇简要的技术综述将研究滑动开关的工作原理,探讨其主要配置,并概述进行最优选择的电气和机械注意事项。 滑动开关的基础知识 [滑动开关]是一种机电元件,通过线性
    的头像 发表于 10-01 15:14 1741次阅读
    <b class='flag-5'>滑动</b>开关详解:类型、规格和应用

    基于LabVIEW的鼠标滑动方向检测教程

    本篇教程源于一位客户的真实需求,需要LabVIEW能够检测到鼠标滑动的方向,然后通过判断滑动方向处理后续的功能
    的头像 发表于 07-30 13:51 577次阅读
    基于LabVIEW的鼠标<b class='flag-5'>滑动</b>方向检测教程

    【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

    【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿
    的头像 发表于 07-11 18:16 869次阅读
    【HarmonyOS 5】<b class='flag-5'>鸿蒙</b>应用<b class='flag-5'>实现</b>发票扫描、文档扫描输出PDF图片或者表格的<b class='flag-5'>功能</b>

    HarmonyOS NEXT应用元服务常见列表操作二级联动

    导航内容进行展示。在进入页面后,点击左侧分类导航,右侧展示对应导航分类详情列表数据;滑动右侧列表内容,列表标题吸顶展示,左侧对应导航内容则高亮显示。 页面整体结构图 页面效果图
    发表于 07-02 10:29

    鸿蒙ArkTS+ArkUI仿微信消息列表页制作

    \' }) 这里使用了justifyContent属性来进行居中,如果不加这个属性的话,那么100%宽度的row会让文字靠左显示。接下来是显示聊天数据的列表,这里采用ForEach列表渲染来
    发表于 06-30 18:28

    HarmonyOS NEXT应用元服务布局优化长列表使用懒加载与组件复用

    数据如下 可以发现列表滑动时丢帧率明显降低,这是因为,List列表开启了组件复用,不会执行BuildLazyItem这个耗时操作,后续创建新组件节点时,会直接复用缓存区中的节点,这样就大幅节约了组件重新创建的时间。 本文主要引用
    发表于 06-27 16:08

    HarmonyOS实战:Tab顶部滑动悬停功能实现

    日常开发过程中,遇到这种 Scroll 嵌套 List 列表滑动顶部悬停的场景十分常见,在鸿蒙开发时也正好实现了这个功能,本篇文章将带你一步
    的头像 发表于 06-24 17:07 286次阅读

    HarmonyOS实战:快速实现一个上下滚动的广告控件

    上要想实现这样的功能并不容易,那么在鸿蒙上怎么实现这样的功能呢?本篇文章教你使用最简单的方式实现
    的头像 发表于 06-24 17:05 371次阅读

    HarmonyOS实战:实现任意拖动的应用悬浮窗口

    为了增加应用程序功能的丰富性和便利性,很多应用都会提供一个悬浮窗口实现多页面显示。特别是一些性能检测工具,比如 dokit 。在鸿蒙上怎么实现类似的全局悬浮窗口呢?阅读完本篇文章你将学
    的头像 发表于 06-24 17:04 1129次阅读

    鸿蒙5开发宝藏案例分享---长列表性能优化解析

    鸿蒙列表性能优化大揭秘!告别卡顿,实战代码解析来了! 大家好呀~今天在翻鸿蒙开发者文档时,发现了个 性能优化宝藏案例 !官方居然悄悄放出了长列表卡顿的完整解决方案,实测效果炸裂!我连
    发表于 06-12 17:40

    鸿蒙5开发宝藏案例分享---分析帧率问题

    和代码改造方案。我整理了几个高频场景,结合代码讲解,帮你彻底搞定流畅度优化! 一、长列表滑动卡顿优化 问题现象 : “HMOS世界”首页加载1000条数据后,滑动越来越卡,丢帧率达7%。 分析工具
    发表于 06-12 17:07

    鸿蒙Next实现瀑布流布局

    为了实现类似真实瀑布流不断加载新数据的效果,可以结合鸿蒙的 LazyForEach 组件,在滚动到列表底部时触发数据加载逻辑 六、网络权限 // config.json { \"module
    发表于 06-10 14:17

    Get这个秘籍,鸿蒙原生应用页面滑动丝滑无比

    。 华为此次推出的ArkUI与Web页面滑动白块/白屏解决方案,不仅优化了鸿蒙应用的页面加载性能,更显著降低了开发者实现高性能滑动效果的门槛。欢迎更多开发者应用厂商使用和反馈,共同提升
    发表于 03-06 14:41

    HarmonyOS NEXT 原生应用开发:社交聊天对话过程实现

    一、实现思路 本DEMO旨在展示如何在HarmonyOS NEXT平台上,利用ArkTS开发语言构建一个简易的社交聊天对话界面。用户可以在此界面上查看聊天记录,并发送新的消息。此示例中
    发表于 01-07 10:55

    鸿蒙原生页面高性能解决方案上线OpenHarmony社区 助力打造高性能原生应用

    高性能鸿蒙原生应用。 Nodepool:优化页面滑动流畅性Nodepool旨在解决应用页面滑动卡顿问题。开发中,相似页面因业务和代码差异,组件复用性差,引发卡顿、丢帧,影响用户体验。Nodepool通过
    发表于 01-02 18:00