Может ли LayoutAnimationController анимировать только указанные виды

Можно ли переопределить Android? LayoutAnimationController таким образом, что только определенный ребенок Views, которые я указываю внутри ViewGroup оживит? Моя цель - выбрать произвольный набор дочерних представлений на основе текущего состояния Activity и анимировать их с одинаковой анимацией в одно и то же время, а затем выбрать другой произвольный набор дочерних представлений и сделать то же самое. Я хотел бы иметь возможность делать это постоянно, пока Activity закончили бег.

До сих пор я рассматривал и отклонил пару вариантов:

  1. призвание startAnimation(Animation) конкретные дочерние представления по отдельности, однако нет гарантии, что все они начнутся и закончатся в одно и то же время, особенно если число представлений в произвольном наборе велико.
  2. Переопределение LayoutAnimationController.getAnimationForView() казалось, что это будет самый простой способ, но метод является окончательным и не может быть переопределен.

Некоторое время я царапал свою голову по этому поводу и подумал, что я бы попробовал Stack Overflow.

2 ответа

Решение

Я не смог найти способ изменить Android LayoutAnimationController, но придумал простое решение, которое делает то, что я хочу. Я создал View подкласс, который может выборочно игнорировать вызовы для запуска анимации, если я так решу.

public class AnimationAverseView extends View {

    private boolean mIsAnimatable = true;

    public void setAnimatible(boolean isAnimatable) {
        if (!isAnimatable) {
            clearAnimation();
        }
        mIsAnimatable = isAnimatable;
    }

    @Override
    public void startAnimation(Animation animation) {
        if (mIsAnimatable) {
            super.startAnimation(animation);
        }
    }
}

Я не беспокоился о любых других возможных методах, связанных с анимацией, так как я только анимирую Viewчерез LayoutAnimationController,

Я вижу, что этот вопрос был задан 7 лет и 6 месяцев назад, но сегодня я сам столкнулся с ним, и создание пользовательских дочерних представлений кажется мне немного обременительным.

Я обнаружил, что использование настраиваемого внешнего макета, похоже, помогает, когда вам нужно переопределить attachLayoutAnimationParameters. Этот метод вызывается для каждого дочернего представления, которое является частью анимации макета, и вызывается, когда анимация макета фактически запускается внутри ViewGroup. Он прикрепляет AnimationLayoutParams к дочернему элементу, и в этом случае он анимируется. Проще говоря, если вы не прикрепите какие-либо параметры LayoutAnimation к дочернему элементу, он не будет частью анимации макета.

class CustomLayout @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {

    private val excludeForLayoutAnimation by lazy {
        listOfNotNull(findViewById(R.id.text), findViewById(R.id.fab))
    }

    override fun attachLayoutAnimationParameters(
        child: View?,
        params: ViewGroup.LayoutParams?,
        index: Int,
        count: Int
    ) {
        if (child !in excludeForLayoutAnimation) {
            super.attachLayoutAnimationParameters(child, params, index, count)
        }
    }

}

Если вы сейчас просто вызовете это в своем внешнем пользовательском представлении, оно исключит указанные вами дочерние элементы:

customView?.apply {
    layoutAnimation = AnimationUtils.loadLayoutAnimation(
        context,
        R.anim.layout_animation_fade_in
    )
    scheduleLayoutAnimation() // or maybe startLayoutAnimation()
}

Я не могу добавить комментарий к принятому ответу, поэтому добавьте дополнительную информацию здесь. Комментарий от happydude (17 февраля) был верным и для меня. У меня есть FrameLayout как внешний вид для моего ListView заголовок, и мне нужно было переопределить setAnimation() метод, чтобы предотвратить анимирование заголовка с остальной частью списка. Поэтому вы должны проверить, какие другие методы анимации вам могут понадобиться переопределить.

Другие вопросы по тегам