Esta me ha dejado perpleja unos días (poniéndola a trabajar antes del Ice Cream Sandwich) pero creo ¡Finalmente llegué allí!(gracias a Gautam K y Mike Israel por los clientes potenciales) Lo que hice al final fue extender mi View
(a FrameLayout
) para iniciar las animaciones de traducción derecha/izquierda según sea necesario y para escuchar el final de las animaciones para reubicarme FrameLayout
mi derecha/izquierda según el caso, 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, puede ajustar este SlidingFrameLayout
para que su propósito sea deslizar una mayor cantidad de píxeles, deslizarse por más tiempo, etc., pero esto debería ser suficiente para comenzar :)
@AdilHussain: luego debe implementar la funcionalidad con hilos usted mismo en teléfonos que no lo admiten. Simplemente verifique si el teléfono lo admite o escriba alguna alternativa simple. Esa es la mejor opción. – Gautam
Encontré esta brillante biblioteca que hace el trabajo: [http://nineoldandroids.com] (http://nineoldandroids.com). Biblioteca disponible para descargar como un 'jar' desde aquí: [https://github.com/JakeWharton/NineOldAndroids/downloads](https://github.com/JakeWharton/NineOldAndroids/downloads) –
Parece que hablé demasiado pronto. Al hacer una traducción utilizando la biblioteca [nineoldandroids] (https://github.com/JakeWharton/NineOldAndroids) en teléfonos más antiguos (pre-Honeycomb), los botones dentro de la vista traducida parecen haberse movido, pero aún se puede hacer clic en sus ubicaciones anteriores (y no sus nuevas ubicaciones). He enviado un correo electrónico al autor de la biblioteca pero aún no he recibido una respuesta. –