Android片段和动画

ale*_*lom 260 android android-fragments android-3.0-honeycomb

你应该如何实现那种例如Honeycomb Gmail客户端使用的滑动?

可以TransactionManager通过添加和删除片段自动处理这个,由于模拟器是幻灯片,所以很难测试这个:)

Ret*_*ier 381

要为片段之间的过渡设置动画,或者为显示或隐藏片段的过程设置动画,您可以使用它Fragment Manager来创建Fragment Transaction.

在每个片段事务处理中,您可以指定分别用于显示和隐藏的输入和输出动画(或者在使用替换时两者都指定).

下面的代码显示了如何通过滑出一个片段并将另一个片段滑动到其中来替换片段.

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();
Run Code Online (Sandbox Code Playgroud)

为了实现隐藏或显示片段的相同功能,您只需调用ft.showft.hide传递片段即可分别显示或隐藏.

作为参考,XML动画定义将使用objectAnimator标记.slide_in_left的示例可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试这个时它显示*RuntimeException:未知的动画师名称:translate*. (57认同)
  • 这帮了很多忙.我在正确的轨道上,但只是没有完全在那里.对于其他读者,您还可以将android:interpolator作为属性,指定您喜欢的属性(例如"@android:interpolator/linear").它默认为"@android:interpolator/accelerate_decelerate". (7认同)
  • 我使用兼容性API来定位API级别7.有没有办法为片段制作动画片? (6认同)
  • @JarrodSmith你可以尝试使用像[NineOldAndroids](http://nineoldandroids.com/)这样的兼容库来将Honeycomb API带到Eclair. (5认同)
  • 确保使用一组objectAnimator定义而不是旧动画定义构造slide_in_left和right中定义的动画. (3认同)

小智 240

如果您不必使用支持库,那么请查看Roman的答案.

但是如果你想使用支持库,你必须使用旧的动画框架,如下所述.

在咨询了Retoblindstuff的答案后,我得到了以下代码.

该片段似乎从右侧滑入滑出向左按下时回来.

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);

CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)

订单很重要.这意味着你必须调用setCustomAnimations()之前replace()或动画将不会生效!

接下来,这些文件必须放在res/anim文件夹中.

enter.xml:

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)

exit.xml:

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)

pop_enter.xml:

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="-100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)

pop_exit.xml:

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)

动画的持续时间可以更改为任何默认值,如@android:integer/config_shortAnimTime任何其他数字.

请注意,如果在片段替换之间发生配置更改(例如旋转),则不会对后退操作进行动画处理.这是一个记录在案的错误,它仍然存在于支持库的rev 20中.

  • 这才救我.注意,注意**顺序很重要**,这当然是我第一次错过了.这意味着您必须在replace()之前调用setCustomAnimations(). (47认同)
  • 我试图在我的片段上实现.我写了你提到的所有东西,但是logcat说:unknow animator name translate我怎样才能克服这个问题?顺便说一句,我在导航抽屉(滑动菜单)上调用我的片段 (3认同)

Gow*_*n M 21

我强烈建议你使用它而不是创建动画文件,因为它是一个更好的解决方案.Android Studio已经提供了默认设置, animation您无需创建任何新的XML文件即可使用.动画的名称是android.R.anim.slide_in_leftandroid.R.anim.slide_out_right,您可以按如下方式使用它们:

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right);

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();              
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述


mar*_*ski 5

我修改过的支持库支持使用View动画(即<translate>, <rotate>)和Object Animators(即<objectAnimator>)进行片段转换.它是用NineOldAndroids实现的.有关详细信息,请参阅github上的文档.