21

Viewボタンの最初のクリックで、x 軸に沿って (たとえば、右に 200 ピクセル)スライドさせたいと思います。ボタンを 2 回押すと、View背面を x 軸に沿って元の位置にスライドさせます。

このView.setTranslationX(float)メソッドは、呼び出しとそれぞれを使用して、ビューをターゲットの水平位置にジャンプします。代わりにターゲットの水平位置にスライドする方法を知っている人はいますか?myView.setTranslationX(200);myView.setTranslationX(0);View

注 1: Aは実際に を動かさず、動いているように見せるだけTranslateAnimationなのでダメです。View

注 2:setTranslationX(float)とメソッドが API レベル 11 の時点で導入されたことを質問した時点では認識していませんでしたsetTranslationY(float)。ハニカム (API レベル 11) を上向きにターゲットにしている場合は、Gautam K の回答で十分です。それ以外の場合は、提案された解決策について私の回答を参照してください。

4

3 に答える 3

26

ObjectAnimatorとそのスーパークラスの Value Animatorを調べてみてください

あなたはこのようなことをすることができ ObjectAnimator anim = ObjectAnimator.ofFloat(this, "translationX", 0,200); ます anim.start();

値を使用し、オブジェクトアニメーターbooleanでそれを切り替えて200,0スライドバックします

PS: メソッドを使用setDurationして、アニメーションが完了するまでの時間を設定できます

編集 :

下位互換性を提供するサポート ライブラリを調べてみてください。

編集

@AdilHussain が指摘したように、nineoldandroidsというライブラリがあり、古い Androidでも同じ目的で使用できます。

于 2012-06-25T11:21:12.417 に答える
5

これは私をかなりの数日間困惑させました(アイスクリームサンドイッチの前に機能させるために)が、ついにそこにたどり着いたと思います!(リードを提供してくれた Gautam K と Mike Israel に感謝) 最終的に私がしたことは、View(a ) を拡張して、必要に応じて右/左のアニメーションの変換を開始し、右FrameLayoutを再配置するためにアニメーションの最後をリッスンすることでした。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, 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);
    }
  }
}

SlidingFrameLayout最後に、左右にスライドするには、SlidingFrameLayout.toggleSlide()メソッドを呼び出すだけです。もちろん、これSlidingFrameLayoutを微調整して、より多くのピクセルをスライドさせたり、より長くスライドさせたりすることができますが、始めるにはこれで十分です:)

于 2012-07-03T11:08:14.107 に答える
2

同様の問題がありました.TranslateAnimationは、今setFillAfterを呼び出すと実際にビューを移動します( Androidバグ)。私は似たようなことをしなければならなかったので、アニメーションリスナーを使って、すべてを正しい場所に移動させましょう. 残念ながら、アニメーション リスナーにもバグがあります ( stackoverflow ソリューション)。それで、 stackoverflowソリューションのソリューションに従って独自のレイアウトクラスを作成しました。うまくいきました:)

于 2012-06-25T11:28:01.723 に答える