Android - Tworzenie tłumaczeń i objectAnimator w tym samym pliku XML

Próbowałem uzyskać efekt obrotu kostki 3D podczas przesuwania z jednego fragmentu do drugiego. Najpierw korzystałem z efektu translacji (w XML) dzwoniąc zFragmentTransaction.setCustomAnimations(...) a następnie, otwierając / zamykając fragment, bawiłem się kamerą, aby wykonać obrót.

To działało FINE, ale wydaje mi się, że I HAVE TOO (nie pytaj mnie dlaczego) używaj całej tej animacji używając tylko pliku XML. Po długim wyszukiwaniu odkryłem, że powinienem użyć objectAnimator do obrotu.

Podążyłem za próbką Google i udało mi się wykonać animację klapki. Teraz muszę przetłumaczyć fragmenty, aby się wślizgnęły i wysunęły. Wygląda na to, że nie mogę używać objectAnimator i tłumaczyć efektu na ten sam plik XML. Ponieważ pojawia się ten błąd:

java.lang.RuntimeException: Unknown animator name: translate at (...)

Jakieś pomysły, w jaki sposób mogę wykonać efekt przesuwny i użyć obiektu objectAnimator w tym samym czasie?

Dziękuję za Twój czas!

Kod, którego używam:

card_flip_right_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- Before rotating, immediately set the alpha to 0. -->
    <objectAnimator
        android:duration="0"
        android:propertyName="alpha"
        android:valueFrom="1.0"
        android:valueTo="0.0" />

    <!-- Rotate. -->
    <objectAnimator
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:propertyName="rotationY"
        android:valueFrom="180"
        android:valueTo="0" />

    <!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
    <objectAnimator
        android:duration="1"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:valueFrom="0.0"
        android:valueTo="1.0" />

</set>

Fragment zwany innym fragmentem: (rotacja kostki powinna być widoczna między tym 2)

private void launchArticle(int prev, int pos){
        ArticleFragment newFragment = new ArticleFragment();
        Bundle args = new Bundle();
        args.putString("pos", pos);
        args.putInt("prev", prev);
        newFragment.setArguments(args);
        android.app.FragmentTransaction transaction = getFragmentManager().beginTransaction();
        Fragment currFrag = (Fragment)getFragmentManager().findFragmentById(R.id.headlines_fragment);
        if (currFrag != null) {
                transaction.hide(currFrag);
        }
        transaction.setCustomAnimations(
                R.animator.card_flip_right_in,
                R.animator.card_flip_right_out,
                R.animator.card_flip_left_in,
                R.animator.card_flip_left_out
                );

        transaction.replace(R.id.fragment_container, newFragment, pos);
        transaction.addToBackStack(null);

        transaction.commit();
}

AKTUALIZACJA:

Udało mi się rozwiązać poprzedni problem za pomocą klasy, która rozszerza moje framelayout fragmentów, których używam

SlidingFrameLayout.java

public class SlidingFrameLayout extends FrameLayout
{
    private static final String TAG = SlidingFrameLayout.class.getName();
    public SlidingFrameLayout(Context context) {
        super(context);
    }

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

    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();  
        setX((width > 0) ? (xFraction * width) : -9999);  
    }

    public float getYFraction()
    {
        final int height = getHeight();  
        if(height != 0) return getY() / getHeight(); else return getY();   
    }

    public void setYFraction(float yFraction) {
        final int height = getHeight();  
        setY((height > 0) ? (yFraction * height) : -9999);  
    }
}

i dodając to do objectAnimator:

<!-- Move -->
    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:anim/linear_interpolator"
        android:propertyName="xFraction"
        android:valueFrom="-1"
        android:valueTo="0" />

To działa lepiej, ale osie rotacji znajdują się na środku FrameLayout i nie tworzą iluzji sześcianu ... Czy możliwe jest ustawienie osi obrotu w pewnym punkcie?

questionAnswers(2)

yourAnswerToTheQuestion