更多内容请访问:Harmonyos技术社区https://harmonyos.51cto.com与ListContainer列表组件,这是一个用于呈现连续的、多行数据的组件。它继承自ComponentContainer,所以它是一个使用BaseItemProvider来存储对象的容器组件。下面简单介绍一下ListContainer的基本用法:1、在布局文件中声明ListContainer控件;2.为列表控件定义适配器ListItemProvider;3、为Ability中的ListContainer设置数据;只需要三步就可以实现最基本的列表效果,这里就不贴代码了。官方文档有更详细的描述。本文着重分析如何通过自定义ListContainer来实现子组件圆弧排列的效果,随着半径和镜像距离的变化,子组件的布局也是不断变化的,效果如下:因为子组件ListContainer的默认是直线排列的,可以通过设置LayoutManager(布局管理器)改变子组件的排列方式,但是官方只提供了TableLayoutManager(网格)和DirectionalLayoutManager(线性)这两个布局管理器显然不能满足需求,那么试想自定义一个TurnLayoutManager继承DirectionalLayoutManager,然后重写相关方法重新排列子组件:然而,事情并没有想象的那么简单,DirectionalLayoutManager并没有相应的方法,它的父类也没有LayoutManager,惊不惊喜?!publicabstractclassLayoutManager{publicLayoutManager(){thrownewRuntimeException("Stub!");}publicvoidsetOrientation(intorientation){thrownewRuntimeException("Stub!");}publicintgetOrientation(){thrownewRuntimeException("Stub!");}}但令人欣慰的是ListContainer不必设置layoutmanagersubcomponents来显示,所以一个脑海中闪过一个大胆的想法:为什么不从ListContainer本身入手,继承自自定义的TurnListContainer类ListContainer,因为ListContainer继承自ComponentContainer,可以在onArrange()回调方法中修改子组件定位达到想要的效果,废话少说,直接做:1.实现ComponentContainer.ArrangeListener接口,重写onArrange()方法,在该方法中计算圆心,x,y坐标偏移(列表在垂直方向计算x轴偏移量,在水平方向计算y轴偏移量)@OverridepublicvoidonArrange(){//计算圆心this.center=deriveCenter(gravity,getOrientation(),radius,peekDistance,center);//设置子组件偏移setChildOffsets();}2.调用child.arrange()方法修改子组件的位置(因为本文重点讲解自定义ListContainer遇到的问题,所以圆心和子组件坐标的计算过程就不详述了,熟悉三角函数就容易理解)publicvoidsetChildOffsetsVertical(){//修改每个子组件的位置for(intii=0;ii
