代码拉取完成,页面将自动刷新
本示例主要介绍了利用panel实现底部面板内嵌套列表,分阶段滑动效果场景。
使用说明
本例涉及的关键特性和实现方案如下:
Panel(this.show) {
// panel内组件内容
}
.miniHeight(MINI_PANEL_HEIGHT) // panel最小高度
.type(PanelType.Foldable)
.mode(this.mode)
.draggable(false) // 关闭拖拽panel
.halfHeight(HALF_PANEL_HEIGHT) // panel一半高度
.onChange((width: number, height: number, mode: PanelMode) => {
switch (mode) {
case PanelMode.Full: {
this.mode = PanelMode.Full;
this.isOpen = true;
break;
}
case PanelMode.Half: {
this.mode = PanelMode.Half;
this.isOpen = false;
break;
}
case PanelMode.Mini: {
this.show = false;
}
}
})
loadMyPanelList() {
List({ initialIndex: 0, scroller: this.listScroller }) {
LazyForEach(this.panelList, (item: PanelDataType) => {
ListItem() {
panelListItem({ desc: item.desc, include: item.include })
}
.width(FULL_SIZE)
}, (item: PanelDataType) => item.desc)
}
...
.enabled(this.isOpen)
}
.onTouch((event?: TouchEvent) => {
// panel展开时滑动事件
if (event) {
switch (event.type) {
case TouchType.Down: {
// 记录手机按下屏幕时的纵坐标
this.yStart = event.touches[0].y;
break;
}
case TouchType.Up: {
break;
}
case TouchType.Move: {
let yEnd: number = event.touches[0].y;
// 判断是上滑还是下滑
if (this.yStart < yEnd) {
// 下滑
this.isUp = false;
// 在手指下滑且panel内列表达到顶部的情况下,panel回到half模式
if (this.startIndex === 0 && this.isUp === false) {
this.mode = PanelMode.Half;
}
return;
} else {
// 上滑
this.isUp = true;
return;
}
}
}
}
})
本示例使用了LazyForEach进行数据懒加载,List布局时会根据可视区域按需创建ListItem组件,并在ListItem滑出可视区域外时销毁以降低内存占用。
bottompanelsilde // har类型
|---src/main/ets/components
| |---Component // 自定义组件
|---src/main/ets/view
| |---BottomPanelSilde.ets // panel嵌套列表滑动界面
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。