当前位置: 首页 > 科技观察

HarmonyOSArkUI滑动删除聊天列表(TS)

时间:2023-03-13 15:15:22 科技观察

更多内容请访问:https://harmonyos.51cto.com,与华为官方共同打造的鸿蒙技术社区本项目基于ArkUI中的TS扩展声明式开发范式语法和概念请参考官网官方文档地址:TSextension-baseddeclarativedevelopmentparadigm1、TSextension-baseddeclarativedevelopmentparadigm2本文介绍列表滑动删除:只允许一项在列表中滑出如果有打开的项目,点击或滑动其他项目会关闭打开的项目点击删除刷新列表界面定义组件侧滑菜单(JS)】【HarmonyOSArkUI聊天列表滑动删除(TS)】效果演示主要知识点滑动容器组件(Scroll)和触摸事件(onTouch)实现思路理解主要逻辑。1、item布局主要使用scroll包裹内容,scroll设置为水平滑动(部分代码)....scroll(){Row(){Text('contentdata').width('100%').height(65)Button(){Text('Delete')}.width(100).height(65)}}.scrollable(ScrollDirection.Horizo??ntal)//设置水平滑动.....2、ScrollcontainertoScrollcontainer只有一种方法用于绑定滑动组件的controller:滑动到指定位置scrollToscrollTo(value:{xOffset:number|string,yOffset:number|string,animation?:{duration:number,曲线:曲线}});看源码知道可以设置动画时间。注意:目前好像不能设置超过300毫秒的时间。可以设置下来(部分代码)....//初始化控制器privatescroller=newScroller()Scroll(scroller){//控制器绑定到滑动容器Row(){Text('contentdata').width('100%').height(65)Button(){Text('Delete')}.width(100).height(65)}}.scrollable(ScrollDirection.Horizo??ntal)Button(){Text('点击返回原位')}.onClick(()=>{scroller.scrollTo({xOffset:0,yOffset:0,animation:{duration:200,curve:Curve.Linear}})})。..3。根据移动设置触摸事件的偏移量,如果判断大于删除布局宽度的一半:打开删除布局(部分代码).....//初始化控制器privatescroller=newScroller()//按下x轴坐标privatedownX=0//删除按钮的宽度privatedeleteWidth=100Scroll(scroller){//控制器绑定滑动容器Row(){Text('contentdata').width('100%').height(65)Button(){文本('Delete')}.width(this.deleteWidth).height(65)}}.scrollable(ScrollDirection.Horizo??ntal).onTouch((event:TouchEvent)=>{//Touch事件//判断switch(event.type){caseTouchType.Down://touchpress//记录按下的x轴坐标this.downX=event.touches[0].xbreakcaseTouchType.Up://touchlift/touchlift,根据的总偏移量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)}//滑动指定位置并设置animationitem.scroller.scrollTo({xOffset:toxOffset,yOffset:0,animation:{duration:300,curve:Curve.Linear}})//重置按下的x轴坐标this.downX=0break}}).....4、使用列表加载需要注意的要点:需要为每个item绑定一个controller,这样就可以控制相应的项目打开或关闭。打开的item记录数据,点击内容或删除,滑动其他item:如果有打开的item,close下面是完整代码,直接粘贴运行即可classTestData{content:stringscroller:Scrollerconstructor(content:string,scroller:Scroller){this.content=contentthis.scroller=scroller}}@Entry@ComponentstructSlidingDeleteList{//删除按钮宽度privatedeleteWidth=100//按下的x轴坐标privatedownX=0//删除的数据已经打开privateopenDeleteData:TestData=null//测试数据@StateprivatelistData:Array=[{content:'contentdata1',scroller:newScroller()},{content:'contentdata2',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=nullreturn}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.Horizo??ntal).onTouch((event:TouchEvent)=>{//Touch事件//判断删除组件是否打开,打开则关闭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//Touchdown//记录按下的x轴坐标this.downX=event.touches[0].xbreakcaseTouchType.Up://Touchup//Touchup,根据x轴的总偏移量,判断是否打开deleteletxOffset=event.touches[0].x-this.downX//防止消耗点击事件if(xOffset==0){return}//滑动到x轴的位置vartoxOffset=0//打开删除的对象,设置为nullthis.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=0break}})}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还不是很完善,跟进官网更新,有以下几点需要优化:TSinArkUI没有JS中新的槽概念,也可以直接封装成组件,对外提供两个接口,一个是传入内容布局,一个是操作布局,就像安卓的组件库一样,用户不需要知道内部实施。每天进步一点点,需要付出一点点努力。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区