Ten przez kilka dni mnie zaskoczył (robił to przed Ice Cream Sandwich), ale myślę, że W końcu tam dotarłem!(podziękowania dla Gautama K i Mike'a Israela za prowadzenie) W końcu to, co zrobiłem, to przedłużenie mojego View
(a FrameLayout
), aby rozpocząć tłumaczenie animacji prawej/lewej, zgodnie z wymaganiami, i słuchanie końca animacji w celu relokacji moja FrameLayout
prawo/lewo w stosownych przypadkach, w następujący sposób:
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);
}
}
}
I wreszcie, aby przesunąć SlidingFrameLayout
prawo/lewo, wszystko co masz zrobić, to wywołać metodę SlidingFrameLayout.toggleSlide()
. Oczywiście możesz poprawić to SlidingFrameLayout
dla swoich celów, aby przesuwać większą liczbę pikseli, przesuwać na dłużej itp., Ale to powinno wystarczyć do rozpoczęcia :)
@AdilHussain: wtedy musisz zaimplementować funkcjonalność z wątkami się na telefonach, które go nie obsługują. Po prostu sprawdź, czy telefon go obsługuje, lub napisz coś prostego. To najlepsza opcja. – Gautam
Znaleziono tę wspaniałą bibliotekę, która spełnia swoją funkcję: [http://nineoldandroids.com] (http://nineoldandroids.com). Biblioteka dostępna do pobrania jako "jar" stąd: [https://github.com/JakeWharton/NineOldAndroids/downloads](https://github.com/JakeWharton/NineOldAndroids/downloads) –
Wygląda na to, że mówiłem za wcześnie. Podczas tłumaczenia za pomocą biblioteki [nineoldandroids] (https://github.com/JakeWharton/NineOldAndroids) na starszych telefonach (przed Honeycomb) wydaje się, że przyciski w przetłumaczonym widoku zostały przeniesione, ale nadal można je kliknąć w ich starych lokalizacjach (a nie ich nowe lokalizacje). Wysłałem e-maila do autora biblioteki, ale jeszcze nie otrzymałem odpowiedzi. –