Ce que je suis en train de réalisercirculaire animation lors du passage révèlent entre deux vues
J'ai un groupe de boutons dans un GridLayout. L'un des boutons bascule la fonction des autres boutons entre l'arrondi et l'arrondi. J'essaye d'implémenter une animation qui change la couleur des boutons dans un effet d'ondulation. L'animation circulaire de révélation est l'effet que je veux où la nouvelle couleur se propage du point de contact sur le bouton de basculement au reste des autres boutons. Je veux seulement que l'animation se développe à partir du point de contact dans les deux cas, passant de l'arrondi à l'arrondi.
Problème
L'animation ne fonctionne qu'en première instance de l'arrondissement jusqu'à arrondi vers le bas (mon application commence par arrondi comme la valeur par défaut). Il n'y a pas d'animation lorsque vous passez de l'arrondi à l'arrondi; tous les boutons changent simplement de couleur et le bouton à bascule change d'icône.
Ceci est ma première application, donc j'ai de la difficulté à essayer de savoir où je me suis trompé.
Ma méthodologie et le code
Dans mon fichier de mise en page de activity_main.xml, j'ai créé deux ensembles de GridLayouts (chacun avec des boutons de l'enfant) et les en couches l'une sur l'autre en enveloppant les deux dans un FrameLayout. Un ensemble est donné une couleur différente à l'autre ensemble; J'ai également une icône différente pour le bouton de basculement pour chaque ensemble pour faire la différence entre les deux méthodes d'arrondi. J'ai défini l'attribut de visibilité sur le second parent GridLayout sur invisible.
<FrameLayout
<GridLayout
android:id="@+id/roundUp"
<ImageButton
android:id="@+id/buttonU1"
... />
<Button ... />
<Button ... />
</GridLayout>
<GridLayout
android:id="@+id/roundDown"
android:visibility="invisible"
<ImageButton
android:id="@+id/buttonD1"
... />
<Button ... />
<Button ... />
</GridLayout>
</FrameLayout>
Dans mon fichier MainActivity.java:
import ...
boolean roundingMode;
public class MainActivity extends AppCompatActivity {
GridLayout roundUp, roundDown;
ImageButton buttonU1, buttonD1;
Button ...
@Override;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
roundUp = (GridLayout) findViewById(R.id.roundUp);
buttonU1 = (ImageButton) findViewById(R.id.buttonU1);
roundDown = (GridLayout) findViewById(R.id.roundDown);
buttonD1 = (ImageButton) findViewById(R.id.buttonD1);
roundingMode = true;
buttonU1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonCircularRevealAnim(roundDown);
roundingMode = false;
}
});
buttonD1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonCircularRevealAnim(roundUp);
roundingMode = true;
}
});
}
public void buttonCircularRevealAnim(View view) {
int originX = roundUp.getWidth()/2;
int originY = roundUp.getHeight()/2;
float finalRadius = (float) Math.hypot(originX,originY);
Animator anim;
if (roundingMode) {
anim = ViewAnimationUtils.createCircularReveal(roundDown, originX, originY, 0, finalRadius);
roundDown.setVisibility(View.VISIBLE);
anim.start();
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
roundUp.setVisibility(View.INVISIBLE);
}
});
} else {
anim = ViewAnimationUtils.createCircularReveal(roundUp, originX, originY, 0, finalRadius);
roundUp.setVisibility(View.VISIBLE);
anim.start();
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
roundDown.setVisibility(View.INVISIBLE);
}
});
}
}
ignorer le fait que j'ai actuellement l'origine de l'animation dans le centre de la GridLayout. Je veux juste que les bases fonctionnent en premier.
Je pense que le problème réside dans la logique et/ou la mise en place de l'animation?
J'ai essayé de déplacer les calculs originX, originY et finalRadius dans l'instruction if et d'utiliser roundUp (pour roundingMode true) et roundDown GridLayouts (pour roundingMode false) mais ça n'a pas fonctionné - donc je me dis que ça ne marche pas Peu importe si elle est invisible (dans le scénario où vous passez de l'arrondi à l'arrondi).