如何animation视图的翻译

在第一次点击一个button时,我想沿x轴滑动View (向右移动200像素)。 在第二次按下button时,我想沿着x轴将View向后滑动到原来的位置。

View.setTranslationX(float)方法通过调用myView.setTranslationX(200);将视图跳转到目标水平位置myView.setTranslationX(200);myView.setTranslationX(0); 分别。 任何人都知道我可以 View 滑动到目标水平位置吗?

注1:一个TranslateAnimation是不好的,因为它并没有实际移动View而只是呈现移动的错觉。

注2:在提出API级别11时引入了setTranslationX(float)setTranslationY(float)方法的问题时,我并没有意识到。如果向上定位了Honeycomb(API Level 11),那么Gautam K的回答就够了。 否则,请参阅我的答案build议的解决scheme。

Solutions Collecting From Web of "如何animation视图的翻译"

尝试查看ObjectAnimator及其超类Value Animator

你可以做这样的事情ObjectAnimator anim = ObjectAnimator.ofFloat(this, "translationX", 0,200); 然后anim.start();

使用一个boolean值并在对象animation器中用200,0来切换它以回滚

PS:你可以使用setDuration方法设置animation完成的时间

编辑:

尝试查看提供向后兼容性的支持库 。

编辑

正如@AdilHussain指出,有一个名为nineoldandroids的库,可以用于老机器人相同的目的。

这个人让我难住了几天(让冰淇淋三明治上class),但是我想我终于到了那里了! (感谢Gautam K和Mike Israel提供的线索)我最后做的是扩展我的View (一个FrameLayout ),根据需要开始翻译右/左animation,并听取animation结束以便重新定位我的FrameLayout右/左,如下所示:

 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, eg 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); } } } 

最后,向右/向左滑动SlidingFrameLayout ,您只需调用SlidingFrameLayout.toggleSlide()方法即可。 当然,您可以调整此SlidingFrameLayout为您的目的滑动更多的像素,滑动更长的时间等,但这应该足以让你开始:)

我有一个类似的问题,TranslateAnimation实际上移动视图,如果你现在调用setFillAfter( android bug )。 我不得不做类似的东西,所以我说,嘿,让我们使用一个animation监听器,然后把所有的东西移动到正确的位置。 不幸的是,animation监听器也有一个bug( stackoverflow解决scheme )。 所以我根据stackoverflow解决scheme中的解决scheme创build了我自己的布局类,我很高兴:)