Estoy desarrollando un juego móvil, en el juego, el usuario presiona los botones antes de que se encojan, para que el juego sea 'divertido', los botones se encogen cada vez más rápido, de modo que cuando el usuario presiona un botón, aparece otro que se encoge más rápido. Hasta ahora tengo este código que maneja la entrada del usuario y el encogimiento del botón, sin embargo, una vez presionado no hay animación, instantáneamente se ajusta al tamaño 'encogido', no estoy seguro de cómo solucionar este problema.

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

Agregué la línea SystemClock.sleep(50) porque pensé que es por eso que se estaba rompiendo (es decir, fue tan rápido que simplemente no vi la animación) pero ese no es el caso, ya que la aplicación simplemente se cuelga hasta que el tamaño del botón es actualizado.

PD. Soy bastante nuevo en lo que respecta al desarrollo de aplicaciones móviles.

1
Konrad Czajkowski 19 oct. 2019 a las 17:17

1 respuesta

La mejor respuesta

Editar

Olvida lo que escribí en mi publicación original. Pruebe el código a continuación y avíseme si esto le ayuda.

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();
            }
        });

Respuesta original

Seguiría la sugerencia de 0X0nosugar.

En su árbol de archivos de Android, debajo de su directorio res, agregue un directorio de recursos de Android (haga clic con el botón derecho en la carpeta res> nuevo) y llámelo "anim". Es probable que Android Studio lo trate automáticamente como una carpeta que contiene animación si usa ese nombre. Haga clic derecho de nuevo en la carpeta anim> nuevo> archivo de recursos de animación. Nómbralo como quieras. En mi ejemplo lo he llamado button_animator.

Su árbol de archivos se verá así:

enter image description here

Su button_animator.xml podría verse así:

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

Puede adaptar la escala final del botón utilizando estas líneas:

android:toXScale="0.1"

Y

android:toYScale="0.1"

Dentro de su código, puede adaptar dinámicamente su animación:

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) {

                    }
                });

            }
        });

En onAnimationEnd tienes que decidir qué quieres hacer al final de la animación. Sólo un par de ideas:

@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);
}

O, si desea que el botón se vuelva invisible:

@Override
public void onAnimationEnd(Animation animation) {
    button.setVisibility(View.INVISIBLE);
}
0
Peter Alexander Christiaans 20 oct. 2019 a las 17:36