Animación del dibujo de una ruta de acceso de lienzo en Android
Me gustaría animar el dibujo de un camino, es decir, que aparezca progresivamente en la pantalla. Estoy usando el lienzo y mi mejor conjetura hasta ahora es usar un ObjectAnimator para cuidar la animación. Sin embargo, no puedo averiguar cómo dibujar realmente el segmento correspondiente de la ruta en el método onDraw (). ¿Hay un método que permita hacer esto? ¿Tendría que implicar efectos de trayectoria para eso?
Edit: Usar un DashPathEffect y establecer sus intervalos "on" y "off" en la animación para cubrir la parte de la ruta que queremos dibujar para ese paso parece funcionar aquí, pero requiere asignar un nuevo DashPathEffect para cada paso del animación. Voy a dejar la pregunta abierta en caso de que haya una mejor manera.
- Círculo dibujado en lienzo no coincide con la pantalla
- Android: la forma más fácil de cambiar el color de un archivo png
- Cambiar la intensidad de clarear / oscurecer en mapas de bits mediante PorterDuffXfermode en la clase Paint de Android
- ¿Cómo hacer efecto de resplandor alrededor de un mapa de bits?
- Cómo medir con precisión el tamaño en píxeles del texto que se está dibujando en un lienzo por drawTextOnPath ()
- Dibujo de 2 círculos en un lienzo
- Android Paint: cómo obtener efecto "aerógrafo"?
- ¿Cuál es la mejor manera de crear drawables para diferentes dpi
- Recursos de Android: las resoluciones deben ir a los directorios hdpi, ldpi, mdpi y xhdpi
- Superponer imágenes en la vista previa de la cámara SurfaceView
- Android SurfaceView / Lienzo parpadeando después de intentar borrarlo
- Android ImageView rotativo
- Android canvas.scale (-1,1)
Respondiendo a mi propia pregunta, como descubrí una manera satisfactoria de hacer eso.
El truco consiste en usar un ObjectAnimator
para cambiar progresivamente la longitud actual del trazo, y un DashPathEffect
para controlar la longitud del trazo actual. El DashPathEffect
tendrá su parámetro de DashPathEffect
inicialmente establecido en lo siguiente:
float[] dashes = { 0.0f, Float.MAX_VALUE };
El primer flotador es la longitud del trazo visible, la segunda longitud de la parte no visible. La segunda longitud se elige para ser extremadamente alta. Los ajustes iniciales corresponden así a un golpe totalmente invisible.
A continuación, cada vez que el animador de objetos actualiza el valor de longitud de trazo, se crea un nuevo DashPathEffect
con la nueva parte visible y se establece en el objeto Pintor y la vista se invalida:
dashes[0] = newValue; mPaint.setPathEffect(new DashPathEffect(dashes, 0)); invalidate();
Por último, el método onDraw () utiliza este pintor para dibujar el camino, que sólo comprenderá la porción que queremos:
canvas.drawPath(path, mPaint);
El único inconveniente que veo es que debemos crear un nuevo DashPathEffect en cada paso de animación (ya que no pueden ser reutilizados), pero globalmente esto es satisfactorio – la animación es agradable y suave.
Por lo que sé, la única manera es comenzar con un camino vacío y tener un runnable que agrega puntos a la ruta a intervalos definidos, hasta que se completa.