如何为TabBar添加圆角效果及阴影
实现自定义凸起式底部TabBar方案
以下是针对你需求的几种可行实现思路,适配Xamarin/Xamarin.Forms/.NET MAUI场景:
手动构建跨平台自定义TabBar
放弃系统默认TabBar,用Grid+ContentView手动搭建底部导航栏:- 把Grid分成5列,中间列预留更大空间放置凸起按钮
- 给中间按钮设置圆形背景、向上的Margin实现凸起效果,绑定点击事件跳转页面
- 其他列放置图标+文本组合控件,通过绑定选中状态切换字体/图标颜色
Android平台原生定制
基于系统TabLayout做扩展,通过自定义Renderer实现:- 拦截TabBar的中间Tab,给它设置自定义View
- 通过
TranslationY属性让自定义View向上偏移,形成凸起 - 单独处理中间按钮的点击逻辑,避免和系统Tab切换冲突
[assembly: ExportRenderer(typeof(CustomTabbedPage), typeof(CustomTabbedPageRenderer))] namespace YourApp.Droid { public class CustomTabbedPageRenderer : TabbedPageRenderer { protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e) { base.OnElementChanged(e); if (ViewGroup?.GetChildAt(1) is TabLayout tabLayout) { var middleTab = tabLayout.GetTabAt(2); // 假设中间是第3个Tab索引 if (middleTab != null) { var customTabView = LayoutInflater.From(Context).Inflate(Resource.Layout.MiddleTab, null); middleTab.SetCustomView(customTabView); customTabView.TranslationY = -30; // 向上偏移30dp,按需调整 customTabView.Click += (s, args) => ((CustomTabbedPage)Element).NavigateToMiddlePage(); } } } } }
- iOS平台原生定制
自定义UITabBarController的Renderer,添加独立的凸起按钮:- 在TabBar上方添加一个圆形UIButton,调整位置让它部分覆盖TabBar形成凸起
- 设置按钮的圆角、背景色和图标,绑定点击事件切换到目标页面
- 隐藏系统默认的中间TabItem,避免交互冲突
[assembly: ExportRenderer(typeof(CustomTabbedPage), typeof(CustomTabbedPageRenderer))] namespace YourApp.iOS { public class CustomTabbedPageRenderer : TabbedPageRenderer { private UIButton _middleButton; public override void ViewDidLoad() { base.ViewDidLoad(); AddMiddleButton(); } private void AddMiddleButton() { _middleButton = new UIButton(UIButtonType.Custom) { Frame = new CGRect(View.Bounds.Width / 2 - 35, View.Bounds.Height - 100, 70, 70), Layer = { CornerRadius = 35 }, BackgroundColor = UIColor.SystemBlue }; _middleButton.SetImage(UIImage.FromBundle("plus_icon"), UIControlState.Normal); _middleButton.AddTarget(this, new ObjCRuntime.Selector("OnMiddleButtonTap"), UIControlEvent.TouchUpInside); View.AddSubview(_middleButton); } [ObjCRuntime.Export("OnMiddleButtonTap")] private void OnMiddleButtonTap() { SelectedIndex = 2; // 切换到中间页面索引 } } }
- MAUI Shell快速实现
如果用.NET MAUI,可以直接在Shell的TabBar中给中间Tab设置自定义内容:
<TabBar> <Tab Title="首页" Icon="home"> <ShellContent ContentTemplate="{DataTemplate views:HomePage}" /> </Tab> <Tab Title="消息" Icon="message"> <ShellContent ContentTemplate="{DataTemplate views:MessagePage}" /> </Tab> <Tab> <ShellContent> <Button WidthRequest="70" HeightRequest="70" CornerRadius="35" BackgroundColor="#007AFF" ImageSource="plus" Command="{Binding GoToAddPageCommand}" /> </ShellContent> </Tab> <Tab Title="我的" Icon="profile"> <ShellContent ContentTemplate="{DataTemplate views:ProfilePage}" /> </Tab> </TabBar>
内容的提问来源于stack exchange,提问作者diukin
相关产品推荐
相关产品推荐

