Анимация для пользовательского представления не воспроизводитсяAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Анимация для пользовательского представления не воспроизводится

Сообщение Anonymous »

Есть задача создать собственный виджет ViewGroup, в который можно добавить только два дочерних элемента. Оба расположены по центру по горизонтали, первый должен быть размещен на верхней границе родительской пользовательской группы просмотра, второй — на нижней границе. При добавлении должна проигрываться анимация: дочерний элемент медленно появляется в середине ViewGroup и перемещается к верхней границе (для первого элемента) или к нижней (для второго элемента) за фиксированное время. Вот мой код:

Код: Выделить всё

class CustomViewGroup @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
@AttrRes defStyleAttr: Int = 0,
@StyleRes defStyleRes: Int = 0
) : ViewGroup(context, attrs, defStyleAttr, defStyleRes) {

private val timeDuration = 2000L
private val maxChild = 2

override fun onLayout(p0: Boolean, p1: Int, p2: Int, p3: Int, p4: Int) {
if (childCount > 0) {
val firstChild = getChildAt(0)

if (firstChild != null) {
firstChild.layout(
measuredWidth / 2 - firstChild.measuredWidth / 2,
0,
measuredWidth / 2 + firstChild.measuredWidth / 2,
firstChild.measuredHeight
)
}
}

if (childCount > 1) {
val secondChild = getChildAt(1)

if (secondChild != null) {
secondChild.layout(
measuredWidth / 2 - secondChild.measuredWidth / 2,
measuredHeight - secondChild.measuredHeight,
measuredWidth / 2 + secondChild.measuredWidth / 2,
measuredHeight
)
}
}
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)

var maxWidth = 0
var totalHeight = 0

for (i in 0 until childCount) {
val child = getChildAt(i)
measureChild(child, widthMeasureSpec, heightMeasureSpec)
maxWidth = Math.max(maxWidth, child.measuredWidth)
totalHeight += child.measuredHeight
}

val width = resolveSize(maxWidth, widthMeasureSpec)
val height = resolveSize(totalHeight, heightMeasureSpec)

setMeasuredDimension(width, height)
}

override fun addView(child: View?) {

if (childCount > 2) {
throw IllegalStateException("Custom view can only have $maxChild children")
} else {
super.addView(child)

if (child != null) {
startAnimation(child, childCount - 1)
}
}
}

private fun startAnimation(child: View, childIndex: Int) {
child.alpha = 0f
val startY = measuredHeight.toFloat() / 2
val endY = if (childIndex == 0) 0f else measuredHeight.toFloat() - child.measuredHeight

val translateYAnimator = ObjectAnimator.ofFloat(child, "y", startY, endY)
val fadeAnimator = ObjectAnimator.ofFloat(child, "alpha", 0f, 1f)

val animatorSet = AnimatorSet()
animatorSet.playTogether(translateYAnimator, fadeAnimator)
animatorSet.duration = timeDuration
animatorSet.interpolator = DecelerateInterpolator()

animatorSet.start()
}
}
Проблема в том, что при добавлении дочернего элемента View не воспроизводится анимация движения, а анимация медленного появления видна. Подскажите пожалуйста, что может быть не так.

Подробнее здесь: https://stackoverflow.com/questions/793 ... s-not-play
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»