Android FragmentTransaction自定义动画(未知的动画师名称:翻译)


68

我正在尝试使用自定义动画来处理片段。

我已按照在线教程进行操作,但出现以下错误:

java.lang.RuntimeException:未知的动画制作者名称:翻译

动画的XML如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
    android:fromXDelta="100%"
    android:toXDelta="0"
    android:duration="300" />
</set>

Java文件如下所示:

public void goCategory(View v) {        
    FragmentTransaction ft = fm.beginTransaction();     
    ft.setCustomAnimations(R.animator.anim_in_left, R.animator.anim_out_left);              
    ft.show(fragment);
    ft.commit();
}

我在理解其他线程中的解决方案时遇到了麻烦。如果有人能为我哑巴,我将非常感激。


如果您将动画与Fragment支持库版本一起使用,则可能是您的问题。
type-a1pha

Answers:


112

它不起作用,您应该使用对象动画师

动画师/slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="1000"
        android:valueTo="0"
        android:valueType="floatType" />

</set>

动画师/slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="-1000"
        android:valueType="floatType" />

</set>

类子类别

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            // return super.onCreateView(inflater, container, savedInstanceState);

            View view = (ViewGroup) inflater.inflate(R.layout.product_frame, null);
            getFragmentManager().beginTransaction()
                    .replace(R.id.sub_header, new Sub_Header()).commit();
            getFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.animator.slide_in_left,
                            R.animator.slide_out_right, 0, 0)
                    .replace(R.id.product_frame, new Sub_Catagory_Grid()).commit();

            view.getWidth();
            return view;

        }

在这里张贴问题是什么,我不明白您的问题,这不起作用是什么意思?
Ammar ali 2014年

2
他指的是您关于OP的解决方案无效的声明,并要求澄清。
汤姆(Tom)

5
对于不知道为什么“转换动画”为什么不适用于新的Api的人:通过阅读源代码(Api 19),它仅支持“ objectAnimator”和“ animator”。
Lei Guo

4
这些动画使用硬编码的转换值,因此效果不佳。例如,我经历了一个片段与另一个片段的重叠。.我假设不同的屏幕尺寸会产生不同的行为。.不幸的是,无法使用objectAnimators指定相对转换。
Sandra 2015年

不应将“ slide_out_right”的“起始”值设为1000而将“ slide_in_left”的值设为-1000?
muilpp '16

116

可能您正在混合两个API。有两种情况:

  • 如果定位到3.0以下使用支持v4片段:您必须使用旧的动画api,即您正在使用的api(它们进入anim /,并且为R.anim.thing

  • 如果您的目标是3.0以上使用本机片段:您必须使用新的动画api,即ObjectAnimators(它们进入animator /并且是R.animator.thing)。


1
您是否会偶然知道文档中的什么地方说您必须对本机片段使用对象动画制作器?
kmdupr3​​3 2014年

1
我检查了两个API的源代码,发现所有的动画xml文件都应放入res / anim文件夹,没有看到对动画师的任何解析/
Guo Guo

0

正如@minivac回答的那样,您正在混合两个API。请查看Android培训指南中的“显示卡翻转动画”示例,以进一步了解如何向片段交易添加自定义动画。它完全可以解决您的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.