1

我在片段上覆盖自定义动画时遇到问题。我的主页视图上有三个按钮(第一个、第二个和第三个),当我在这个视图中时,我想在这些视图之间滑动,我需要从左到右和从右到左等滑动动画效果。

例如,我的 SecondFragments 如下所示:

[MvxFragment(typeof(MainViewModel), Resource.Id.content_frame, true)]
    public class SecondFragment : BaseFragment<SecondViewModel>, View.IOnTouchListener
    {
        private Easter _easter;
        protected override int FragmentId => Resource.Layout.fragment_second;

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            var view = base.OnCreateView(inflater, container, savedInstanceState);

            _easter = new Easter(new KonamiCode());

            var easyEgg = new CustomEgg("Easy")
                .WatchForSequence(Command.SwipeLeft(), Command.SwipeRight());

            _easter = new Easter(easyEgg);=
            _easter.CommandDetected += cmd => DoSwipe(cmd.Value);

            var coreLayout = view.FindViewById<LinearLayout>(Resource.Id.coreLayout);
            coreLayout?.SetOnTouchListener(this);

            return view;
        }

        private void DoSwipe(string swipeText)
        {
            if (swipeText.Equals("LEFT"))
            {
                Activity.OverridePendingTransition(Resource.Animator.slide_to_right, Resource.Animator.slide_from_left);
            }

            if (swipeText.Equals("RIGHT"))
            {
                Activity.OverridePendingTransition(Resource.Animator.slide_to_left, Resource.Animator.slide_from_right);
            }

            ViewModel.SwipeView(swipeText);
        }

        public bool OnTouch(View v, MotionEvent e)
        {
            _easter.OnTouchEvent(e);
            return true;
        }
    }

方法 ViewModel.SwipeView 看起来像:

public override void SwipeView(string swipeText)
        {
            if (swipeText.Equals("RIGHT"))
            {
                Close(this);
                UserDialogs.Instance.Toast("RIGHT SWIPE!");
                ShowViewModel<FirstViewModel>();
            }

            if (swipeText.Equals("LEFT"))
            {
                Close(this);
                UserDialogs.Instance.Toast("LEFT SWIPE!");
                ShowViewModel<ThirdViewModel>();
            }
        }

我为此尝试了 Activity.OverridePendingTransition 但它不起作用。我用 TransactionManager 尝试了一些东西,但仍然无法正常工作。我只需要为这三个视图覆盖整个应用程序的动画。

例如,我的测试项目在github上。

4

2 回答 2

1

您可以实现此目的的最佳方法是使用包含您的片段的 ViewPager。我昨天实现了确切的东西,你可以看看这个例子,了解如何将它与 MvvmCross 一起使用。

于 2017-07-20T13:08:27.107 回答
1

我为此尝试了 Activity.OverridePendingTransition 但它不起作用。

OverridePendingTransitionContext允许您在从当前顶部启动活动时指定自定义动画Activity。这意味着OverridePendingTransition方法在其中一种风格之后立即调用,startActivity(Intent)或者finish()指定一个明确的过渡动画接下来执行。因此,当您在它们之间滑动时Fragment,它没有任何效果。

Animator 文件夹和 Anim 文件夹之间的区别。

动画资源可以定义两种类型的动画之一:Property AnimationView Animation

  1. 属性动画

    文件位置:

    Resource/animator/filename.xml
    

    句法:

    该文件必须有一个根元素:要么<set><objectAnimator><valueAnimator>。您可以在元素内将动画元素组合在一起<set>,包括其他<set>元素。

  2. 查看动画

    文件位置:

    Resource/anim/filename.xml
    

    句法:

    该文件必须有一个根元素:一个<alpha>, <scale>, <translate>, <rotate>, 或<set>包含一组(或多组)其他动画元素(甚至是嵌套<set>元素)的元素。

由于您的动画使用translate,我建议您将这些xml文件放在Resource/anim文件夹中。

我只需要为这三个视图覆盖整个应用程序的动画。

由于您的基础ActivityMvxCachingFragmentCompatActivityas,您可以覆盖 OnBeforeFragmentChanging方法来设置自定义过渡动画。

public override void OnBeforeFragmentChanging(MvvmCross.Droid.Shared.Caching.IMvxCachedFragmentInfo fragmentInfo, Android.Support.V4.App.FragmentTransaction transaction)
{
    //Replace this animation with your own animation.
    transaction.SetCustomAnimations(
        // Your entrance animation xml reference
        Resource.Animation.abc_fade_in,
        // Your exit animation xml reference
        Resource.Animation.abc_fade_out,
        Resource.Animation.abc_fade_in,
        Resource.Animation.abc_fade_out);

        base.OnBeforeFragmentChanging(fragmentInfo, transaction);
}

SetCustomAnimations为在此事务中进入和退出的片段设置要运行的特定动画资源。popEnter 和 popExit 动画将播放进入/退出操作,特别是在弹出返回堆栈时。

FragmentTransaction setCustomAnimations (int enter, 
            int exit, 
            int popEnter, 
            int popExit) 

编辑 :

每次滑动之间的自定义动画Fragment,对于每一次Fragment,您都可以像这样自定义动画:

[MvxFragment(typeof(MainViewModel), Resource.Id.content_frame, true)]
public class SecondFragment : BaseFragment<SecondViewModel>, View.IOnTouchListener
{ 
    private void DoSwipe(string swipeText)
    {
        if (swipeText.Equals("LEFT"))
        {
            FragmentManager.BeginTransaction()
                .SetCustomAnimations(Resource.Animation.slide_from_left, Resource.Animation.slide_from_right)
                .Replace(Resource.Id.content_frame,ThirdFragment.NewInstance(null))
                .Commit();
        }
        if (swipeText.Equals("RIGHT"))
        {
            ...
        }

        ViewModel.SwipeView(swipeText);
    }
}
于 2017-07-21T06:15:12.443 回答