web-dev-qa-db-fra.com

Comment animer un bouton sous Android?

Je suis en train de créer une application Android et un bouton menant à un lieu de messagerie. Sur l'activité avec le bouton, je vérifie s'il y a des messages non lus et, si c'est le cas, je souhaite modifier le bouton pour que l'utilisateur sache qu'il y a quelque chose de non lu.

Je pensais que le bouton vibrerait horizontalement comme 3 secousses toutes les 2 ou 3 secondes.

Je sais comment exécuter un fil en arrière-plan qui fait quelque chose toutes les x millisecondes. Mais ce que je ne sais pas faire, c'est de le secouer horizontalement 3 fois.

Quelqu'un peut-il aider avec cela?

Je pensais utiliser la fonction sin, pour l'animation, je peux utiliser la sortie d'une fonction sin pour obtenir les valeurs qui montent et descendent, que je peux régler la position horizontale du bouton ... Mais cela semble trop extrême, c'est il y a une meilleure façon?

Merci.

22
omega

Je ne peux pas commenter le commentaire de @ omega car je n'ai pas assez de réputation mais la réponse à cette question devrait être quelque chose comme:

shake.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="100"          <!-- how long the animation lasts -->
    Android:fromDegrees="-5"        <!-- how far to swing left -->
    Android:pivotX="50%"            <!-- pivot from horizontal center -->
    Android:pivotY="50%"            <!-- pivot from vertical center -->
    Android:repeatCount="10"        <!-- how many times to swing back and forth -->
    Android:repeatMode="reverse"    <!-- to make the animation go the other way -->
    Android:toDegrees="5" />        <!-- how far to swing right -->

Class.Java

Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
view.startAnimation(shake);

Ceci est juste une façon de faire ce que vous voulez, il peut y avoir de meilleures méthodes.

23
user2323030

créer shake.xml dans le dossier anim

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    Android:fromXDelta="0" 
        Android:toXDelta="10" 
            Android:duration="1000" 
                Android:interpolator="@anim/cycle" />

et cycle.xml dans le dossier anim

<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    Android:cycles="4" />

maintenant ajouter une animation sur votre code

Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
anyview.startAnimation(shake);

Si vous voulez une animation verticale, remplacez les valeurs fromXdelta et toXdelta par les valeurs fromYdelta et toYdelta

22
RVG


Class.Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_with_the_button);

    final Animation myAnim = AnimationUtils.loadAnimation(this, R.anim.milkshake);
    Button myButton = (Button) findViewById(R.id.new_game_btn);
    myButton.setAnimation(myAnim);
}

Pour onClick du bouton

myButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        v.startAnimation(myAnim);
    }
});

Créez le dossieranimdans le répertoireres

Faites un clic droit sur, res -> Nouveau -> Répertoire

Nommez le nouveau répertoireanim

créer un nouveau fichier XML nommé itmilkshake


milkshake.xml

<?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:duration="100"
        Android:fromDegrees="-5"
        Android:pivotX="50%"
        Android:pivotY="50%"
        Android:repeatCount="10"
        Android:repeatMode="reverse"
        Android:toDegrees="5" />

5
DeathRs

Dépendance

Ajoutez-le dans votre racine build.gradle à la fin des référentiels:

allprojects {
repositories {
    ...
    maven { url "https://jitpack.io" }
}}

puis ajoutez dependency dependencies { compile 'com.github.varunest:sparkbutton:1.0.5' }

Usage

XML

<com.varunest.sparkbutton.SparkButton
        Android:id="@+id/spark_button"
        Android:layout_width="40dp"
        Android:layout_height="40dp"
        app:sparkbutton_activeImage="@drawable/active_image"
        app:sparkbutton_inActiveImage="@drawable/inactive_image"
        app:sparkbutton_iconSize="40dp"
        app:sparkbutton_primaryColor="@color/primary_color"
        app:sparkbutton_secondaryColor="@color/secondary_color" />

Java (facultatif)

SparkButton button  = new SparkButtonBuilder(context)
            .setActiveImage(R.drawable.active_image)
            .setInActiveImage(R.drawable.inactive_image)
            .setDisabledImage(R.drawable.disabled_image)
            .setImageSizePx(getResources().getDimensionPixelOffset(R.dimen.button_size))
            .setPrimaryColor(ContextCompat.getColor(context, R.color.primary_color))
            .setSecondaryColor(ContextCompat.getColor(context, R.color.secondary_color))
            .build();
0
Avijit Bairagi
import Android.view.View;
import Android.view.animation.Animation;
import Android.view.animation.Transformation;

public class HeightAnimation extends Animation {
    protected final int originalHeight;
    protected final View view;
    protected float perValue;

    public HeightAnimation(View view, int fromHeight, int toHeight) {
        this.view = view;
        this.originalHeight = fromHeight;
        this.perValue = (toHeight - fromHeight);
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        view.getLayoutParams().height = (int) (originalHeight + perValue * interpolatedTime);
        view.requestLayout();
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
}

uss to:

HeightAnimation heightAnim = new HeightAnimation(view, view.getHeight(), viewPager.getHeight() - otherView.getHeight());
heightAnim.setDuration(1000);
view.startAnimation(heightAnim);
0
arul