具有objectAnimators的R.animator不使用Fragment添加/删除动画

时间:2016-06-15 02:48:06

标签: android android-fragments android-appcompat

我不知道为什么总是那么难以开始工作。我正在使用AppCompat库和android.app.Fragment。我尝试添加动画来向左/右滑动新片段(就像iOS一样),但是当添加片段时,它们会立即添加/删除,而不需要任何动画。

我做错了什么?

getFragmentManager()
    .beginTransaction()
    .setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_to_the_left)
    .add(R.id.navrootlayout, fragment)
    .addToBackStack(null)
    .commit();

RES /动画/ slide_in_from_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@interpolator/decelerate_cubic"
        android:valueFrom="1"
        android:valueTo="0"
        android:valueType="floatType"
        android:propertyName="xFraction"
        android:duration="3000"/>
</set>

RES /动画/ slide_out_to_the_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@interpolator/decelerate_cubic"
        android:valueFrom="0"
        android:valueTo="-1"
        android:valueType="floatType"
        android:propertyName="xFraction"
        android:duration="3000"/>
</set>

我甚至将动画的持续时间设置为3000(即3秒),以便我可以完全确定它是否被使用,但事实并非如此。添加片段时没有任何动画。我捕捉到了它发生的屏幕视频,新片段立即出现(并最终消失)。

1 个答案:

答案 0 :(得分:1)

我弄清楚我做错了什么。我从某个地方的例子中抓取了动画xml文件,这个例子没有提到我需要自己实现xFraction属性。我错误地认为这是一个内置行为,可以理解xFraction和x是相关的,类似于旧样式​​res/anim样式动画允许您使用百分比值作为动画开始/结束值的方式。

但是,不,不。为此,您必须创建布局的子类并自己添加xFraction属性。这就是我做到的。

package com.mydomain.myapp;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

public class SlideableLayout extends RelativeLayout {


    public SlideableLayout(Context context) {
        super(context);
    }

    public SlideableLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SlideableLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public float getXFraction() {
        final int width = getWidth();
        if (width != 0) {
            return getX() / getWidth();
        } else {
            return getX();
        }
    }

    public void setXFraction(float xFraction) {
        final int width = getWidth();
        if (width > 0) {
            setX(xFraction * width);
        } else {
            setX(-10000);
        }
    }
}

然后,对于我想在屏幕上和屏幕上设置动画的每个片段,我使用SlideableLayout作为根布局。

<?xml version="1.0" encoding="utf-8"?>
<com.mydomain.myapp.SlideableLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/holo_blue_bright"
    >

</com.mydomain.myapp.SlideableLayout>