2010-11-11 13 views
20

Sto tentando di implementare l'animazione di interpolazione "iperspaziale" descritta in http://developer.android.com/guide/topics/resources/animation-resource.html ("Risorse di animazione"), tuttavia non sembra funzionare come scritto. Quando eseguo l'applicazione, ottengo solo una vista vuota sotto la barra del titolo dell'applicazione. Che cosa sto facendo di sbagliato?Esempio di animazione con interpolazione semplice

Per l'esempio, ecco il mio codice. Ho creato res/anim/hyperspace_jump.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false"> 
    <scale 
     android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
     android:fromXScale="1.0" 
     android:toXScale="1.4" 
     android:fromYScale="1.0" 
     android:toYScale="0.6" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:fillAfter="false" 
     android:duration="700" /> 
    <set 
     android:interpolator="@android:anim/accelerate_interpolator" 
     android:startOffset="700"> 
     <scale 
      android:fromXScale="1.4" 
      android:toXScale="0.0" 
      android:fromYScale="0.6" 
      android:toYScale="0.0" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:duration="400" /> 
     <rotate 
      android:fromDegrees="0" 
      android:toDegrees="-45" 
      android:toYScale="0.0" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:duration="400" /> 
    </set> 
</set> 

Ho anche creato un layout/main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
    /> 
<ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView> 

</LinearLayout> 

Finalmente ho un'attività:

package com.tomoreilly.geology; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.ImageView; 

public class MainActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ImageView image = (ImageView) findViewById(R.id.ImageView01); 
     Animation hyperspaceJump = 
      AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); 
     image.startAnimation(hyperspaceJump); 
    } 
} 

Tuttavia non vedo alcuna animazione quando eseguo l'app. Mi mancano alcuni dettagli che non sono trattati nell'esempio "Risorse di animazione"?

Grazie, Tom

risposta

-1

credo sia necessario ViewFlipper. Perché quando vuoi animare tra un'animazione hai bisogno di ViewFlipper per fare animazione.

fare le seguenti cose. Immagino di risolvere il problema.

Crea nuovo file XML e aggiungere scheda ViewFlipper in esso ...

uso comprendono scheda per includere tutti gli altri layout quando si vuole fare animazione.

e di utilizzare il seguente codice

flipper = (ViewFlipper) findViewById(R.id.flipper); 

Button button1 = (Button) findViewById(R.id.Button01); // Button in one activity 

Button button2 = (Button) findViewById(R.id.Button02); // Button in second activity 

// Other Methods 

private Animation inFromRightAnimation() { 

     // Animation inFromRight = new TranslateAnimation(
     /* 
     * Animation inFromRight = new ScaleAnimation(
     * Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 
     * 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, 
     * Animation.RELATIVE_TO_PARENT, 0.0f); 
     */ 
     Animation inFromRight = new TranslateAnimation(
       Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 
       0.0f, Animation.RELATIVE_TO_SELF, -1.0f, 
       Animation.RELATIVE_TO_SELF, 0.0f); 

     inFromRight.setDuration(500); 
     inFromRight.setInterpolator(new AccelerateInterpolator()); 
     return inFromRight; 
    } 

    private Animation outToLeftAnimation() { 
     // Animation outtoLeft = new TranslateAnimation(
     /* 
     * Animation outtoLeft = new 
     * ScaleAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, 
     * Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 
     * 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); 
     */ 
     Animation outtoLeft = new TranslateAnimation(
       Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 
       0.0f, Animation.RELATIVE_TO_SELF, -1.0f, 
       Animation.RELATIVE_TO_SELF, 0.0f); 
     outtoLeft.setDuration(500); 
     outtoLeft.setInterpolator(new AccelerateInterpolator()); 
     return outtoLeft; 
    } 

    private Animation inFromLeftAnimation() { 
     // Animation inFromLeft = new TranslateAnimation(
     /* 
     * Animation inFromLeft = new 
     * ScaleAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, 
     * Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 
     * 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); 
     */ 
     Animation inFromLeft = new TranslateAnimation(
       Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 
       0.0f, Animation.RELATIVE_TO_SELF, -1.0f, 
       Animation.RELATIVE_TO_SELF, 0.0f); 
     inFromLeft.setDuration(500); 
     inFromLeft.setInterpolator(new AccelerateInterpolator()); 
     return inFromLeft; 
    } 

    private Animation outToRightAnimation() { 
     // Animation outtoRight = new TranslateAnimation(
     /* 
     * Animation outtoRight = new 
     * ScaleAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, 
     * Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 
     * 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); 
     */ 
     Animation outtoRight = new TranslateAnimation(
       Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 
       0.0f, Animation.RELATIVE_TO_SELF, -1.0f, 
       Animation.RELATIVE_TO_SELF, 0.0f); 
     outtoRight.setDuration(500); 
     outtoRight.setInterpolator(new AccelerateInterpolator()); 
     return outtoRight; 
    } 
