我想用动画替换片段,但每次都必须是动态的,即它将从我点击屏幕的点开始,但fragmentTransaction.setCustomAnimations
方法使用anim文件夹中定义的预定义动画,如这样:
fragmentTransaction.setCustomAnimations(R.anim.bounce, R.anim.bounce);
我创建ScaleAnimation
的对象以满足我的需要:
ScaleAnimation animation = new ScaleAnimation(fromX,ToX,fromY,toY,pivitX,pivotY);
animation.setDuration(500);
fragmentTransaction.setCustomAnimations
方法不接受scaleAnimation
它只接受int。那么如何在替换片段时获得动态动画。
答案 0 :(得分:1)
您可以创建自定义动画集并使用它们。
创建.xml文件并将其放入' res / anim'文件夹,然后在代码中使用其资源ID:
fragmentTransaction.setCustomAnimations(R.anim.your_animation, R.anim.your_animation);
这是动画的例子:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toXDelta="-10%p"
android:toYDelta="1%p"/>
<scale
android:duration="@android:integer/config_shortAnimTime"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="0.98"
android:toYScale="0.98"/>
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromXDelta="-10%p"
android:fromYDelta="1%p"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:startOffset="@android:integer/config_shortAnimTime"
android:toXDelta="100%p"
android:toYDelta="5%p"/>
<scale
android:duration="@android:integer/config_shortAnimTime"
android:fromXScale="0.98"
android:fromYScale="0.98"
android:startOffset="@android:integer/config_shortAnimTime"
android:toXScale="0.9"
android:toYScale="0.9"/>
</set>
答案 1 :(得分:0)
XML中带有translate
标记的片段动画无法通过fragmentTransaction.setCustomAnimations()
生效。这将导致java.lang.RuntimeException: Unknown animator name: translate
。有关详细信息,请参阅this帖子。
尝试使用objectAnimator
代替。您可以使用动画xml实现缩放动画,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="200dp" android:valueTo="0dp"
android:valueType="floatType"
android:propertyName="translationY"
android:duration="@android:integer/config_longAnimTime" />
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0.0" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_longAnimTime"/>
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0.5" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="scaleX"
android:duration="@android:integer/config_longAnimTime"/>
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0.5" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="scaleY"
android:duration="@android:integer/config_longAnimTime"/>
</set>
键值为android:propertyName
,您必须设置scaleX
和/或scaleY
。现在,您可以将此xml与fragmentTransaction.setCustomAnimations()
一起使用。