如何在Delphi 11.2 Firemonkey应用中实现滚动时底部栏动画隐藏?
Firemonkey实现滚动时底部栏动画隐藏的方案
Firemonkey没有专门内置实现这种底部栏随滚动隐藏的组件(TMultiView主要用于侧边抽屉导航,不适合这个场景),但可以通过现有组件组合轻松实现需求,核心思路是监听ListView滚动事件,配合Animator组件做平滑动画。
实现步骤与代码示例
假设你的界面包含:
TListView(命名为ListView1):加载大量数据的列表TPanel(命名为BottomPanel):需要隐藏的底部栏TAnimator(命名为Animator1):用于处理平滑动画
1. 初始化底部栏位置
在窗体创建时,确保底部栏初始处于屏幕底部:
procedure TForm1.FormCreate(Sender: TObject); begin BottomPanel.Position.Y := Self.ClientHeight - BottomPanel.Height; end;
2. 监听ListView滚动事件,控制底部栏显示/隐藏
通过OnScroll事件判断滚动方向,触发对应动画:
procedure TForm1.ListView1Scroll(Sender: TObject; const ScrollPos: TPointF); var CurrentScrollPos: Single; ScrollDelta: Single; TargetY: Single; begin static var LastScrollPos: Single := 0; CurrentScrollPos := ScrollPos.Y; ScrollDelta := CurrentScrollPos - LastScrollPos; // 向下滚动(ScrollDelta为正,FMX ListView滚动时Y轴向下递增) if ScrollDelta > 5 then // 设阈值避免微小滚动误触发 begin TargetY := Self.ClientHeight; // 底部栏完全移出屏幕 if BottomPanel.Position.Y < TargetY then Animator1.AnimateFloat(BottomPanel, 'Position.Y', TargetY, 0.3); end // 向上滚动 else if ScrollDelta < -5 then begin TargetY := Self.ClientHeight - BottomPanel.Height; // 底部栏回到原位 if BottomPanel.Position.Y > TargetY then Animator1.AnimateFloat(BottomPanel, 'Position.Y', TargetY, 0.3); end; LastScrollPos := CurrentScrollPos; end;
3. 处理窗口大小变化
防止窗口 resize 时底部栏位置错乱:
procedure TForm1.FormResize(Sender: TObject); begin if BottomPanel.Position.Y > Self.ClientHeight then BottomPanel.Position.Y := Self.ClientHeight; if BottomPanel.Position.Y < Self.ClientHeight - BottomPanel.Height then BottomPanel.Position.Y := Self.ClientHeight - BottomPanel.Height; end;
额外优化建议
- 加入滚动停止延迟显示:用
TTimer组件,在滚动停止1秒后自动显示底部栏,提升用户体验 - 调整动画时长:代码中的
0.3是动画持续秒数,可根据需求修改 - 配合透明度动画:同时动画改变
BottomPanel.Opacity,让过渡更自然
内容的提问来源于stack exchange,提问作者Mockminister
相关产品推荐
相关产品推荐

