IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Petit problème avec la méthode invalidate()


Sujet :

Android

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Novembre 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Novembre 2017
    Messages : 1
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
        }
    }

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    invalidate() est très certainement appelé dans la méthode de la classe mère AppCompatButton quand tu fais appel à super.onTouchEvent(event); .

    Donc dans ton cas il vaut mieux ne pas appeller invalidate() puisqu'il est déjà appelé par la classe mère. Si tu le fais tu redessine 2x la vue au lieu d'une seul , c'est donc moins performant.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. petit problème avec méthode clearcontents
    Par Iichham dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/07/2011, 10h18
  2. Problème avec la méthode pack()
    Par tomca dans le forum Langage
    Réponses: 5
    Dernier message: 15/09/2005, 10h58
  3. Petit problème avec Line Input
    Par GrosQuicK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2005, 12h47
  4. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  5. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo