目前,BottomNavigationBarXF 好像不支持 CoordinatorLayout 布局(BottomNavigationBar是支持的)。可以用以下比较迂回的方法实现BottomBar的自动隐藏:
1、Touch响应。
以自定义WebView为例:
在HybridWebViewRenderer中添加方法:
//... protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e) { base.OnElementChanged(e); if (Control == null) { //... } //... Control.Touch += Control_Touch; //... }
float _startEventY; float _heightChange; private void Control_Touch(object sender, TouchEventArgs e) { var ev = e.Event; MotionEventActions action = ev.Action & MotionEventActions.Mask; switch (action) { case MotionEventActions.Down: _startEventY = ev.GetY(); _heightChange = 0; break; case MotionEventActions.Move: float delta = (ev.GetY() + _heightChange) - _startEventY; Element.TouchScroll(delta); /* var callDialog = new AlertDialog.Builder((Activity)Forms.Context); callDialog.SetMessage(String.Format("scrolling delta is {0}, change {1}, start {2}", delta, _heightChange, _startEventY)); callDialog.SetNegativeButton("Cancel", delegate { }); callDialog.Show(); */ break; } e.Handled = false; }
//...
在HybridWebViewPage中:
//... public HybridWebViewPage(Uri uri) { InitializeComponent(); //... hybridWebView.TouchScroll += WebViewPage_TouchScroll; } //... private void WebViewPage_TouchScroll(float moved) { if (moved < -60) { App.tabbedPage.BarHide?.Invoke(true); } else if (moved > 60) { App.tabbedPage.BarHide?.Invoke(false); } } //...
2、添加BarHide属性:
BottomBarPage中添加BarHide:
public class BottomBarPage : TabbedPage { public enum BarThemeTypes { Light, DarkWithAlpha, DarkWithoutAlpha } public bool FixedMode { get; set; } public BarThemeTypes BarTheme { get; set; } /**/ public static BindableProperty BarHideProperty = BindableProperty.Create(nameof(BarHide), typeof(Action<bool>), typeof(BottomBarPage), null, BindingMode.OneWayToSource); public Action<bool> BarHide { get { return (Action<bool>)GetValue(BarHideProperty); } set { SetValue(BarHideProperty, value); } } public void RaiseCurrentPageChanged() { OnCurrentPageChanged(); } }
BottomBarPageRenderer中:
protected override void OnElementChanged(ElementChangedEventArgs<BottomBarPage> e) { base.OnElementChanged(e); if (e.NewElement != null) { //... Element.BarHide = (isHide) => { if (isHide) { _bottomBar.Hide(false); } else { _bottomBar.Show(false); } }; //... _bottomBar.BarDidHide = (sender, evts) => { _bottomBar.TranslationY = 0; }; //... } }