studio anim android android-animation translate-animation

animation translate android studio



Animación de traducción de Android: mueve de forma permanente la vista a una nueva posición con AnimationListener (3)

Tengo android translate Animation. Tengo un ImageView con posición generada al azar (next1, next2). Estoy llamando void cada 3 segundos. Genera una nueva posición de la Vista y luego crea una animación y mueve la Vista a la posición de destino. Traducir animación tiene AnimationListener implementado. Cuando finaliza la animación, muevo Ver permanentemente a la nueva posición (en OnAnimationEnd). Mi problema es que la posición de la animación no se corresponde con la configuración de las posiciones layoutParams. Cuando finaliza la animación, salta a una nueva posición, que está a unos 50-100 píxeles de distancia. Creo que las posiciones deberían ser las mismas porque uso los mismos valores (next1, next2) en ambas situaciones. Por favor, ¿me puede mostrar el camino para encontrar la solución?

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

Aquí está el diseño 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>


Debería utilizar ViewPropertyAnimator . Esto anima la vista a su posición futura y no es necesario forzar ningún parámetro de diseño en la vista después de que finalice la animación. Y es bastante simple.

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

Nota: este píxel no es relativo a la vista. Este píxel es la posición del píxel en la pantalla.


Por lo general, prefiero trabajar con deltas en la animación de traducir, ya que evita mucha confusión.

Prueba esto, mira si funciona para ti:

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

Asegúrate de que amountToMoveRight / amountToMoveDown final

Espero que esto ayude :)


solo puedes hacer como

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