2013-09-25 23 views
26

Mam android translate Animation. Mam ImageView z losowo wygenerowaną pozycją (next1, next2). Dzwonię do pustki co 3 sekundy. Generuje nową pozycję widoku, a następnie tworzy animację i przenosi widok do miejsca docelowego. Animacja tłumaczenia ma zaimplementowaną animacjęListener. Po zakończeniu animacji przenosimy Trwale Widok na nową pozycję (w trybie OnAnimationEnd). Mój problem polega na tym, że pozycja animacji nie odpowiada ustawieniu pozycji layoutParams. Po zakończeniu animacji przeskok do nowej pozycji, która wynosi około 50-100 pikseli. Myślę, że pozycje powinny być takie same, ponieważ w obu sytuacjach używam tych samych wartości (next1, next2). Czy możesz wskazać mi drogę do znalezienia rozwiązania? Drawing of situation here hereAndroid translate animation - permanently move Wyświetl nową pozycję za pomocą 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); 

Oto układ 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

proszę zobaczyć moją odpowiedź, jej bezpośrednio powiązane: https://stackoverflow.com/a/47593484/2606290 – Fer

Odpowiedz

42

I zazwyczaj wolą pracować z delty w animacji tłumaczyć, gdyż pozwala uniknąć wielu nieporozumień.

Spróbuj tego, czy działa dla Ciebie:

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

Upewnij się, aby amountToMoveRight/amountToMoveDownfinal

Nadzieja to pomaga :)

+2

Thanks Gil. Drobna korekcja: TranslateAnimation anim = new TranslateAnimation (0, amountToMoveRight, 0, amountToMoveDown); – Srikanth

+6

Powoduje migotanie, zobacz: http://stackoverflow.com/questions/2650351/android-translateanimation-resets-after-animation –

+11

nie trzeba dodawać detektora, wystarczy użyć setFillAfter (true) – Valera

21

Należy raczej używać ViewPropertyAnimator. To animuje widok do jego przyszłej pozycji i nie trzeba wymuszać żadnych parametrów układu na widoku po zakończeniu animacji. I to raczej proste.

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

myView.animate().translateX(pixelInScreen) 

Uwaga: Ten piksel nie jest w stosunku do widoku. Ten piksel to pozycja na ekranie w pikselach na poziomie .

2

można po prostu zrobić jak

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