android - Xamarin.Forms:如何在 Android 上禁用箭头到汉堡包的过渡动画?

标签 android animation xamarin.forms hamburger-menu

我创建了一个使用 Xamarin.Forms 的基本示例应用,我试图在其中重新生成一个 UI,如 Twitter 或 Instagram:

  • 一个MasterDetail页面作为主页面,其中默认的“汉堡包”图标 替换为自定义图标
  • “底部”TabbedPage作为 MasterDetail 页面的详细信息
  • 允许在 TabbedPage 中实现顶部标签的控件
  • ContentPages 托管在 NavigationPage 中 TabbedPage 的标签

因此,我的应用的页面架构如下所示:

|-- MasterDetailPage
..|--TabbedPage
....|-- NavigationPage
......|-- ContentPage

为了实现这一点,我使用了:

  • Naxam BottomTabedPage , 在 Android 上实现“底部”TabbedPage(如 BottomNavigationView)
  • 同步融合 SfTabView控制实现“顶部”选项卡
  • 一个自定义渲染器,用于管理自定义图标在主级别上作为“汉堡包”图标以及子级别上的“箭头”图标的使用

这个渲染器看起来像这样:

public class CustomNavigationPageRenderer : MasterDetailPageRenderer
{
    protected override void OnLayout(bool changed, int l, int t, int r, int b)
    {
        base.OnLayout(changed, l, t, r, b);
        var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);

        for (var i = 0; i < toolbar.ChildCount; i++)
        {
            var imageButton = toolbar.GetChildAt(i) as ImageButton;
            var drawerArrow = imageButton?.Drawable as DrawerArrowDrawable;
            if (drawerArrow == null)
                continue;

            bool displayBack = false;
            var app = Xamarin.Forms.Application.Current;
            //var navPage = ((app.MainPage.Navigation.ModalStack[0] as MasterDetailPage).Detail as NavigationPage);
            var detailPage = (app.MainPage as MasterDetailPage).Detail;
            if (detailPage.GetType() == typeof(BottomTp.Views.NaxamMainPage))
            {
                var tabPage = detailPage as BottomTabbedPage;
                var curPage = tabPage.CurrentPage;
                var navPageLevel = curPage.Navigation.NavigationStack.Count;
                if (navPageLevel > 1)
                    displayBack = true;
            }

            if (!displayBack)
                ChangeIcon(imageButton, Resource.Drawable.icon);
        }
    }

    private void ChangeIcon(ImageButton imageButton, int id)
    {
        if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
            imageButton.SetImageDrawable(Context.GetDrawable(id));
        imageButton.SetImageResource(id);
    }
}

这很好用,但是当我“返回”主页时,最后一个问题:

  • 有默认的从箭头到“汉堡包”图标的过渡动画
  • 在此之后,“汉堡包”图标将替换为我的自定义图标

这是一个简短的动画来说明这个问题:

enter image description here

有没有办法停用此动画?我该如何解决这个问题?

最佳答案

您需要使用自定义的 NavigationPage。这是我的 demo基于你的。

实现它需要三个步骤:

1) 添加一个名为CustomControl的文件夹,创建一个继承自NavigationPage的类MyNavigationPage:

namespace BottomTp.CustomControl
{
    public class MyNavigationPage : NavigationPage
    {
        public MyNavigationPage() { }
        public MyNavigationPage(Page root) : base(root) { }
    }
}

2) 更改 NaxamMainPage.xaml 文件中的标签,

在您的 naxam:BottomTabbedPage 标签中添加 xmlns:controls="clr-namespace:BottomTp.CustomControl;assembly=BottomTp",然后更改您的 NavigationPage 标记到 controls:MyNavigationPage:

<controls:MyNavigationPage Title="Browse" Icon="md-view-list"
                x:Name="NP1">
    <x:Arguments>
        <views:SfItemsPage   />
    </x:Arguments>
</controls:MyNavigationPage>
<controls:MyNavigationPage Title="About" Icon="md-help"
                x:Name="NP2">
    <x:Arguments>
        <views:AboutPage />
    </x:Arguments>
</controls:MyNavigationPage>

3) 在 Android 平台上创建自定义渲染 MyCustomNavigationPageRenderer:

[assembly: ExportRenderer(typeof(MyNavigationPage), typeof(MyCustomNavigationPageRenderer))]
namespace BottomTp.Droid.Renderers
{
    class MyCustomNavigationPageRenderer : NavigationPageRenderer
    {
        public MyCustomNavigationPageRenderer(Context c) : base(c)
        { }

        protected override Task<bool> OnPopToRootAsync(Page page, bool animated)
        {
            return base.OnPopToRootAsync(page, false);
        }

        protected override Task<bool> OnPopViewAsync(Page page, bool animated)
        {
            return base.OnPopViewAsync(page, false);
        }

        protected override Task<bool> OnPushAsync(Page view, bool animated)
        {
            return base.OnPushAsync(view, false);
        }

    }
}

关于android - Xamarin.Forms:如何在 Android 上禁用箭头到汉堡包的过渡动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49904575/

相关文章:

java - 如何在Android中使用Settings.Global类

android - 使用 Gradle 插件 v4.10.1 重命名 Apk

java - 进度条没有动画

javascript - 如何保持动画 CSS 的最终状态并删除动画属性?

xamarin - 如何更改 Xamarin Forms 中的文本颜色状态栏?

c# - 是否可以在包含异步 lambda 的命令中对异常进行单元测试?

c# - DidReceiveRemoteNotification 未在后台调用 - Xamarin iOS - 推送通知

android - 根据我对 Ejabberd 的请求获取 SSL 相关错误

使用数据绑定(bind)时 Android EditText 不更新

ios - 偏移不会在onTapGesture之后重置-SwiftUI