Может ли LayoutAnimationController анимировать только указанные виды
Можно ли переопределить Android? LayoutAnimationController
таким образом, что только определенный ребенок View
s, которые я указываю внутри ViewGroup
оживит? Моя цель - выбрать произвольный набор дочерних представлений на основе текущего состояния Activity
и анимировать их с одинаковой анимацией в одно и то же время, а затем выбрать другой произвольный набор дочерних представлений и сделать то же самое. Я хотел бы иметь возможность делать это постоянно, пока Activity
закончили бег.
До сих пор я рассматривал и отклонил пару вариантов:
- призвание
startAnimation(Animation)
конкретные дочерние представления по отдельности, однако нет гарантии, что все они начнутся и закончатся в одно и то же время, особенно если число представлений в произвольном наборе велико. - Переопределение
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()
метод, чтобы предотвратить анимирование заголовка с остальной частью списка. Поэтому вы должны проверить, какие другие методы анимации вам могут понадобиться переопределить.