Android: развернуть / свернуть анимацию - PullRequest
425 голосов
/ 09 февраля 2011

Допустим, у меня есть вертикальная линейная планировка с:

[v1]
[v2]

По умолчанию v1 имеет visibily = GONE. Я хотел бы показать v1 с расширенной анимацией и одновременно нажать v2.

Я пробовал что-то вроде этого:

Animation a = new Animation()
{
    int initialHeight;

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final int newHeight = (int)(initialHeight * interpolatedTime);
        v.getLayoutParams().height = newHeight;
        v.requestLayout();
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        initialHeight = height;
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
};

Но с этим решением у меня мигает при запуске анимации. Я думаю, что это вызвано тем, что v1 отображает полный размер перед применением анимации.

С javascript это одна строка jQuery! Любой простой способ сделать это с Android?

Ответы [ 32 ]

1 голос
/ 30 июля 2016

Основываясь на решениях @Tom Esterez и @Seth Nelson (top 2), я смоделировал их. Как и оригинальные решения, это не зависит от параметров разработчика (настроек анимации).

private void resizeWithAnimation(final View view, int duration, final int targetHeight) {
    final int initialHeight = view.getMeasuredHeight();
    final int distance = targetHeight - initialHeight;

    view.setVisibility(View.VISIBLE);

    Animation a = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            if (interpolatedTime == 1 && targetHeight == 0) {
                view.setVisibility(View.GONE);
            } else {
                view.getLayoutParams().height = (int) (initialHeight + distance * interpolatedTime);
                view.requestLayout();
            }
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    a.setDuration(duration);
    view.startAnimation(a);
}
0 голосов
/ 13 февраля 2019

Я использовал тот же блок кода, который использовался в принятом ответе, но он не будет работать так же, как в Android 9, поэтому обновите меру в соответствии с этим

v.measure(MeasureSpec.makeMeasureSpec(parentView.getWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(parentView.getWidth(), MeasureSpec.AT_MOST));

Как работает ограничение, немного отличающееся вAndroid 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...