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 :

Faire clignoter un cercle sur une activité dans un Timer


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Faire clignoter un cercle sur une activité dans un Timer
    Bonjour Chers développeurs,

    je suis débutant en Développement Androïde et j'aimerais realiser une application qui fait clignoter un cercle et un Tosur mon activité a travers un TimerTask.

    Mon souci est le suivant: Quand je lance l'application, le Toast clignote comme voulu, mais le cercle ne clignote pas. Pourtant les deux sont au meme endroit dans le même bock de code.
    voci mon code:

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    package com.example.Test;
     
    import java.util.Timer;
    import java.util.TimerTask;
     
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.res.Resources;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.Toast;
     
     
    public class HommeActivity extends Activity {
     
    	Timer timer;
    	TimerTask task;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
     
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    		setContentView(new RenderView(this));
     
    		//	Le timer
    		timer = new Timer();
    	}
     
    	/**
             * CETTE PARTIE SERT A DESSINER UN POINT OU UN CERCLE SUR MON ACTIVITY
             * 
             */
     
    	class RenderView extends View {
     
    		public RenderView(Context context) {
    			super(context);
    			// TODO Auto-generated constructor stub
    		}
     
    		//la procédure pour dessiner le point
     
    		protected void onDraw(final Canvas canvas){
     
    			Resources res= getResources();
     
    			Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.mapci);
    			int Bwidth=bitmap.getWidth();
    			int Bheight = bitmap.getHeight();
    			final Paint paint = new Paint();
     
    			int iWidth= canvas.getWidth(); // largeur
    			int iHeight = canvas.getHeight();//hauteur
    	                mettre une image en arriere plan de mon Canvas
    			canvas.drawBitmap(bitmap, (iWidth-Bwidth)/2, (iHeight-Bheight)/2,null);
     
     
    			final Handler handler = new Handler();
    			task = new TimerTask() {
    				public void run() {
    					handler.post(new Runnable() {
    						public void run() {
                                                           //couleur du Cercle
    							paint.setColor(Color.RED);
                                                            //dessiner le cercle
    							canvas.drawCircle(iWidth/2, iHeight/2, 15, paint);
    							Toast.makeText(getContext(), "Nous sommes ici !", Toast.LENGTH_SHORT).show();
    						}
     
    					});
    		}
    			}; 
    			timer.schedule(task, 0, 5000);
     
     
     
    		}
    	}
     
    }

    Regardez ce code et aidez mois, je ne sais vraiment pas ce qui ce passe
    Merci

  2. #2
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 050
    Points : 1 052
    Points
    1 052
    Par défaut
    Dans votre méthode "run" :

    • vous dessinez un cercle
    • vous activez la fonction Toast

    Tout cela à un rythme de 5 secondes.

    Par nature, le toast va se désactiver au bout de quelques secondes. Votre "run" va donc le réactiver et effectivement vous allez le voir clignoter.

    Mais le cercle ? Vous le tracez ... ben il reste tracé. Au bout de 5 secondes, vous le retracez ... sur lui même. Il ne va donc pas clignoter.

    Si vous voulez qu'il clignote, il faut :

    • le tracer,
    • l'effacer,
    • le tracer,
    • l'effacer
    • ... and so on.

    Cordialement.

    Pierre

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci ChPr, je suis parfaitement d'accord avec toi, mais avec le code que j'ais mis dans mon premier poste, comment est ce que je peux agencer les choses pour que ce donne cela, (j'y réfléchi mais je ne vois pas comment faire avec cette tête de débutant)

    Merci

  4. #4
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 050
    Points : 1 052
    Points
    1 052
    Par défaut
    Pour effacer un dessin sur un autre, il y a deux façons :

    1 : avoir mémorisé ce qui était en dessous du dessin à effacer et alors réactive ce contenu mémorisé. Ni simple ni forcément efficace
    2 : tout redessiner : peut prendre du temps. Apparemment, sous android, redessiner toute la vue se fait dans la foulée. On va donc partir sur cette idée.

    Définir quelque part un boolean unCercle; Puis, dans la méthode run(), faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    						public void run() {
     							canvas.drawBitmap(bitmap, (iWidth-Bwidth)/2, (iHeight-Bheight)/2,null);
     							if (unCercle) {
     								paint.setColor(Color.RED);
     								canvas.drawCircle(iWidth/2, iHeight/2, 15, paint);
     							}
     							unCercle = ! unCercle;
    							Toast.makeText(getContext(), "Nous sommes ici !", Toast.LENGTH_SHORT).show();
    						}
    Mais n'étant pas un spécialiste d'Android, peut-être auras-tu de mailleures propositions.

    Cordialement.

    Pierre

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci ChPr,

    j'ai suivi tes conseils et le comportement est pareil, j'ai déclarer la variable "unCercle" et l'initialiser à 'true' et je l'ai déclaré comme une propriété de l’activité.

    ceque je constate c'est que l'image que j'ai mis en arriéré plan du canvas ne s'affiche plus, alors je me demande si c'est dans le run() qu'i=on doit ler placer.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      public void run() {
     							canvas.drawBitmap(bitmap, (iWidth-Bwidth)/2, (iHeight-Bheight)/2,null);
     							if (unCercle) {
     								paint.setColor(Color.RED);
     								canvas.drawCircle(iWidth/2, iHeight/2, 15, paint);
     							}
     							unCercle = ! unCercle;
    							Toast.makeText(getContext(), "Nous sommes ici !", Toast.LENGTH_SHORT).show();
    						}
    le toast continue de clignoter, et même quand je le code du toast en commentaire, le cercle ne s'affiche pas.

    Merci.

  6. #6
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 050
    Points : 1 052
    Points
    1 052
    Par défaut
    Je n'ai jamais utilisé de Timer, mais peut-être faut-il sortir tout ce qui le concerne de la méthode onDraw. Puis, invoquer cette méthode par un invalidate(); au sein du run() du timer ?

    Cordialement.

    Pierre

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci, le invalidate provoque un BUG : DESOLE, FERMETURE SOUDAINE DE L'APPLICATION.......

Discussions similaires

  1. Faire un zoom sur une figure dans le même slide
    Par Delaready dans le forum Powerpoint
    Réponses: 2
    Dernier message: 15/06/2014, 01h23
  2. comment faire fonctionner l'exe sur une autre machine
    Par brian79 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/05/2004, 14h00
  3. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25
  4. [Sans MFC]Faire clignoter l'icone d'une application?
    Par Melchisedec dans le forum MFC
    Réponses: 4
    Dernier message: 16/07/2003, 12h14
  5. Réponses: 1
    Dernier message: 23/02/2003, 06h22

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