Questo mi ha costretto per un paio di giorni (riuscendo a lavorare pre Ice Cream Sandwich) ma penso Finalmente sono arrivato!(grazie a Gautam K e Mike Israel per i lead) Quello che ho fatto alla fine è stato estendere il mio View
(a FrameLayout
) per avviare le animazioni destra/sinistra di traduzione come richiesto e per ascoltare la fine delle animazioni per trasferirsi il mio FrameLayout
destra/sinistra a seconda dei casi, come segue:
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);
}
}
}
E, infine, di far scorrere il SlidingFrameLayout
destra/sinistra, tutto quello che devi fare è chiamare il metodo SlidingFrameLayout.toggleSlide()
. Naturalmente puoi modificare questo SlidingFrameLayout
per far scorrere un numero maggiore di pixel, scorrere più a lungo ecc, ma questo dovrebbe essere sufficiente per iniziare :)
@AdilHussain: allora devi implementare la funzionalità con i thread te stesso su telefoni che non lo supportano. Basta controllare se il telefono lo supporta o scrivere qualche semplice ripiego. Questa è l'opzione migliore. – Gautam
Ho trovato questa brillante libreria che fa il lavoro: [http://nineoldandroids.com] (http://nineoldandroids.com). Libreria disponibile per il download come 'jar' da qui: [https://github.com/JakeWharton/NineOldAndroids/downloads](https://github.com/JakeWharton/NineOldAndroids/downloads) –
Sembra che abbia parlato troppo presto. Quando esegui una traduzione utilizzando la libreria [nineoldandroids] (https://github.com/JakeWharton/NineOldAndroids) su telefoni meno recenti (pre-Honeycomb), i pulsanti all'interno della visualizzazione tradotta sembrano essere stati spostati ma sono ancora selezionabili nelle loro vecchie posizioni (e non le loro nuove posizioni). Ho inviato un'email all'autore della biblioteca ma non ho ancora ricevuto una risposta. –