动画将视图移动到错误的位置
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)
}
}
我想将 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)
}
}