Mvvmcross Android Fragment(ShowViewModel)自定义动画效果(滑动)

时间:2017-07-20 12:59:32

标签: android-fragments xamarin xamarin.android mvvmcross fragment-transitions

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

例如,我的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,但仍然无法正常工作。我只需要覆盖整个应用程序的三个视图no的动画。

例如,我的测试项目是github上的HERE

2 个答案:

答案 0 :(得分:1)

通过使用包含片段的ViewPager,您可以实现此目的的最佳方式。我昨天实现了确切的事情,你可以看看this example如何在MvvmCross上使用它。

答案 1 :(得分:1)

  

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

OverridePendingTransition允许您在当前最高Context的{​​{1}}之外启动活动时指定自定义动画。这意味着Activity方法仅在OverridePendingTransitionstartActivity(Intent)的一种风格后立即调用,以指定下一步要执行的显式转换动画。因此,当您在finish()之间滑动时,它无效。

  

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

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

  1. 物业动画

    档案位置:

    Fragment

    语法:

    该文件必须包含单个根元素:Resource/animator/filename.xml <set><objectAnimator>。您可以在<valueAnimator>元素中将动画元素组合在一起,包括其他<set>元素。

  2. 查看动画

    档案位置:

    <set>

    语法:

    该文件必须具有单个根元素:包含组的Resource/anim/filename.xml <alpha><scale><translate><rotate>元素(或其他动画元素(甚至是嵌套的<set>元素)。

  3. 由于您的动画使用<set>,我建议您将这些translate文件放在xml文件夹中。

      

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

    由于您的基础Resource/animActivity,您可以覆盖MvxCachingFragmentCompatActivityas方法来设置自定义转换动画。

    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); } 设置特定的动画资源,以便为在此事务中进入和退出的片段运行。弹出后退堆栈时,popEnter和popExit动画将专门用于进入/退出操作。

    SetCustomAnimations

    编辑:

    FragmentTransaction setCustomAnimations (int enter, int exit, int popEnter, int popExit) 之间每次滑动的自定义动画,对于每个Fragment,您可以自定义这样的动画:

    Fragment