动画将视图移动到错误的位置

Animation moves View to wrong position

我想将 ImageView 移动到 Button 的中心。为此,我使用以下代码:

    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() 时,mContentView 不会移动到 mButtonView 中间的预期点,而是移动到屏幕的左上角。知道为什么吗?

我认为问题在于 - 在屏幕构造期间找到 Android 视图的 coordinates/size。要尽快获取视图的 coordinates/size,请将侦听器附加到其 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)
        }
    }