目前,BottomNavigationBarXF 好像不支持 CoordinatorLayout 佈局(BottomNavigationBar是支持的)。能夠用如下比較迂迴的方法實現BottomBar的自動隱藏:ide
一、Touch響應。佈局
以自定義WebView爲例:ui
在HybridWebViewRenderer中添加方法:spa
//... 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中:code
//...
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); } } //...
二、添加BarHide屬性:orm
BottomBarPage中添加BarHide:blog
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中:get
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; }; //... } }