Petit problème avec la méthode invalidate()
Bonjour
J'ai appris dans un cours Android que quand on crée une vue personnalisée, et quand on fait des modifications de son état, on doit appeler la méthode invalidate() pour que les modifs soient prises en compte et que la vue s'affiche convenablement à l'écran.
Le code suivant est tiré du cours, et il est très logique et simple : un bouton à l'intérieur duquel on place un carré coloré, et à chaque fois qu'on clique sur le bouton, la couleur du carré change.
Mais quand j'ai voulu joué un peu avec les instructions, j'ai notamment remarqué que quand j'élimine l'appel à la méthode invalidate() dans la redéfinition de onTouchEvent(), l'application marche très bien et la couleur change quand même et ça m'a un peu confus quand à l'utilisation de la méthode invalidate(). Pourquoi elle semble non indispensable dans ce cas ? Comment le carré a pu savoir que des modifications sont faites et il a demandé au bouton de se redessiner sans cette méthode ?
Merci.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| public class ColorButton extends AppCompatButton {
private TypedArray mCouleurs = null; // contains 4 colors
private int position = 0;
private Rect mRect = null;
private Paint mPainter = new Paint(Paint.ANTI_ALIAS_FLAG);
public ColorButton(Context context) {
super(context);
init();
}
public ColorButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ColorButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
Resources res = getResources();
mCouleurs = res.obtainTypedArray(R.array.colors);
setText(R.string.change_color);
mRect = new Rect();
mPainter.setColor(mCouleurs.getColor(position, -1));
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
if(changed) {
mRect.left = Math.round(0.5f * getWidth() - 50);
mRect.top = Math.round(0.75f * getHeight() - 50);
mRect.right = Math.round(0.5f * getWidth() + 50);
mRect.bottom = Math.round(0.75f * getHeight() + 50);
}
super.onLayout(changed, left, top, right, bottom);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
position++;
position %= mCouleurs.length();
mPainter.setColor(mCouleurs.getColor(position, -1));
//invalidate();
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawRect(mRect, mPainter);
super.onDraw(canvas);
}
} |