为什么缩放动画会改变按钮大小?

时间:2017-07-25 15:58:30

标签: android animation android-animation android-view objectanimator

我的Android应用程序中有几个按钮,“开始”,“停止”和“暂停”。按下开始时,将禁用启用停止和暂停。同样,按下“停止”或“暂停”时,“启动”将再次启用。当这些按钮改变状态时,我想用弹跳动画为变化设置动画,以直观地向用户指示该按钮现在可用。问题是动画实际上是在改变按钮大小(背景)。看看这个gif,看看我的意思(看停止按钮):enter image description here

以下是动画的代码:

<?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);

为什么Stop按钮大小会发生变化?如何防止它停止这样做?

谢谢!

注意:我最初将动画的“repeatCount”设置为1,以便将按钮向下缩放。我把它改为0来调试这个问题,但同样的事情仍在发生。

2 个答案:

答案 0 :(得分:3)

我没有使用Animation。您必须使用fillEnabledfillAfterfillBefore标记,这不是方便且不直观的API。

相反,更喜欢Animator的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
            }

答案 1 :(得分:1)

您可以通过以下方式简单实现

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”是您的视图。
问候