¿Cuál es la forma correcta de animar una vista de una coordenada a otra?

Me gustaría hacer lo siguiente. Tengo un conjunto de botones que tienen algunos iconos en ellos. Cuando el usuario teclea uno, me gustaría introducir una nueva vista que empiece en la misma coordenada que el icono pulsado y, a continuación, que la nueva vista se desplazaría a otra ubicación en la pantalla y cuando llegue allí se eliminará.

Sé cómo crear una nueva vista y agregarla / quitarla a la Parente RelativeLayout (no debería ser un RelativeLayout?) Y todo eso. Lo que no estoy claro es cómo obtener las coordenadas absolutas del botón que fue aprovechado (ya que es sólo un elemento dentro de un diseño padre, dentro de otro diseño padre) y luego establecer sus coordenadas y aplicar una animación, y luego lo que sería Notificarme que ha llegado a donde iba, para que pueda quitarlo?

No se puede encontrar un ejemplo de cómo hacer esto de todos modos, por lo que, la esperanza de que alguien me puede señalar en la dirección correcta.

3 Solutions collect form web for “¿Cuál es la forma correcta de animar una vista de una coordenada a otra?”

Por lo tanto, resulta que esto es mucho más sencillo de lo que imaginaba.

He creado una pantalla completa RelativeLayout que sólo se muestran mientras la animación está sucediendo.

Tengo la posición inicial de mi botón enterrado como este (es divertido ver estos mecanismos de codificación de estilo C en Java, son bastante raros en estos días:

int fromLoc[] = new int[2]; v.getLocationOnScreen(fromLoc); float startX = fromLoc[0]; float startY = fromLoc[1]; 

Así que, ahora tengo mi punto de partida.

Mi punto final es una coordenada absoluta en la pantalla, puedes asignarla como quieras

Entonces hago una pequeña clase de ayudante de Animaciones que me permite pasar en todas las coordenadas, la devolución de llamada, y la duración de la animación

  public class Animations { public Animation fromAtoB(float fromX, float fromY, float toX, float toY, AnimationListener l, int speed){ Animation fromAtoB = new TranslateAnimation( Animation.ABSOLUTE, //from xType fromX, Animation.ABSOLUTE, //to xType toX, Animation.ABSOLUTE, //from yType fromY, Animation.ABSOLUTE, //to yType toY ); fromAtoB.setDuration(speed); fromAtoB.setInterpolator(new AnticipateOvershootInterpolator(1.0f)); if(l != null) fromAtoB.setAnimationListener(l); return fromAtoB; } } 

Y necesitamos un oyente para hacernos saber cuando la animación se hace para borrarlo

  AnimationListener animL = new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { //this is just a method to delete the ImageView and hide the animation Layout until we need it again. clearAnimation(); } }; 

Y por último lo lanzamos todos juntos y pulsamos GO

 int fromLoc[] = new int[2]; v.getLocationOnScreen(fromLoc); float startX = fromLoc[0]; float startY = fromLoc[1]; RelativeLayout rl = ((RelativeLayout)findViewById(R.id.sticker_animation_layout)); ImageView sticker = new ImageView(this); int stickerId = getStickerIdFromButton(v); if(stickerId == 0){ stickerAnimationPlaying = false; return; } float destX = 200.0f;//arbitrary place on screen float destY = 200.0f;//arbitrary place on screen sticker.setBackgroundResource(stickerId); sticker.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); rl.addView(sticker); Animations anim = new Animations(); Animation a = anim.fromAtoB(startX, startY, destX, destY, animL,750); sticker.setAnimation(a); a.startNow(); 

Soy apenas agrego mi opinión en la posición central en la disposición del marco y tradujo mi opinión al eje de xy al eje de y. Intente abajo el código: –

Añadir opinión de imagen en framelayout

  imgHeart = new ImageView(getBaseContext()); imgHeart.setId(R.id.heartImage); imgHeart.setImageResource(R.drawable.material_heart_fill_icon); imgHeart.setLayoutParams(new FrameLayout.LayoutParams(50, 50, Gravity.CENTER)); mainFrameLaout.addView(imgHeart); 

Añadir animación en la vista de imagen

  imgHeart.animate() .scaleXBy(6) .scaleYBy(6) .setDuration(700) .alpha(2) .setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { imgHeart.animate() .scaleXBy(-6f).scaleYBy(-6f) .alpha(.1f) .translationX((heigthAndWidth[0] / 2) - minusWidth) .translationY(-((heigthAndWidth[1] / 2) - minusHeight)) .setDuration(1000) .setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { // remove image view from framlayout } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }).start(); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }).start(); 

Puede utilizar la animación de transición de Android para mover una vista sobre el diseño. Echa un vistazo al siguiente enlace para obtener algunas ideas sobre animar las vistas dentro de la disposición.

https://github.com/lgvalle/Material-Animations

  • Iniciar una nueva actividad sin animación de transición en android 1.6
  • La animación de Viewflipper no funciona en el primer golpe
  • ¿Cómo hacer la animación "ocupada" en Android?
  • Las animaciones personalizadas para iniciar actividades en Android no funcionan como se esperaba
  • Animación de Android para girar una vista y congelarla después de la rotación
  • Android - Comienzo de inicio de animación no funciona correctamente
  • ¿Por qué la aceleración de hardware no funciona en mi vista?
  • Cómo animar una versión 'clonada', duplicada de Android existente View
  • Combinar dos animaciones en Android
  • ¿Cómo implementar TabHost efecto deslizante?
  • Animación flotante suave con traducción en XML
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.