Animación A lo largo de una ruta con rotación automática basada en la ruta en android
He estado tratando de animar una imagen de una mosca que se mueve en un camino como la siguiente imagen (que he añadido para una idea clara) en Android versión 2.2
Bueno, esto se puede hacer de una manera muy simple en el iphone, ya que tienen una propiedad forsetting esta rotación automática después de la ruta se dibuja con
- Comportamiento de sombra extraño durante el cambio de tarjeta
- Cómo restablecer ObjectAnimator a su estado inicial?
- Nombre de animación desconocido: decelerateInterpolator
- ¿Cómo evitar el parpadeo de Vista cuando se utiliza la animación?
- ¿Qué animación / vista se utiliza para las aplicaciones recientes / History en android 5.0 (Lollipop)?
animation.rotationMode = kCAAnimationRotateAuto;
Que creo que girar el objeto sobre la base de la ruta de acceso `
Soy capaz de animar ma volar a través de este camino utilizando la biblioteca nineoldandroid utilizando los métodos
path.moveTo(float x, float y); path.lineTo(float x, float y); path.curveTo(float c0X, float c0Y, float c1X, float c1Y, float x, float y);
De tal manera que las curvas se dibujan a través de la curva B zier cúbica.
Ahora lo que he estado tratando de implementar algo que permitiría que mi mosca para girar a sí mismo a lo largo de la ruta y yo simplemente no puede parecer llegar a ningún lado.
¡Por favor, ayúdenme con algunas ideas! Rss
- Animación de transición de actividad de izquierda a derecha en Android
- Android- simple fade out y fade in animación para viewflipper
- Error de JNI en la animación de transición de escena - Capa supera el máximo
- ¿Cómo podemos optimizar (cpu & ram) esta animación de salpicadura personalizada de android?
- Iniciar animación en carga de página, detener en página cargada
- Mostrar una letra de cadena por letra en un TextView -Android
- ¿Por qué no funciona view.startAnimation (animación) cuando se llama desde un evento?
- Android animar mi diseño relativo de abajo hacia arriba y de arriba a abajo usando la animación de traducción en la vista de imagen haga clic
Tienes que descargar la demo y la lib de nineoldandroids y estos 4 archivos java si quieres usar mi solución
Eso fue fácil, he modificado al evaluador en la demo de los novenoldandroides.
Es demasiado para publicar aquí:
Sólo para tener la idea:
Extiendo el PathPoint con el ángulo de campo. A continuación, escribe todos los puntos calculados en una pila (un simple flotador [] [])
Después del primer cálculo el ángulo puede ser calculado por el atan y los últimos 2 puntos en la pila.
Si no desea utilizar una pila puede modificar el timeparam y mirar hacia adelante donde el siguiente punto será dibujado y calcular el ángulo de estos.
Sólo piense en: ¿Primero ver dónde está caminando y luego caminar o simplemente caminar y luego eligió el ángulo para el destino. No es necesario ya que tenemos densidades de visualización que son altas y se calcula el ángulo para cada píxel.
Aquí está el PathEvaluator
public class PathEvaluatorAngle implements TypeEvaluator<PathPointAngle> { private static final int POINT_COUNT = 5000; private float[][] stack = new float[POINT_COUNT][2]; private int stackC = 0; @Override public PathPointAngle evaluate(float t, PathPointAngle startValue, PathPointAngle endValue) { float x, y; if (endValue.mOperation == PathPointAngle.CURVE) { float oneMinusT = 1 - t; x = oneMinusT * oneMinusT * oneMinusT * startValue.mX + 3 * oneMinusT * oneMinusT * t * endValue.mControl0X + 3 * oneMinusT * t * t * endValue.mControl1X + t * t * t * endValue.mX; y = oneMinusT * oneMinusT * oneMinusT * startValue.mY + 3 * oneMinusT * oneMinusT * t * endValue.mControl0Y + 3 * oneMinusT * t * t * endValue.mControl1Y + t * t * t * endValue.mY; } else if (endValue.mOperation == PathPointAngle.LINE) { x = startValue.mX + t * (endValue.mX - startValue.mX); y = startValue.mY + t * (endValue.mY - startValue.mY); } else { x = endValue.mX; y = endValue.mY; } stack[stackC][0] = x; stack[stackC][1] = y; double angle; if (stackC == 0){ angle = 0; } else if (stackC >= POINT_COUNT){ throw new IllegalStateException("set the stack POINT_COUNT higher!"); } else { angle = Math.atan( (stack[stackC][1] - stack[stackC-1][1]) / (stack[stackC][0] - stack[stackC-1][0]) ) * 180d/Math.PI; } stackC++; return PathPointAngle.moveTo(x, y, angle); }
}
Compruebe por favor el acoplamiento abajo. Esperanza él ayudará.
- Error: El daemon de generación de Gradle desapareció inesperadamente (puede haber sido destruido o puede haber caído)
- Cómo superponer vistas en otras aplicaciones