Pour mon activité, j'utilise 3 vues personnalisées empilées. La vue du bas est une SurfaceView plein écran, celle du milieu est dérivée de GridView et surcharge onDraw pour ajouter un graphique personnalisé.
La vue supérieure est dérivée directement de View, se trouve dans un coin de l'écran et sert de bouton pour contrôler les deux autres vues (c'est la vue problématique).
Pour ajouter une animation personnalisée à cette vue, j'ai utilisé ce modèle :
public class StubKnobView extends View{
private Drawable knob;
private Point knobPos;
private float rotation;
private boolean needsToMove;
public void moveKnob(){
/* ...various calculations... */
this.needsToMove=true;
invalidate(); //to notify the intention to start animation
}
private void updateAnimation(){
/* ........... */
this.needsToMove= !animationComplete;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
int saveCount=canvas.getSaveCount();
canvas.save();
canvas.rotate(this.rotation, this.knobPos.x, this.knobPos.y );
this.knob.draw(canvas);
canvas.restoreToCount(saveCount);
if(this.needsToMove){
updateAnimation();
}
}
}
Idéalement, si une animation est en cours, la vue devrait s'invalider automatiquement après chaque cycle de dessin.
Actuellement, cela ne fonctionne pas, pour forcer l'animation, je dois toucher l'écran pour provoquer un cycle onDraw. En utilisant "show screen updates" dans les outils de développement, je vois qu'aucun cycle d'invalidation/mise à jour de l'écran ne se produit, sauf lorsque je clique sur l'écran. La spécification du rectangle sale n'a également aucun effet.
Alors, une idée de l'endroit où chercher pour savoir pourquoi ce cycle d'invalidation/d'extraction ne fonctionne pas comme prévu ?