2016-06-19 21 views
0

Ich versuche, von einem Fragment zu einem anderen mit einer 3D-Flip-Animation zu bewegen. Um dies zu erreichen, versuche ich das Google Tutorial here an meinen Kontext anzupassen. Die einzige Sache ist, dass der Guide beide Fragmente in einer Activity implementiert, während ich die Fragmente getrennt in zwei Dateien implementiere, ohne auf Activity angewiesen zu sein.Flip-Übergang Animation zwischen zwei Fragmenten

Die Frage, die mir begegnet ist, ist die folgende Laufzeitausnahme, wenn ich versuche, den Übergang zu animieren:

java.lang.RuntimeException: Unknown animation name: objectAnimator 

Hier ist der Ansatz, den ich gefolgt:

1- In build.gradle Datei, der Mindest-SDK unterstützt Version 14:

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.0" 

    defaultConfig { 
     applicationId "com.xxxxx.xxxxxxxx" 
     minSdkVersion 14 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 

2- Unter dem res Ordner, ich ein neues Android-Ressourcenverzeichnis erstellt anim: enter image description here

Im Folgenden ist der Code der 4 XML-Dateien:

card_flip_left_in.xml:

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

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

card_flip_left_out.xml:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- Rotate. --> 
    <objectAnimator 
     android:valueFrom="0" 
     android:valueTo="180" 
     android:propertyName="rotationY" 
     android:interpolator="@android:interpolator/accelerate_decelerate" 
     android:duration="@integer/card_flip_time_full" /> 

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

card_flip_right_in.xml:

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

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

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

</set> 

card_flip_right_out.xml:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- Rotate. --> 
    <objectAnimator 
     android:valueFrom="0" 
     android:valueTo="-180" 
     android:propertyName="rotationY" 
     android:interpolator="@android:interpolator/accelerate_decelerate" 
     android:duration="@integer/card_flip_time_full" /> 

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

nun den interessanten Teil kommen, versuche ich den Übergang, wenn auf, klicken Sie auf das auszuführen Markierungsinformationsfenster:

@Override 
    public void onInfoWindowClick(Marker marker) { 
     System.out.println(marker.getId()); 
     flipCard(); 
    } 

Und der flipCard Code:

private void flipCard() { 

     if (mShowingBack) { 
      getFragmentManager().popBackStack(); 
      return; 
     } 
     // Flip to the back. 

     mShowingBack = true; 
     // Create and commit a new fragment transaction that adds the fragment for the back of 
     // the card, uses custom animations, and is part of the fragment manager's back stack. 

     getFragmentManager() 
       .beginTransaction() 

         // Replace the default fragment animations with animator resources representing 
         // rotations when switching to the back of the card, as well as animator 
         // resources representing rotations when flipping back to the front (e.g. when 
         // the system Back button is pressed). 
       .setCustomAnimations(
         R.anim.card_flip_right_in , R.anim.card_flip_right_out, 
         R.anim.card_flip_left_in, R.anim.card_flip_left_out 
       ) 

         // Replace any fragments currently in the container view with a fragment 
         // representing the next page (indicated by the just-incremented currentPage 
         // variable). 
       .replace(R.id.audio_playback, new AudioPlayback()) 

         // Add this transaction to the back stack, allowing users to press Back 
         // to get to the front of the card. 
       .addToBackStack(null) 

         // Commit the transaction. 
       .commit(); 
} 

Einer der Versuche, die ich versuche:

Ich habe versucht, alle Karten Animation XML-Dateien zu einem animator Ressource Verzeichnis zu verschieben, anstatt ein anim Verzeichnis. Aber dann, wenn ich ändern Sie den Pfad in der Übergangscode auf die folgenden:

.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 
       ) 

Ich habe die Aussagen über Expected resource of type anim mit einem Fehler in rot unterstrichen. Dies ist also zu bestätigen, dieser Versuch scheint das Problem nicht zu beheben.

Also im Grunde, wie sollte die Flip-Animation gemacht werden? Was ich hier vermisse?

Antwort

0

Sieht so aus, als ob Sie die Kompatibilitätsbibliothek verwenden, was bedeutet, dass Ihre Ressourcen in einem Ordner namens res/anim statt res/animator sein sollten und die ältere Syntax verwenden sollten.

Die von Ihnen verwendete Syntax wird unter Property Animation here beschrieben. Sie sollten die Syntax verwenden, die unter Ansicht Animation here

Schiebe, Überblendung, Überblendung oder Skalierung Übergänge mit dieser Syntax ist nicht schwierig, aber Rotation ist nur um die X-und/oder Y-Achsen und ich habe noch eine erfolgreiche zu sehen Implementierung eines Flip-Übergangs. Siehe here für einen Versuch.

Verwandte Themen