Одиночная анимация - несколько просмотров - программирование
Подтвердить что ты не робот

Одиночная анимация - несколько просмотров

Есть ли способ анимации нескольких видов одновременно?

Что я хочу сделать, это перевести анимацию:

У меня есть 5 TextViews и 4 цветные полосы (простые RelativeLayouts с фоном). В начале анимации штифты укладываются в TextViews в горизонтальной строке. В конце я хочу, чтобы все TextViews укладывались между полосами:

enter image description here

Это очень простой рисунок, но он демонстрирует, что я хочу делать. Есть ли способ сделать это с анимацией, или мне нужно использовать анимацию холста.

4b9b3361

Ответ 1

Создайте свои объекты анимации, затем используйте startAnimation коллективно для всех представлений одновременно. Так было бы примерно так:

TranslateAnimation anim1;
TranslateAnimation anim2;
TranslateAnimation anim3;

// Setup the animation objects

public void startAnimations()
{
   //... collect view objects
   view1.startAnimation(anim1);
   view2.startAnimation(anim2);
   view3.startAnimation(anim3);
}

Просто обратите внимание, что чем больше анимаций происходит, тем медленнее будет.

Ответ 2

Вы можете использовать ObjectAnimator для анимации множественного представления следующим образом:

ArrayList<ObjectAnimator> arrayListObjectAnimators = new ArrayList<ObjectAnimator>(); //ArrayList of ObjectAnimators

ObjectAnimator animY = ObjectAnimator.ofFloat(view, "y", 100f);
arrayListObjectAnimators.add(animY);

ObjectAnimator animX = ObjectAnimator.ofFloat(view, "x", 0f);
arrayListObjectAnimators.add(animX);
...
ObjectAnimator[] objectAnimators = arrayListObjectAnimators.toArray(new ObjectAnimator[arrayListObjectAnimators.size()]);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.playTogether(objectAnimators);
animSetXY.setDuration(1000);//1sec
animSetXY.start();

Ответ 3

Мне удалось разделить один экземпляр Animation среди нескольких представлений. По крайней мере, с AlphaAnimation. У меня был ListView и анимация, которые должны быть применены к определенному ребенку из всех представлений элементов списка. В моем случае должно было быть возможным, чтобы представления "присоединились" и "оставили" общую анимацию в любое время и не должны влиять на другие анимированные представления каким-либо образом или мешать уже запущенной анимации. Чтобы достичь этого, мне пришлось сделать скорректированную копию андроидного фонда AlphaAnimation. Мой вариант использования довольно особенный, но пусть он будет здесь на всякий случай, если кто-то столкнется с аналогичной целью с ListView.

/**
 * This class is a copy of android stock AlphaAnimation with two adjustments:
 * - fromAlpha, toAlpha and duration are settable at any time.
 * - reset() method can be blocked. Reason: view.setAnimation() calls animation reset() method
 * which is not intended in our use case.
 * For every new list item view we call setAnimation once for it life time
 * and animation should not be reset because it is shared by all list item views and may be in progress. 
 */
public class MutableAlphaAnimation extends Animation {
    private float mFromAlpha;
    private float mToAlpha;
    private boolean resetBlocked;

    public MutableAlphaAnimation() {
    }

    public void start(float fromAlpha, float toAlpha, long duration) {
        mFromAlpha = fromAlpha;
        mToAlpha = toAlpha;
        setDuration(duration);
        setStartTime(START_ON_FIRST_FRAME);
    }

    public void setResetBlocked(boolean resetBlocked) {
        this.resetBlocked = resetBlocked;
    }

    @Override
    public void reset() {
        if (! resetBlocked) super.reset();
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final float alpha = mFromAlpha;
        t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime));
    }

    @Override
    public boolean willChangeTransformationMatrix() {
        return false;
    }

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

Чтобы настроить эту анимацию на представление:

            animation.setResetBlocked(true);
            view.setAnimation(animation);
            animation.setResetBlocked(false);

И чтобы начать анимацию (ранее заданную setAnimation), нужно сделать две вещи:

        animation.start(0.0f, 1.0f, FADE_IN_DURATION);

И после этого вы должны вручную вызвать invalidate() для каждого представления, на которое влияет анимация.

Обычный startAnimation() делает invalidate() для вас, но setAnimation - нет. (прочитайте комментарий к методу View.setAnimation() в источниках android).

Ответ 4

Вы можете использовать AnimationSet

AnimatorSet decSet2 = new AnimatorSet();
        decSet2.playTogether(
                ObjectAnimator.ofFloat(view, "x",dX),
                ObjectAnimator.ofFloat(view, "y",dY),
                ObjectAnimator.ofFloat(mTextCancel, "x",dX),
                ObjectAnimator.ofFloat(mTextCancel, "y", dY),
                ObjectAnimator.ofArgb(mBtnOne, "visibility", View.VISIBLE, View.GONE),
                );
        decSet2.setDuration(0);
        decSet2.start();