为什么缩放动画会改变按钮大小?
Why does scale animation change button size?
我的 Android 应用程序中有几个按钮,"Start"、"Stop" 和 "Pause"。当按下 Start 时,它会被禁用,而 Stop 和 Pause 会被启用。同样,当按下“停止”或“暂停”时,“开始”将再次启用。当这些按钮改变状态时,我想用一个弹跳动画来动画改变,以直观地向用户表明按钮现在可用。问题是动画实际上改变了按钮的大小(背景)。查看此 gif 以了解我的意思(观看停止按钮):
这是动画代码:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<scale
android:fromXScale="1.0"
android:toXScale="1.1"
android:fromYScale="1.0"
android:toYScale="1.1"
android:pivotX="50%"
android:pivotY="50%"
android:duration="200"
android:repeatCount="0"
android:repeatMode="reverse" />
</set>
以及我如何将其应用于按钮:
Animation scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scale_button);
startButton.startAnimation(scaleAnimation);
stopButton.startAnimation(scaleAnimation);
为什么“停止”按钮的大小会发生变化,我该如何防止它发生这种情况?
谢谢!
注意:我最初将动画的 "repeatCount" 设置为 1,这样它会缩小按钮。我将其更改为 0 以调试此问题,但同样的事情仍在发生。
我会避免使用 Animation
。您必须使用 fillEnabled
、fillAfter
、fillBefore
标志,使用起来不方便且不直观 API。
相反,更喜欢 Animator
s API.
您要实现的动画如下所示:
val scaleX = ObjectAnimator.ofFloat(view, View.SCALE_X, 1.0f, 1.1f).setDuration(200)
val scaleY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 1.0f, 1.1f).setDuration(200)
val downscaleX = ObjectAnimator.ofFloat(view, View.SCALE_X, 1.1f, 1.0f).setDuration(200)
val downscaleY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 1.1f, 1.0f).setDuration(200)
val set = AnimatorSet()
set.playTogether(scaleX, scaleY)
set.play(downscaleX).after(scaleX)
set.playTogether(downscaleX, downscaleY)
set.start()
或者,你可以玩流利的API:
view.animate()
.scaleXBy(0.1f)
.scaleYBy(0.1f)
.setDuration(200)
.withEndAction {
view.animate()
.scaleXBy(-0.1f)
.scaleYBy(-0.1f)
.duration = 200
}
您只需通过
即可实现
v.animate().scaleX(1.1f).scaleY(1.1f).setDuration(200).withEndAction(new Runnable() {
@Override
public void run() {
v.animate().scaleX(1.0f).scaleY(1.0f).setDuration(200);
}
});
其中 "v" 是您的观点。
此致
我的 Android 应用程序中有几个按钮,"Start"、"Stop" 和 "Pause"。当按下 Start 时,它会被禁用,而 Stop 和 Pause 会被启用。同样,当按下“停止”或“暂停”时,“开始”将再次启用。当这些按钮改变状态时,我想用一个弹跳动画来动画改变,以直观地向用户表明按钮现在可用。问题是动画实际上改变了按钮的大小(背景)。查看此 gif 以了解我的意思(观看停止按钮):
这是动画代码:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<scale
android:fromXScale="1.0"
android:toXScale="1.1"
android:fromYScale="1.0"
android:toYScale="1.1"
android:pivotX="50%"
android:pivotY="50%"
android:duration="200"
android:repeatCount="0"
android:repeatMode="reverse" />
</set>
以及我如何将其应用于按钮:
Animation scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scale_button);
startButton.startAnimation(scaleAnimation);
stopButton.startAnimation(scaleAnimation);
为什么“停止”按钮的大小会发生变化,我该如何防止它发生这种情况?
谢谢!
注意:我最初将动画的 "repeatCount" 设置为 1,这样它会缩小按钮。我将其更改为 0 以调试此问题,但同样的事情仍在发生。
我会避免使用 Animation
。您必须使用 fillEnabled
、fillAfter
、fillBefore
标志,使用起来不方便且不直观 API。
相反,更喜欢 Animator
s API.
您要实现的动画如下所示:
val scaleX = ObjectAnimator.ofFloat(view, View.SCALE_X, 1.0f, 1.1f).setDuration(200)
val scaleY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 1.0f, 1.1f).setDuration(200)
val downscaleX = ObjectAnimator.ofFloat(view, View.SCALE_X, 1.1f, 1.0f).setDuration(200)
val downscaleY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 1.1f, 1.0f).setDuration(200)
val set = AnimatorSet()
set.playTogether(scaleX, scaleY)
set.play(downscaleX).after(scaleX)
set.playTogether(downscaleX, downscaleY)
set.start()
或者,你可以玩流利的API:
view.animate()
.scaleXBy(0.1f)
.scaleYBy(0.1f)
.setDuration(200)
.withEndAction {
view.animate()
.scaleXBy(-0.1f)
.scaleYBy(-0.1f)
.duration = 200
}
您只需通过
即可实现v.animate().scaleX(1.1f).scaleY(1.1f).setDuration(200).withEndAction(new Runnable() {
@Override
public void run() {
v.animate().scaleX(1.0f).scaleY(1.0f).setDuration(200);
}
});
其中 "v" 是您的观点。
此致