Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么缩放动画会更改按钮大小?_Android_Animation_Android Animation_Android View_Objectanimator - Fatal编程技术网

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

Android 为什么缩放动画会更改按钮大小?,android,animation,android-animation,android-view,objectanimator,Android,Animation,Android Animation,Android View,Objectanimator,我的Android应用程序中有几个按钮,开始、停止和暂停。当按下“开始”时,将禁用,并启用“停止”和“暂停”。同样,当按下“停止”或“暂停”时,“开始”将再次启用。当这些按钮改变状态时,我想用一个反弹的动画来为改变设置动画,以直观地向用户指示按钮现在可用。问题是动画实际上是在改变按钮的大小背景。查看此gif,了解我的意思观看停止按钮: 以下是动画的代码: <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="htt

我的Android应用程序中有几个按钮,开始、停止和暂停。当按下“开始”时,将禁用,并启用“停止”和“暂停”。同样,当按下“停止”或“暂停”时,“开始”将再次启用。当这些按钮改变状态时,我想用一个反弹的动画来为改变设置动画,以直观地向用户指示按钮现在可用。问题是动画实际上是在改变按钮的大小背景。查看此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>
为什么停止按钮的大小在变化,我如何防止它这样做

谢谢

注意:我最初将动画的repeatCount设置为1,以便将按钮缩小。我将其更改为0以调试此问题,但同样的情况仍在发生。

我不想使用动画。您必须使用fillEnabled、fillAfter、fillBefore标志,使用这些标志既不方便也不直观

相反,更喜欢动画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()
或者,您可以使用fluent 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是你的观点。
VIEWS

withEndAction将runnable作为其参数
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);
                    }
                });