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.