Animación a través de la matriz de puntos

Estoy seguro de que hay una manera fácil de hacer esto, pero estoy atascado. Digamos que tengo una lista de puntos:

Point[] list = {pointA, pointB, pointC, ...} 

Me gustaría animar un ImageView a través de cada punto Así que probé esto:

 id = 0; AnimatorListenerAdapter animEnd = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); id++; if(id != list.length) { iv.animate() .translationX(list[id].getX()) .translationY(list[id].getY()) .setDuration(200) .setListener(this); } } }; iv.animate() .translationX(list[id].getX()).translationY(list[id].getY()) .setDuration(200).setListener(animEnd); 

Funciona, pero hay un ligero retraso entre cada animación.

¿Alguna idea? Gracias !

Probablemente obtenga los retrasos entre los pasos de animación porque siempre inicia una animación nueva en cada transición de paso a paso. Para superar esta situación tiene varias opciones.

Fotogramas clave

Aquí puedes encontrar una técnica llamada Keyframe Animation, que es una técnica de animación muy común y es probablemente exactamente lo que quieres.

Un objeto Keyframe consiste en un par tiempo / valor que le permite definir un estado específico en un momento específico de una animación. Cada fotograma clave también puede tener su propio interpolador para controlar el comportamiento de la animación en el intervalo entre el tiempo del fotograma clave anterior y el tiempo de este fotograma clave.

 Keyframe kf0 = Keyframe.ofFloat(0f, 0f); Keyframe kf1 = Keyframe.ofFloat(.5f, 360f); Keyframe kf2 = Keyframe.ofFloat(1f, 0f); PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2); ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation) rotationAnim.setDuration(5000ms); 

En su caso, podría asignar los puntos en su list a una lista de instancias de Keyframe y …

 Point[] list = {pointA, pointB, pointC, ...} List<Keyframe> kfs = new ArrayList<Keyframe>(); foreach (Point p : points) { Keyframe kf = new Keyframe.ofFloat(px); // or what ever kfs.add(kf); } 

… más tarde pasar estos fotogramas clave a algún método de fábrica para crear algunos PropertyValuesHolder , como ofFloat que tiene la siguiente firma:

 public static PropertyValuesHolder ofFloat ( Property<?, Float> property, float... values ) 

El segundo parámetro es una lista de argumentos variables que también acepta arrays como entradas. Por lo tanto, debería ser posible pasar su kfs al método como un segundo argumento, de alguna manera.

En su caso me gustaría elaborar los siguientes métodos, ya que están desarrollando para dalvik VM no puede utilizar expresiones java8 lambda:

 // maps points to X/Y float values List<Float> toArrayX(Point[] points) { ... } List<Float> toArrayY(Point[] points) { ... } // maps float values to Keyframes List<Keyframe> toKeyframes(List<Float> floats) { ... } void createAnimation(Point[] points) { List<Keyframe> xs = toKeyframes(toArrayX(points)); PropertyValuesHolder phvX = PropertyValuesHolder .ofKeyframe("translationX", xs); List<Keyframe> ys = toKeyframes(toArrayY(points)); PropertyValuesHolder phvY = PropertyValuesHolder .ofKeyframe("translationY", ys); linkPropertyValuesHolder(phvX); linkPropertyValuesHolder(phvY); } void linkPropertyValuesHolder(PropertyValuesHolder phv) { // setup target ObjectAnimator anim = ObjectAnimator .ofPropertyValuesHolder(target, phv) anim.setDuration(5000ms); } 

Interpoladores

Alternativamente, puede especificar las transiciones dadas por los puntos a través de una instancia de Interpolator .

Un interpolador define la velocidad de cambio de una animación. Esto permite acelerar, desacelerar, repetir los efectos básicos de animación (alpha, scale, translate, rotate), etc.

Un interpolador asigna un flotador fraccionario entre 0.0 y 1.0 a otro flotador fraccionario entre 0.0 y 1.0 . Como los tres siguientes; LinearInterpolator , AccelerateDecelerateInterpolator y BounceInterpolator :

Imágenes de aquí

Interpolador de ruta

Con PathInterpolator s es posible dibujar interpoladores arbritales usando instancias Path . La trayectoria dibujada será utilizada para conducir la animación. En su caso podría crear dos rutas, una para la xy otra para la traducción y.

Sin embargo, tenga cuidado al construir interpoladores de caminos, porque

… el Camino debe ajustarse a una función y = f (x).

El Camino no debe tener lagunas en la dirección x y no debe voltear sobre sí mismo de manera que pueda haber dos puntos compartiendo la misma coordenada x. Está bien tener una línea disjunta en la dirección vertical:

Así que eche un vistazo al fragmento de código siguiente que se toma de aquí, crea una ruta de acceso válida y podría utilizarse como entrada para el constructor PathInterpolator .

 Path path = new Path(); path.lineTo(0.25f, 0.25f); path.moveTo(0.25f, 0.5f); path.lineTo(1f, 1f); 

Interpolador personalizado

Cuando los interpoladores dados no son lo suficientemente flexibles, también puede implementar la interfaz Interpolator y crear una nueva instancia a partir de ella después. La interfaz es muy estrecha y sólo proporciona un único método llamado getInterpolation con la siguiente firma.

 public abstract float getInterpolation (float input) 

Código vs. XML

Otra última opción es mover toda la configuración de animación en XML en lugar de hornear estos detalles directamente en la distribución binaria del código. Sin embargo, cada una de las opciones dadas requerirá una configuración diferente para ser manejable a través de XML, si es posible.

Espero que esto ayude, pero es sólo pseudo código. No probé el código … por lo que no hay garantías de corrección.

  • OnTouchListener en vista invisible
  • Reaccionar Native Memory Leakage Animation Issue
  • Android: ¿Cómo mover un BitmapDrawable?
  • AnimatedVectorDrawable no anima
  • Animación de Android Alpha
  • ¿Cuál es la razón de diseñar onAnimationCancel () en Animator.AnimatorListener?
  • ¿Cómo puedo dibujar ItemDecoration correctamente cuando el elemento RecyclerView está animando su altura?
  • Android: Animación horizontal personalizada de la barra de progreso
  • Cómo configurar el oyente de onclick para ver imágenes animadas
  • Deslice la animación expandida en android
  • Animación de diapositivas de Android en vivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.