我在片段上覆盖自定义动画时出现问题。我在我的主页视图中有三个按钮(第一,第二和第三),当我在这个视图中时,我想在这些视图之间滑动,我需要从左到右和从右到左等滑动动画效果。
例如,我的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。
答案 0 :(得分:1)
通过使用包含片段的ViewPager,您可以实现此目的的最佳方式。我昨天实现了确切的事情,你可以看看this example如何在MvvmCross上使用它。
答案 1 :(得分:1)
我为此尝试过Activity.OverridePendingTransition,但它不起作用。
OverridePendingTransition允许您在当前最高Context
的{{1}}之外启动活动时指定自定义动画。这意味着Activity
方法仅在OverridePendingTransition
或startActivity(Intent)
的一种风格后立即调用,以指定下一步要执行的显式转换动画。因此,当您在finish()
之间滑动时,它无效。
Animator文件夹和Anim fodler之间的区别。
动画资源可以定义两种动画中的一种:Property Animation和View Animation。
物业动画
档案位置:
Fragment
语法:
该文件必须包含单个根元素:Resource/animator/filename.xml
,<set>
或<objectAnimator>
。您可以在<valueAnimator>
元素中将动画元素组合在一起,包括其他<set>
元素。
查看动画
档案位置:
<set>
语法:
该文件必须具有单个根元素:包含组的Resource/anim/filename.xml
,<alpha>
,<scale>
,<translate>
或<rotate>
元素(或其他动画元素(甚至是嵌套的<set>
元素)。
由于您的动画使用<set>
,我建议您将这些translate
文件放在xml
文件夹中。
我只需要覆盖整个应用程序的三个视图no的动画。
由于您的基础Resource/anim
为Activity
,您可以覆盖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