我有一个片段来替换另一个片段.我想指定动画.但动画被忽略了.
transaction.replace(R.id.my_fragment, newFrag); transaction.addToBackStack(null); transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up);
slide_in_up
slide_out_up
我真正想要实现的是让新片段从底部滑入.我的动画被忽略了.什么是缺少的代码?
transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up); transaction.addToBackStack(null); transaction.replace(R.id.my_fragment, newFrag);
slide_in_up
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_longAnimTime" android:fromYDelta="100%p" android:toYDelta="0%p" />
slide_out_up
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_longAnimTime" android:fromYDelta="0%p" android:toYDelta="-100%p" />
slide_in_up的代码:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromYDelta="100%p" android:toYDelta="0%p" /> </set>
slide_in_down的代码:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromYDelta="0%p" android:toYDelta="100%p" /> </set>
slide_out_up的代码:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="0" android:toYDelta="100%" /> </set>
slide_out_down的代码:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="0" android:toYDelta="-100%" /> </set>
然后在你的活动或片段集动画如下:
Fragment fragment = new Fragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_in_down, R.anim.slide_out_down, R.anim.slide_out_up); transaction.replace(container, fragment).commit();
自从提出这个问题以来已经有一段时间了,但这里是其他人来到这里的答案:
e1da是正确的,因为setCustomAnimation()
之前必须调用该呼叫replace()
.否则动画将不会显示.
第二个问题是您可能正在使用无法使用视图动画设置动画的本机片段.
使用以下文件:
slide_in_up.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" > <objectAnimator android:duration="500" android:propertyName="y" android:valueFrom="1280" android:valueTo="0" android:valueType="floatType" /> </set>
slide_out_up.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" > <objectAnimator android:duration="500" android:propertyName="y" android:valueFrom="0" android:valueTo="-1280" android:valueType="floatType" /> </set>
一点解释:
您必须区分一方面支持片段的视图动画和另一方面本机片段的属性动画.
查看动画:
是预备android 3.0的方式来动画视图.此示例代码是slide_in.xml
和用户slide_up.xml
3093402
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_longAnimTime" android:fromYDelta="0%p" android:toYDelta="100%p" />
值得一提的是,您无法使用视图动画制作片段动画.例外是来自支持库(android.support.v4.app.Fragment)的片段.
属性动画
这是在android 3.0之后动画对象的方法.它也被声明为.xml文件,但使用"valueAnimator"标记(objectAnimator扩展valueAnimator).例子就是问题的答案.这是本机片段(android.app.Fragment)可以动画的方式.
也可以看看:
http://developer.android.com/guide/topics/graphics/overview.html
通过动画在活动中交换片段
希望这有帮助,
凯
编辑:正如Raphael Royer-Rivard指出的那样,固定屏幕尺寸是不好的做法.最好使用OS中的常量
getWindowManager().getDefaultDisplay().getMetrics(metrics).xdpi
(参见DisplayMetrics).但我有一段时间没有做任何Android开发,所以我不知道哪一个.