我想让中间面板支持“折叠/展开”。折叠时高度收成 0;展开时恢复为上一次的实际高度(不是固定值)。要怎么写?
我想让中间面板支持“折叠/展开”。折叠时高度收成 0;展开时恢复为上一次的实际高度(不是固定值)。要怎么写?
在 HarmonyOS 中,可通过 Panel 组件结合状态管理实现动态高度的可折叠面板。以下为完整代码示例:
// 使用 Panel 和状态管理实现
public class ExpandablePanelAbilitySlice extends AbilitySlice {
private Panel panel;
private float lastHeight = 200; // 默认初始高度
private boolean isFirstExpand = true;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
DirectionalLayout rootLayout = new DirectionalLayout(this);
// 创建可折叠面板
panel = new Panel(this);
panel.setPanelMode(PanelMode.FOLDABLE);
panel.setMinHeight(0); // 折叠时高度为0
// 面板内容容器(高度随内容自适应)
DirectionalLayout panelContent = new DirectionalLayout(this);
panelContent.setBackground(new ShapeElement(Color.GRAY));
// 在此添加你的实际内容组件...
// 关键:监听面板高度变化
panel.addPanelChangedListener(new Panel.PanelChangedListener() {
@Override
public void onHeightChanged(int height) {
if (panel.isFolding()) return;
lastHeight = height; // 实时记录非折叠状态的高度
}
@Override
public void onExpand() {
// 首次展开使用默认值,后续展开恢复上次高度
if (!isFirstExpand) {
panel.setHeight(lastHeight);
}
isFirstExpand = false;
}
@Override
public void onFold() {
// 折叠时不需特殊处理
}
});
panel.addComponent(panelContent);
rootLayout.addComponent(panel);
super.setUIContent(rootLayout);
}
}lastHeight 变量记录面板展开时的实际高度折叠控制:
setMinHeight(0) 使折叠时高度为0PanelMode.FOLDABLE 启用折叠模式高度恢复机制:
onHeightChanged 回调中实时更新有效高度onExpand 回调中应用上次记录的高度isFirstExpand 标志避免初始状态干扰若需要动画效果,添加以下配置:
panel.setSmoothScroll(true);
panel.setAnimationDuration(300); // 300ms动画panelContent 中的子组件使用 LayoutConfig.MATCH_CONTENTpanel.fold()/panel.expand()此实现满足需求的核心:
11 回答1.2k 阅读
1 回答850 阅读✓ 已解决
1 回答1.1k 阅读
1 回答792 阅读✓ 已解决
2 回答768 阅读
2 回答612 阅读
2 回答601 阅读
记录中间面板的“最近非零高度”;折叠时将其高度设为 0 并触发 ColumnSplit 重建以重新取初始值;展开时再用记录的高度重建。通过切换一个 @State version 分支来“卸载/重建”组件,从而让分割线重新计算。