TranslateAnimation возвращается к начальной точке, когда закончите - PullRequest
1 голос
/ 27 октября 2011

Моя TranslateAnimation работает, но в конце анимации она возвращается к исходному местоположению.

        LinearLayout rl = (LinearLayout) findViewById(R.id.navPanel);

          animation = new TranslateAnimation(
              Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
              Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 3.0f
          );
          animation.setDuration(500);

          rl.startAnimation(animation);

Как мне сделать так, чтобы оставался в конечном месте?

Ответы [ 4 ]

8 голосов
/ 27 октября 2011

используйте animation.setFillAfter(true) для анимации, чтобы остановить ее в конце перевода.

http://developer.android.com/reference/android/view/animation/Animation.html#setFillAfter(boolean)

8 голосов
/ 27 октября 2011

Старый (до 3.0) API-интерфейс анимации ведет себя немного странно - когда он анимируется, он просто транслирует место рисования представления, но фактически не перемещает представление относительно своих родителей.

Чтобы изображение оставалось на месте после завершения анимации, вы можете установить Animation.AnimationListener на TranslateAnimation. В методе onAnimationEnd() слушателя вы перемещаете представление в его окончательное место покоя, манипулируя LayoutParams в представлении.

3 голосов
/ 06 апреля 2013

эта же проблема https://stackoverflow.com/a/6519233/1253065

использовать animation.setFillAfter (true), animation.setFillEnabled (true)

1 голос
/ 09 ноября 2014

Чтобы избежать повторяющегося кода, вы можете создать подкласс AnimatorListenerAdapter и создать свой собственный класс AnimatorListener, в который вы повторно присоединяете представление после анимации, а затем используете его везде, где это необходимо, вместо AnimatorListener по умолчанию.

Класс:

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;

public class PersistViewAnimatorListener extends AnimatorListenerAdapter {

    private View view; // keep a reference to the view
    public PersistViewAnimatorListener(View view) {
        this.view = view;
    }

    @Override public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);

        // re-attach the view to its parent at its new location
        if (view == null) { return; } // defensive, the view may have been removed while it was animated, do nothing in this case

        ViewGroup parent = (ViewGroup) view.getParent(); // get the parent
        if (parent == null) { return; } // defensive
        int index = parent.indexOfChild(view); // get the index of the view
        parent.removeView(view); // remove the view

        if (parent.getClass().equals(RelativeLayout.class)) { // RELATIVE LAYOUT
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(view.getLayoutParams()); // add the view back at its index with new layout parameters
            layoutParams.setMargins(Math.round(view.getX()), Math.round(view.getY()), 0, 0); // left, top, right, bottom; round the float to int
            parent.addView(view, index, layoutParams);
        } else if (parent.getClass().equals(FrameLayout.class)) { // FRAME LAYOUT
            FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(view.getLayoutParams()); // the same for FrameLayout
            layoutParams.setMargins(Math.round(view.getX()), Math.round(view.getY()), 0, 0);
            parent.addView(view, index, layoutParams);
        } else { // currently no further layouts supported, implement these here
            throw new UnsupportedOperationException("PersistViewAnimatorListener is currently only supported where the parent is either RelativeLayout or FrameLayout.");
        }

        view.setTranslationX(0); view.setTranslationY(0); // reset translated values from the animation

    }
}

И как вы его используете:

view.animate().yBy(height).setListener(new PersistViewAnimatorListener(view)); // call your custom listener in .setListener() and pass in the view

В этом решении предполагается, что вы используете RelativeLayout или FrameLayout для родителя.Кроме того, он просто заботится о позиции, а не о размере или других свойствах, которые также можно анимировать.

...