+0

perché si copia incolla sopra risposta qui? – Sameer

5

vostro ImageView deve avere una fonte definita sia nel xml o la vostra attività.

XML:

<ImageView android:id="@+id/ImageView01" 
    android:src="@drawable/someimage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
</ImageView> 

attività:

ImageView image = (ImageView) findViewById(R.id.ImageView01); 
image.setImageResource(R.drawable.some_image); 
-1
package com.example; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.animation.AccelerateInterpolator; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.view.animation.TranslateAnimation; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.ViewFlipper; 

public class TeeenAni extends Activity { 

ViewFlipper flipper; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ImageView image = (ImageView) findViewById(R.id.ImageView01); 
    Animation hyperspaceJump = 
    AnimationUtils.loadAnimation(this, R.anim.); 
    image.startAnimation(hyperspaceJump); 
    flipper = (ViewFlipper) findViewById(R.anim.hyperspace_jump); 

    Button button1 = (Button) findViewById(R.id.Button01); 

    Button button2 = (Button) findViewById(R.id.Button02); 
} 
    private Animation inFromRightAnimation() { 


     Animation inFromRight = new TranslateAnimation(
       Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 
       0.0f, Animation.RELATIVE_TO_SELF, -1.0f, 
       Animation.RELATIVE_TO_SELF, 0.0f); 

     inFromRight.setDuration(500); 
     inFromRight.setInterpolator(new AccelerateInterpolator()); 
     return inFromRight; 
    } 

    private Animation outToLeftAnimation() { 

     Animation outtoLeft = new TranslateAnimation(
       Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 
       0.0f, Animation.RELATIVE_TO_SELF, -1.0f, 
       Animation.RELATIVE_TO_SELF, 0.0f); 
     outtoLeft.setDuration(500); 
     outtoLeft.setInterpolator(new AccelerateInterpolator()); 
     return outtoLeft; 
    } 

    private Animation inFromLeftAnimation() { 

     Animation inFromLeft = new TranslateAnimation(
       Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 
       0.0f, Animation.RELATIVE_TO_SELF, -1.0f, 
       Animation.RELATIVE_TO_SELF, 0.0f); 
     inFromLeft.setDuration(500); 
     inFromLeft.setInterpolator(new AccelerateInterpolator()); 
     return inFromLeft; 
    } 

    private Animation outToRightAnimation() { 

     Animation outtoRight = new TranslateAnimation(
       Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 
       0.0f, Animation.RELATIVE_TO_SELF, -1.0f, 
       Animation.RELATIVE_TO_SELF, 0.0f); 
     outtoRight.setDuration(500); 
     outtoRight.setInterpolator(new AccelerateInterpolator()); 
     return outtoRight; 
    } 

[R.anim.hyperspace_jump] [1] }

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/hello" 
/> 
<ImageView android:id="@+id/ImageView01" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 
</ImageView> 

<ViewFlipper android:id="@+id/details" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"/> 

<Button android:id="@+id/Button01" 
android:layout_height="wrap_content" 
android:layout_width="wrap_content" 
android:text="Home"></Button> 
<Button android:id="@+id/Button02" 
android:layout_height="wrap_content" 
android:layout_width="wrap_content" 
android:text="Gallary"></Button> 

+4

Si prega di aggiungere un po 'più di sostanza alla tua risposta di un po' di codice. Aggiungi alcuni ragionamenti su come e perché questo codice risolve il problema. – Matsemann

11

enter image description here

Per aggiungere una risposta diversa, si potrebbe anche provare il Universal Tween Engine per animare le vostre interfacce utente Android. In effetti, l'animazione, che richiede un bel paio di righe in formato XML, sarebbe descritto in questo modo:

Timeline.createSequence() 
    // First, set your pivot (Tween.set() works instantly) 
    .push(Tween.set(image, ViewAccessor.PIVOT_XY).target(0.5f, 0.5f)) 

    // Then, animate your scale and rotation as you want 
    .push(Tween.to(image, ViewAccessor.SCALE_XY, 0.7f).target(1.4f, 0.6f)) 
    .beginParallel() 
     .push(Tween.to(image, ViewAccessor.SCALE_XY, 0.4f).target(0, 0)) 
     .push(Tween.to(image, ViewAccessor.ROTATION, 0.4f).target(-45)) 
    .end() 

    // Finally, start the animation! 
    .start(); 

Può essere più leggibile quando si dispone di una grande serie di azioni per sequenza.Il motore è fortemente ottimizzato per Android, e in particolare per i giochi, e non assegna nulla, per fornire le migliori prestazioni.

È completamente open source, ampiamente documentato e rilasciato con una licenza Apache-2.

Si può dare il Android demo una prova se si vuole :)

+0

Ad ogni modo questa è una biblioteca incredibile che funziona magnificamente fino ad oggi. – alvi