At the first click of a button, I want to slide a View along the x-axis (by 200 pixels to the right let's say). And on the second press of the button, I want to slide the View back along the x-axis to its original position.
The View.setTranslationX(float) method jumps the View to the target horizontal locations with calls myView.setTranslationX(200); and myView.setTranslationX(0); respectively. Anyone know how I can slide the View to the target horizontal locations instead?
Note 1: A
TranslateAnimationis no good since it doesn't actually move theViewbut only presents the illusion of it moving.Note 2: I didn't realise at the time of posing the question that the
setTranslationX(float)andsetTranslationY(float)methods were introduced as of API Level 11. If you're targeting Honeycomb (API Level 11) upwards, then Gautam K's answer will suffice. Otherwise, see my answer for a suggested solution.
Try looking into ObjectAnimator and its super class Value Animator
you can do something like this ObjectAnimator anim = ObjectAnimator.ofFloat(this, "translationX", 0,200); and then anim.start();
Use a boolean value and toggle it with 200,0 in the object animator to slide back
PS: you can use setDuration method to set how long the animation should take to complete
Try looking at the support library which provides backward compatibility.
As @AdilHussain pointed out there is a library called nineoldandroids which can be used for the same purpose on older androids.
This one's had me stumped for a fair few days (getting it to work pre- Ice Cream Sandwich) but I think I've finally got there! (thanks to Gautam K and Mike Israel for the leads) What I did in the end was to extend my View (a FrameLayout) to start the translate right/left animations as required and to listen for the end of the animations in order to relocate my FrameLayout right/left as appropriate, as follows:
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); } } } And, lastly, to slide the SlidingFrameLayout right/left, all you've got to do is call the SlidingFrameLayout.toggleSlide() method. Of course you can tweak this SlidingFrameLayout for your purposes to slide a greater number of pixels, to slide for longer etc, but this should be sufficient to get you started :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With