Android - Erstellen von Übersetzungen und objectAnimator in derselben XML-Datei

Ich habe versucht, einen 3D-Würfel-Rotationseffekt zu erzielen, während ich von einem Fragment zum anderen geschoben habe. Zuerst benutzte ich einen übersetzeffekt (auf XML), der mit aufruftFragmentTransaction.setCustomAnimations(...) und dann, als ich das fragment öffnete / schloss, spielte ich mit der kameraklasse, um die drehung zu machen.

Dies hat einwandfrei funktioniert, aber anscheinend HABE ICH AUCH (frag mich nicht warum) die gesamte Animation nur mit einer XML-Datei verwendet. Nach langer Suche fand ich heraus, dass ich objectAnimator verwenden sollte, um die Rotation durchzuführen.

Befolgte das Google-Beispiel und ich schaffe es, die Flip-Animation zu machen. Jetzt muss ich die Fragmente übersetzen, damit sie hinein- und herausrutschen. Scheint, dass ich objectAnimator nicht verwenden und den Effekt auf dieselbe XML-Datei übersetzen kann. Da dieser Fehler auftritt:

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

Irgendwelche Ideen, wie ich den gleitenden Effekt machen und den objectAnimator gleichzeitig benutzen kann?

Vielen Dank für Ihre Zeit!

Code, den ich benutzt habe:

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, das ein anderes Fragment aufruft: (Würfelrotation sollte zwischen diesen 2 sichtbar sein)

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();
}

AKTUALISIEREN:

Ich habe es geschafft, das vorherige Problem mit einer Klasse zu lösen, die mein Framelayout der Fragmente erweitert, die ich verwende

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);  
    }
}

und indem Sie dies zum objectAnimator hinzufügen:

<!-- 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" />

Das funktioniert besser, aber die Rotationsachsen befinden sich in der Mitte des FrameLayouts und erwecken nicht die Illusion eines Würfels. Ist es möglich, die Rotationsachsen auf einen bestimmten Punkt einzustellen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage