En Android cómo utilizar ObjectAnimator para desplazarse al punto x a lo largo de una curva
Tengo una vista de la imagen "piedra" y la estoy moviendo de su posición actual a una posición de X, de Y. Quiero que se mueva a lo largo de una curva. Por favor, hágamelo saber cómo puedo hacer eso (he establecido el min api como 11)
ObjectAnimator moveX = ObjectAnimator.ofFloat(stone, "x", catPos[0] ); ObjectAnimator moveY = ObjectAnimator.ofFloat(stone, "y", catPos[1] ); AnimatorSet as = new AnimatorSet(); as.playTogether(moveX, moveY); as.start();
La respuesta de Budius me parece perfectamente útil.
Estos son los objetos de animación que utilizo:
Propósito: Mover Vista "vista" a lo largo del Camino "ruta"
Android v21 +:
// Animates view changing x, y along path co-ordinates ValueAnimator pathAnimator = ObjectAnimator.ofFloat(view, "x", "y", path)
Android v11 +:
// Animates a float value from 0 to 1 ValueAnimator pathAnimator = ValueAnimator.ofFloat(0.0f, 1.0f); // This listener onAnimationUpdate will be called during every step in the animation // Gets called every millisecond in my observation pathAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { float[] point = new float[2]; @Override public void onAnimationUpdate(ValueAnimator animation) { // Gets the animated float fraction float val = animation.getAnimatedFraction(); // Gets the point at the fractional path length PathMeasure pathMeasure = new PathMeasure(path, true); pathMeasure.getPosTan(pathMeasure.getLength() * val, point, null); // Sets view location to the above point view.setX(point[0]); view.setY(point[1]); } });
Similar a: Android, mover mapa de bits a lo largo de un camino?
Juega con los interpoladores. Por ejemplo, establezca 2 Interpoladores diferentes para x e y:
moveX.setInterpolator(new AccelerateDecelerateInterpolator()); moveY.setInterpolator(new DecelerateInterpolator());
Theres más (LinearInterpolator, AccelerateInterpolator …) pero creo que esto debería ser la combinación que desea.
Gracias por las respuestas, pero encontré mi propia answer.Just agregó algunas posiciones x, y extra en el stmt Objectanimator. Fue a esas posiciones antes de llegar a la final y trazado un camino!
ObjectAnimator moveX = ObjectAnimator.ofFloat(stone, "x", catPos[0]-20,catPos[0]-10,catPos[0] ); ObjectAnimator moveY = ObjectAnimator.ofFloat(stone, "y",catPos[1]-20,catPos[1]-10, catPos[1] );
usted tiene dos opciones:
ambos necesitan un objeto Path
que define tu curva:
Path path = new Path(); path. // define your curve here
si utiliza sólo Lollipop (API 21) use ObjectAnimator.ofFloat (… path) como este:
ObjectAnimator.ofFloat(stone, View.X, View.Y, path).start();
si eso no es una opción, se utiliza un AnimatorListener para recibir actualizaciones sobre el marco de cada animador y utilizar el PathMeasure
para obtener los valores en ese punto, como esto:
PathMeasure pm; float point[] = {0f, 0f}; private final ValueAnimator.AnimatorUpdateListener listener = new ValueAnimator.AnimatorUpdateListener(){ @Override public void onAnimationUpdate (ValueAnimator animation) { float val = animation.getAnimatedFraction(); pm.getPosTan(pm.getLength() * val, point, null); stone.setTranslationX(point[0]); stone.setTranslationY(point[1]); } } // and then to animate pm = new PathMeasure(path, false); ValueAnimator a = ValueAnimator.ofFloat(0.0f 1.0f); a.setDuration(/* your duration */); a.setInterpolator(/* your interpolator */); a.addUpdateListener(listener); a.start();
La clase Path tiene métodos para crear líneas no rectas de varios tipos; arcos, círculos, óvalos, rectángulos, curvas cúbicas y cuadráticas de bezier, que luego puede animar su objeto a lo largo.
Como señala Budius, necesitas codificar para API 21 (Lollipop) o más tarde para utilizar rutas con traducción de objetos. Ahora tiene más de dos años.
Por otro lado, parece que hay una escasez de cualquier cosa-más-que-muy-simples ejemplos de la utilización de caminos "en el medio silvestre", por lo que tal vez hay una razón que no han capturado todavía.