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.
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.
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
@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" />
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'
}
<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" />
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();
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);