Изменить положение просмотра после завершения анимации - PullRequest
8 голосов
/ 13 декабря 2011

Я разрабатываю виджет на основе ViewGroup, и моя проблема в том, что мне нужно сохранить положение элементов после окончания анимации.Я вызвал setFillAfter(true) в своем анимационном объекте, который я создал AnimationListener, и в его onAnimationEnd вызове метода View.layout(l,t,r,b), чтобы установить позицию после анимации, потому что я хочу, чтобы анимация начиналась с позиции нового элемента в следующий раз.Но в этом случае, похоже, что элементы располагаются дважды.Если я не использую View.layout(l,t,r,b) в конце анимации, следующая анимация начинается с предыдущей позиции.Вот мой код:

private void scrollUp() {
    for(int i = 0; i < getChildCount(); i++) {
        final View child = getChildAt(i);
        final int index = i; 
        final int newleft = child.getLeft() + mOffsetBetweenItems;
        final int newTop = child.getTop() - mOffsetBetweenItems;
        TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);          
        scrollUp.setDuration(1500);
        scrollUp.setFillAfter(true);        
        scrollUp.setAnimationListener(
            new AnimationListener() {

                @Override
                public void onAnimationStart(Animation animation) {}

                @Override
                public void onAnimationRepeat(Animation animation) {}

                @Override
                public void onAnimationEnd(Animation animation) {
                    child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight() );
                }
            }
        );

        child.startAnimation(scrollUp);
    }
}

Пожалуйста, дайте мне совет, как мне сбросить позицию вида в соответствии с конечной позицией анимации?

Ответы [ 3 ]

19 голосов
/ 05 декабря 2012

Вы должны использовать ObjectAnimator, он работает с уровня API 11.Это меняет позицию просмотра автоматически,

вот пример

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX);
objectAnimator.setDuration(1000);
objectAnimator.start();

Спасибо JUL за его ответ

Если ваше приложение не найдено object animatorизмените уровень API с Project -> properties -> Android, чем import android.animation.ObjectAnimator;

12 голосов
/ 13 декабря 2011

Я сделал это. Вот код:

private void scrollUp() {
    for(int i = 0; i < getChildCount(); i++) {
        final View child = getChildAt(i);
        final int index = i; 
        final int newleft = child.getLeft() + mOffsetBetweenItems;
        final int newTop = child.getTop() - mOffsetBetweenItems;
        TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);          
        scrollUp.setDuration(1500);
        scrollUp.setFillEnabled(true);        
        scrollUp.setAnimationListener(
            new AnimationListener() {

                @Override
                public void onAnimationStart(Animation animation) {}

                @Override
                public void onAnimationRepeat(Animation animation) {}

                @Override
                public void onAnimationEnd(Animation animation) {
                    child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight() );
                }
            }
        );

        child.startAnimation(scrollUp);
    }
}

Только что удалили setFillAfter(true) и напишите setFillEnabled(true) вместо. Но в этом случае я не понимаю логику работы setFillEnabled(), потому что она обеспечивает поведение, отличное от описанного в документации.

0 голосов
/ 13 декабря 2011

обратная анимация;Начните с предоставления вашему виду новой позиции, а затем анимируйте из старой позиции в новую позицию.

...