2013-09-25 7 views
26

Ho Android tradurre l'animazione. Ho un ImageView con posizione generata casualmente (next1, next2). Sto chiamando void ogni 3 secondi. Genera nuova posizione della vista e quindi crea animazione e sposta la vista nella posizione di destinazione. Tradurre l'animazione ha implementato AnimationListener. Al termine dell'animazione, sposto la vista in modo permanente nella nuova posizione (in OnAnimationEnd). Il mio problema è che la posizione dell'animazione non corrisponde all'impostazione delle posizioni layoutParams. Al termine dell'animazione, salta a una nuova posizione, che si trova a circa 50-100 pixel. Penso che le posizioni dovrebbero essere le stesse perché uso gli stessi valori (next1, next2) in entrambe le situazioni. Per favore puoi mostrarmi il modo di trovare sollution? Drawing of situation here hereAndroid translate animation - move in modo permanente Visualizza in una nuova posizione usando AnimationListener

FrameLayout.LayoutParams pozice_motyl = (FrameLayout.LayoutParams) pozadi_motyl.getLayoutParams();  
      TranslateAnimation anim = new TranslateAnimation(Animation.ABSOLUTE,pozice_motyl.leftMargin, Animation.ABSOLUTE, next1, Animation.ABSOLUTE, pozice_motyl.topMargin, Animation.ABSOLUTE, next2); 
      anim.setDuration(1000); 
      anim.setFillAfter(true); 
      anim.setFillEnabled(true); 

      anim.setAnimationListener(new Animation.AnimationListener() { 
       @Override 
       public void onAnimationStart(Animation animation) { 
       } 

       @Override 
       public void onAnimationEnd(Animation animation) { 




        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(100, 100); 

        layoutParams.leftMargin = (int)(next1); 
        layoutParams.topMargin = (int)(next2); 
        pozadi_motyl.setLayoutParams(layoutParams); 

       } 

       @Override 
       public void onAnimationRepeat(Animation animation) { 

       } 
      }); 

      pozadi_motyl.startAnimation(anim); 

Ecco il layout XML:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/pozadi0" 
    android:gravity="center_vertical" 
    android:layout_gravity="center_vertical"   
    android:background="@drawable/pozadi2" 
    > 



<LinearLayout 
android:id="@+id/pozadi_motyl" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 

    <ImageView android:id="@+id/obrazek_motyl" 
      android:src="@drawable/motyl" 
      android:layout_width="100dip" 
      android:layout_height="100dip" 
         /> 

    </LinearLayout> 


<LinearLayout 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 

<RelativeLayout 
android:id="@+id/obrazek_pozadi0" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 



<ImageView android:id="@+id/zaba_obrazek0" 
android:src="@drawable/zaba_obrazek" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true" 
android:layout_centerInParent="true" 
/> 

</RelativeLayout> 
</LinearLayout> 

<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 

<cz.zaba.Spojnice 
android:layout_width="fill_parent"   
android:layout_height="fill_parent" 
/> 

</LinearLayout> 
</FrameLayout> 
+0

si prega di vedere la mia risposta, la sua direttamente correlati: https://stackoverflow.com/a/47593484/2606290 – Fer

risposta

42

io di solito preferisco lavorare con delta a tradurre l'animazione, in quanto evita un sacco di confusione.

Prova questo fuori, vedere se funziona per voi:

TranslateAnimation anim = new TranslateAnimation(0, amountToMoveRight, 0, amountToMoveDown); 
anim.setDuration(1000); 

anim.setAnimationListener(new TranslateAnimation.AnimationListener() { 

    @Override 
    public void onAnimationStart(Animation animation) { } 

    @Override 
    public void onAnimationRepeat(Animation animation) { } 

    @Override 
    public void onAnimationEnd(Animation animation) 
    { 
     FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)view.getLayoutParams(); 
     params.topMargin += amountToMoveDown; 
     params.leftMargin += amountToMoveRight; 
     view.setLayoutParams(params); 
    } 
}); 

view.startAnimation(anim); 

Assicuratevi di mettere amountToMoveRight/amountToMoveDownfinal

Spero che questo aiuti :)

+2

Grazie Gil. Correzione secondaria: TranslateAnimation anim = new TranslateAnimation (0, amountToMoveRight, 0, amountToMoveDown); – Srikanth

+6

Ciò provoca uno sfarfallio, vedi: http://stackoverflow.com/questions/2650351/android-translateanimation-resets-after-animation –

+11

non c'è bisogno di aggiungere listener, basta usare setFillAfter (true) – Valera

21

Si dovrebbe piuttosto usare ViewPropertyAnimator. Questo anima la vista alla sua posizione futura e non è necessario forzare alcun parametro di layout sulla vista al termine dell'animazione. Ed è piuttosto semplice.

myView.animate().x(50f).y(100f); 

myView.animate().translateX(pixelInScreen) 

Nota: Questa pixel non è relativo alla vista. Questo pixel è la posizione del pixel sullo schermo.

2

si può solo fare come

myView.animate().y(0f);//to move to the top of the screen. 
Problemi correlati