example - layout animation android
Cómo animar la traducción de una vista (3)
Este me ha dejado perplejo durante algunos días (trabajando antes del Ice Cream Sandwich), ¡pero creo que finalmente llegué allí! (gracias a Gautam K y Mike Israel por los contactos) Lo que hice al final fue extender mi View
(un FrameLayout
) para comenzar a traducir las animaciones derecha / izquierda según sea necesario y escuchar el final de las animaciones para reubicarme mi FrameLayout
derecha / izquierda según corresponda, de la siguiente manera:
public class SlidingFrameLayout extends FrameLayout
{
private final int durationMilliseconds = 1000;
private final int displacementPixels = 200;
private boolean isInOriginalPosition = true;
private boolean isSliding = false;
public SlidingFrameLayout(Context context)
{
super(context);
}
public SlidingFrameLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public SlidingFrameLayout(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
protected void onAnimationEnd()
{
super.onAnimationEnd();
if (isInOriginalPosition)
offsetLeftAndRight(displacementPixels);
else
offsetLeftAndRight(-displacementPixels);
isSliding = false;
isInOriginalPosition = !isInOriginalPosition;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
super.onLayout(changed, left, top, right, bottom);
// need this since otherwise this View jumps back to its original position
// ignoring its displacement
// when (re-)doing layout, e.g. when a fragment transaction is committed
if (changed && !isInOriginalPosition)
offsetLeftAndRight(displacementPixels);
}
public void toggleSlide()
{
// check whether frame layout is already sliding
if (isSliding)
return; // ignore request to slide
if (isInOriginalPosition)
startAnimation(new SlideRightAnimation());
else
startAnimation(new SlideLeftAnimation());
isSliding = true;
}
private class SlideRightAnimation extends TranslateAnimation
{
public SlideRightAnimation()
{
super(
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, displacementPixels,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0);
setDuration(durationMilliseconds);
setFillAfter(false);
}
}
private class SlideLeftAnimation extends TranslateAnimation
{
public SlideLeftAnimation()
{
super(
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, -displacementPixels,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0);
setDuration(durationMilliseconds);
setFillAfter(false);
}
}
}
Y, por último, para deslizar el SlidingFrameLayout
derecha / izquierda, todo lo que tienes que hacer es llamar al método SlidingFrameLayout.toggleSlide()
. Por supuesto, puedes ajustar este SlidingFrameLayout
para tus propósitos para deslizar un mayor número de píxeles, para deslizar por más tiempo, etc., pero esto debería ser suficiente para que comiences :)
Al primer clic de un botón, quiero deslizar una View
largo del eje x (digamos 200 píxeles a la derecha). Y en la segunda pulsación del botón, quiero deslizar la View
hacia atrás a lo largo del eje x a su posición original.
El View.setTranslationX(float)
salta la vista a las ubicaciones horizontales de destino con llamadas myView.setTranslationX(200);
y myView.setTranslationX(0);
respectivamente. ¿Alguien sabe cómo puedo deslizar la View
a las ubicaciones horizontales de destino?
Nota 1: una
TranslateAnimation
no es buena, ya que en realidad no mueve laView
pero solo presenta la ilusión de que se mueve.Nota 2: En el momento de formular la pregunta, no me di cuenta de que los
setTranslationX(float)
ysetTranslationY(float)
se introdujeron a partir del nivel 11 de API. Si está apuntando a Honeycomb (nivel 11 de API) hacia arriba, entonces Gautam La respuesta de K será suficiente. De lo contrario, vea mi respuesta para una solución sugerida.
Intente buscar en ObjectAnimator y su súper clase Value Animator
puede hacer algo como este ObjectAnimator anim = ObjectAnimator.ofFloat(this, "translationX", 0,200);
y luego anim.start();
Use un valor boolean
y alterne con 200,0
en el animador de objetos para retroceder
PD: puede usar el método setDuration
para establecer cuánto tiempo debe durar la animación para completar
Editar:
Intente buscar en la biblioteca de soporte que proporciona compatibilidad con versiones anteriores.
Editar
Como @AdilHussain señaló, hay una biblioteca llamada nineoldandroids que se puede usar para el mismo propósito en los androides más antiguos.
Tuve un problema similar, TranslateAnimation realmente mueve la vista si llamas a setFillAfter ahora ( error de Android ). Tenía que hacer algo similar, así que dije: hey, utilicemos un oyente de animación y luego movamos todo a la ubicación correcta. Desafortunadamente, también hay un error en los oyentes de animación ( solución ). Así que creé mi propia clase de diseño de acuerdo con la solución en la solución y estaba listo para comenzar :)