问题描述
我试图动画片段之间的过渡。我从以下
答案 Android的碎片和动画
I'm trying to animate the transition between fragments. I got the answer from the following
Android Fragments and animation
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();
和我R.anim.slide_in_left
And my R.anim.slide_in_left
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="50%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
但是,当我尝试这一点,表明
But when I tried this it showed
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.BackStackRecord.run(BackStackRecord.java:578)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)
任何想法?当我检查蜂窝API参考翻译
是存在的。我错过了什么?
有动画片段之间的过渡任何其他方式?谢谢
Any ideas? When I checked Honeycomb API reference translate
is there. What did I miss?
Is there any other way to animate the transition between fragments?Thank you
推荐答案
您需要使用新的 android.animation
框架(对象动画)与 FragmentTransaction.setCustomAnimations
以及与 FragmentTransaction.setTransition
。
You need to use the new android.animation
framework (object animators) with FragmentTransaction.setCustomAnimations
as well as with FragmentTransaction.setTransition
.
下面是关于使用 setCustomAnimations
从ApiDemos为例 FragmentHideShow.java
Here's an example on using setCustomAnimations
from ApiDemos' FragmentHideShow.java:
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
和这里是从相关的动画XML的 RES /动画/ fade_in.xml
and here's the relevant animator XML from res/animator/fade_in.xml:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:interpolator/accelerate_quad"
android:valueFrom="0"
android:valueTo="1"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime" />
请注意,您可以使用组合多个动画&LT;集&gt;
,就像你可以用旧的动画框架
Note that you can combine multiple animators using <set>
, just as you could with the older animation framework.
修改:既然乡亲都问滑入/滑出,我会在这里发表评论
EDIT: Since folks are asking about slide-in/slide-out, I'll comment on that here.
您当然可以设置动画 translationX
, translationY
, X
和是
性质,但一般的幻灯片涉及到从屏幕外的动画内容。据我知道有没有使用相对值任何转换属性。但是,这并没有从自己写这些prevent你。请记住,物业动画只要求你正在动画(在这种情况下视图)对象getter和setter方法,这样你就可以只创建自己的 getXFraction
和 setXFraction
您的视图子类的方法,像这样:
You can of course animate the translationX
, translationY
, x
, and y
properties, but generally slides involve animating content to and from off-screen. As far as I know there aren't any translation properties that use relative values. However, this doesn't prevent you from writing them yourself. Remember that property animations simply require getter and setter methods on the objects you're animating (in this case views), so you can just create your own getXFraction
and setXFraction
methods on your view subclass, like so:
public class MyFrameLayout extends FrameLayout {
...
public float getXFraction() {
return getX() / getWidth(); // TODO: guard divide-by-zero
}
public void setXFraction(float xFraction) {
// TODO: cache width
final int width = getWidth();
setX((width > 0) ? (xFraction * width) : -9999);
}
...
}
现在你可以动画的xFraction属性,像这样:
Now you can animate the 'xFraction' property, like so:
RES /动画/ slide_in.xml
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:valueFrom="-1.0"
android:valueTo="0"
android:propertyName="xFraction"
android:duration="@android:integer/config_mediumAnimTime" />
请注意,如果你在制作动画的对象是不一样的宽度,其母公司,事情会不会看起来很正确的,所以你可能需要调整你的财产实施,以满足你的使用情况。
Note that if the object you're animating in isn't the same width as its parent, things won't look quite right, so you may need to tweak your property implementation to suit your use case.
这篇关于动画片段之间的过渡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!