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

    文章

    8593

    浏览量

    151120
  • API
    API
    +关注

    关注

    2

    文章

    1499

    浏览量

    61991
  • JS
    JS
    +关注

    关注

    0

    文章

    78

    浏览量

    18103
  • 鸿蒙
    +关注

    关注

    57

    文章

    2350

    浏览量

    42842

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

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

收藏 人收藏

    评论

    相关推荐

    Taro 鸿蒙技术内幕系列(二):如何让 W3C 标准的 CSS跑在鸿蒙上

    作者:京东零售 马银涛   基于 Taro 打造的京东鸿蒙 APP 已跟随鸿蒙 Next 系统公测,本系列文章将深入解析 Taro 如何实现使用 React 开发高性能鸿蒙应用的技术内
    的头像 发表于 10-31 10:54 164次阅读
    Taro <b class='flag-5'>鸿蒙</b>技术内幕系列(二):如何让 W3C 标准的 CSS跑在<b class='flag-5'>鸿蒙上</b>

    滑动变阻器的作用是什么?

    的电压大小。这对于实现对电子设备的精确控制具有重要意义。 滑动变阻器还可以用于实现电路的分压功能,在某些电路中,需要将电源电压分成几个不同的电压值。这时,可以使用
    发表于 10-08 16:39

    滑动变阻器调到最大阻值的目的

    滑动变阻器是一种常用的电子元件,其主要功能是通过改变电阻值来控制电路中的电流。在许多电子设备和实验中,滑动变阻器的调节能力对于实现精确控制和优化性能至关重要。本文将探讨
    的头像 发表于 08-05 11:03 2468次阅读

    鸿蒙ArkTS声明式开发:跨平台支持列表【触摸事件】

    当手指在组件上按下、滑动、抬起时触发。
    的头像 发表于 05-27 09:34 489次阅读
    <b class='flag-5'>鸿蒙</b>ArkTS声明式开发:跨平台支持<b class='flag-5'>列表</b>【触摸事件】

    鸿蒙ArkUI开发:常用布局【 创建列表(List)】

    列表容器是为了高效处理长列表的容器,能支持横向、竖向滚动,数据分组,分组头悬浮等功能
    的头像 发表于 05-15 15:30 783次阅读
    <b class='flag-5'>鸿蒙</b>ArkUI开发:常用布局【 创建<b class='flag-5'>列表</b>(List)】

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

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

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

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

    访问控制列表什么?ACL的功能特点

    (如文件、目录、网络端口、服务等)执行何种操作(如读取、写入、执行、删除、修改等)。其主要目的是确保信息系统的安全性,防止未经授权的访问、篡改或破坏。 以下是访问控制功能(ACL)的主要特点和组成部分: 1. 主体(Subject):访问资源的实体,通常包括用户、进程、设
    的头像 发表于 04-03 13:57 754次阅读

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

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

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

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

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

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

    何在鸿蒙系统上安装Google Play

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

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

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

    鸿蒙ArkUI开发-实现增删Tab页签

    本文以浏览器中增加或删除页签为例,实现Tabs中页签的增删功能
    的头像 发表于 01-29 18:43 1581次阅读
    <b class='flag-5'>鸿蒙</b>ArkUI开发-<b class='flag-5'>实现</b>增删Tab页签

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

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