【问题标题】:How do I make the button the user pressed, shrink in size upon being pressed?如何使用户按下的按钮在按下时缩小?
【发布时间】:2019-10-21 01:36:18
【问题描述】:

我正在开发一款手机游戏,在游戏中,用户在按键收缩之前,先按下按键,为了让游戏“好玩”,按键收缩的速度越来越快,所以当用户按下一个按键时,会弹出另一个缩小速度更快的按钮。到目前为止,我有这段代码可以处理用户输入和按钮的缩小,但是,一旦按下没有动画,它会立即捕捉到“缩小”的大小,我不知道如何解决这个问题。

button.setOnClickListener(new Button.OnClickListener(){
        @Override
        public void onClick(View arg0) {
            ViewGroup.LayoutParams params = button.getLayoutParams();
            Integer value = 120;
            while(value >= 2) {
                value = value - 1;
                SystemClock.sleep(50);
                params.width = value;
                params.height = value;
                button.setLayoutParams(params);
            };
        }
    });

我添加了 SystemClock.sleep(50) 行,因为我认为这就是它正在捕捉的原因(即它是如此之快以至于我只是没有看到动画)但情况并非如此,因为应用程序只是挂起直到按钮的大小已更新。

附:在开发移动应用方面,我是个新手。

【问题讨论】:

  • 查看Property Animation Overwiew:您可以在onClick() 中启动收缩动画,而不是在SystemClock.sleep(50); 中使用while 循环

标签: java android


【解决方案1】:

编辑

忘记我在原始帖子中写的内容。请尝试下面的代码,让我知道这是否对您有帮助。

final ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.0f, 0.0f); //start and end value
        valueAnimator.setDuration(2000); //you can replace 2000 with a variable you can change dynamically
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float animatedValue = (float) animation.getAnimatedValue();
                button.setScaleX(animatedValue);
                button.setScaleY(animatedValue);
            }
        });
        valueAnimator.start();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                valueAnimator.pause();
            }
        });

原答案

我会听从 0X0nosugar 的建议。

在您的 Android 文件树中,在您的 res 目录下,添加一个 Android 资源目录(右键单击 res 文件夹 > 新建)并将其命名为“anim”。如果您使用该名称,Android Studio 可能会自动将其视为保存动画的文件夹。 再次右键单击动画文件夹 > 新建 > 动画资源文件。 把它命名为你想要的。在我的示例中,我将其命名为 button_animator。

您的文件树将如下所示:

您的 button_animator.xml 可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="0.1"
        android:fromYScale="1.0"
        android:toYScale="0.1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="500" />

</set>

您可以使用这些行来定制按钮的结束比例:

android:toXScale="0.1"

android:toYScale="0.1"

在您的代码中,您可以动态地定制您的动画:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Animation shrinkButton = AnimationUtils.loadAnimation(MainActivity.this, R.anim.button_animator); //reference the animator
                shrinkButton.setDuration(5000); //dynamically set the duration of your animation
                button.startAnimation(shrinkButton); //start the animation. Since it is inside an onclicklistener, the animation start on a button click event

                shrinkButton.setAnimationListener(new Animation.AnimationListener() { //you could use an AnimationListener to do something on certain event, like at the end of the animation
                    @Override
                    public void onAnimationStart(Animation animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animation animation) { //you probably want to something onAnimationEnd, otherwise the button will snap back into its original size.

                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {

                    }
                });

            }
        });

在 onAnimationEnd 中,您必须决定在动画结束时要做什么。只是几个想法:

@Override
public void onAnimationEnd(Animation animation) { //you probably want to something onAnimationEnd, otherwise the button will snap back into its original size.
    button.setScaleX(0.1f); //same size as in toScale size in the animator xml
    button.setScaleY(0.1f);
}

或者,如果您希望按钮不可见:

@Override
public void onAnimationEnd(Animation animation) {
    button.setVisibility(View.INVISIBLE);
}

【讨论】:

  • 非常感谢,我怎样才能更改代码,使其在用户按下它之前收缩,一旦用户按下它,它就会停止收缩?
  • 我添加了一个新的解决方案。请检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多