You should try using ValueAnimator (or object animator), the code below is written in kotlin, but the same logic will apply for Java:
val childCount = someView.childCount val animators = mutableListOf<ValueAnimator>() for (i in 0..childCount) { val child = (someView.getChildAt(i)) val animator = ValueAnimator.ofInt(0, 75) animator.addUpdateListener { val curValue = it.animatedValue as Int (child.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = curValue child.requestLayout() } animator.duration = 75 animator.startDelay = 75L * i animators.add(animator) } animators.forEach { animator -> animator.start() }
In fact, you create a group of animators whose start delay is proportional to the number of children, therefore, as soon as one animation ends, a new one begins.
source share