Анимация движется Вид в неправильную позицию - PullRequest
0 голосов
/ 14 января 2019

Я хочу переместить ImageView в центр кнопки. Для этого я использую следующий код:

    var leftPos = mButtonView.left.toFloat()
    var rightPos = mButtonView.right.toFloat()
    var topPos = mButtonView.top.toFloat()
    var bottomPos = mButtonView.bottom.toFloat()

    var centerX = (leftPos + rightPos)/2
    var centerY = (topPos + bottomPos)/2

    var soultoX = ObjectAnimator.ofFloat(mContentView, "x", centerX).apply {
        duration = 1000
    }

    var soultoY = ObjectAnimator.ofFloat(mContentView, "y", centerY).apply {
        duration = 1000
    }

    fun soulToButton() = AnimatorSet().apply {
        play(soultoX).with(soultoY)
        start()
    }

При вызове soulToButton() вместо перемещения к ожидаемой точке в середине mButtonView, mContentView перемещается в верхний левый угол экрана. Есть идеи почему?

1 Ответ

0 голосов
/ 14 января 2019

Я думаю, что проблема в том, чтобы найти координаты / размер Android View во время создания экрана. Чтобы получить координаты / размер представления, как только он станет известен, присоедините слушателя к его ViewTreeObserver.

Например:

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val buttonView = btn
        val contentView = img

        object : ViewTreeObserver.OnGlobalLayoutListener {
            override fun onGlobalLayout() {
                contentView.viewTreeObserver.removeOnGlobalLayoutListener(this)

                var leftPos = buttonView.left.toFloat()
                var rightPos = buttonView.right.toFloat()
                var topPos = buttonView.top.toFloat()
                var bottomPos = buttonView.bottom.toFloat()

                var centerX = (leftPos + rightPos - contentView.width) / 2
                var centerY = (topPos + bottomPos - contentView.height) / 2

                var soultoX = ObjectAnimator.ofFloat(contentView, "x", centerX).apply {
                    duration = 1000
                }

                var soultoY = ObjectAnimator.ofFloat(contentView, "y", centerY).apply {
                    duration = 1000
                }

                fun soulToButton() = AnimatorSet().apply {
                    play(soultoX).with(soultoY)
                    start()
                }

                soulToButton()
            }
        }.run {
            contentView.viewTreeObserver.addOnGlobalLayoutListener(this)
        }
    }
...