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 :

Mon premier "programme"


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Par défaut Mon premier "programme"
    Bonjour,
    Je suis totalement débutant en programmation et j'essaie pour l"instant de faire rebondir une balle dans un rectangle.
    J'ai fait ce programme mais la balle va vraiment très doucement. Comment faire pour la voir accélérer??
    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
    public class MainActivity extends Activity
    {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(new MaVue(this));
        }
     
     
        public class MaVue extends View{
            Paint mPaint = new Paint();
            int cx = 300;
            int cy = 200;
            int cdiam = 20;
            boolean avancex = true;
            boolean avancey = true;
     
     
            public MaVue(Context c) {
                super(c);
            }
     
     
            public void onDraw(Canvas canvas){
                mPaint.setColor(Color.WHITE);
                canvas.drawRect(100, 100, 500, 400, mPaint);
                mPaint.setColor(Color.BLUE);
                canvas.drawCircle(cx, cy, cdiam, mPaint);
                invalidate();
                try {
                    Thread.sleep(1);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                update();
            }
     
            public void update() {
                if (cx == 500-cdiam){avancex = false;}
                if (cy == 400-cdiam){avancey = false;}
                if (cx == 100+cdiam){avancex = true;}
                if (cy == 100+cdiam){avancey = true;}
                if (avancex){cx += 1;}
                if (avancey){cy += 1;}
                if (avancex == false){cx -= 1;}
                if (avancey == false){cy -= 1;}
            }
     
     
        }
    }

  2. #2
    Membre émérite
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Par défaut
    Salut,
    Le code est vraiment pas jolie à voir :

    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
     public void onDraw(Canvas canvas){
                mPaint.setColor(Color.WHITE);
                canvas.drawRect(100, 100, 500, 400, mPaint);
                mPaint.setColor(Color.BLUE);
                canvas.drawCircle(cx, cy, cdiam, mPaint);
                invalidate();
                try {
                    Thread.sleep(1);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                update();
            }
     
            public void update() {
                if (cx == 500-cdiam){avancex = false;}
                if (cy == 400-cdiam){avancey = false;}
                if (cx == 100+cdiam){avancex = true;}
                if (cy == 100+cdiam){avancey = true;}
                if (avancex){cx += 1;}
                if (avancey){cy += 1;}
                if (avancex == false){cx -= 1;}
                if (avancey == false){cy -= 1;}
            }
    Faire un sleep dans la methode onDraw n'est carrément pas une bonne solution.
    Il faut que tu crée une methode ailleurs du onDraw qui va appeler ta methode update.
    Je pense qu'une partie du soucis de lenteur viens de la.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Par défaut
    Merci pour ton conseil, je vais voir comment l'appliquer....

  4. #4
    Membre émérite
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Par défaut
    Je ne vais pas te proposer une vrais une solution mais plutôt un aperçus (plus ou moins lointain) de la logique de base que devrais avoir le programme.
    La méthode onDraw doit juste dessiner avec un minimum de calcul dedans. Les calculs se faisant dans un thread à part et demandant à la vue de se mettre à jour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public MaVue(Context c) 
    {
         super(c);
         update();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void onDraw(Canvas canvas)
    {
          mPaint.setColor(Color.WHITE);
          canvas.drawRect(100, 100, 500, 400, mPaint);
          mPaint.setColor(Color.BLUE);
          canvas.drawCircle(cx, cy, cdiam, mPaint);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void update() 
    {
            if (cx == 500-cdiam){avancex = false;}
            if (cy == 400-cdiam){avancey = false;}
            if (cx == 100+cdiam){avancex = true;}
            if (cy == 100+cdiam){avancey = true;}
            if (avancex){cx += 1;}
            if (avancey){cy += 1;}
            if (avancex == false){cx -= 1;}
            if (avancey == false){cy -= 1;}
     
            invalidate();
            update();
    }
    Je n'ai pas testé, mais je pense que le code ci-dessus ne fonctionne, ca doit bloquer l'UI.
    Je pense qu'il faut regarder du coté des Handlers pour te permettre de faire tes calculs puis ensuite appeler la méthode invalidate (qui va demander à ta vue de se redessiner -et donc appeler le onDraw-) dans le main thread.

    Mais je ne suis pas un expert Android, il y a peut être de meilleur solution.

Discussions similaires

  1. [JDOM] Mon premier programme java-xml
    Par adilo dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 12/07/2006, 13h12
  2. [Language] Aide sur mon premier programme Java?
    Par hash2zo dans le forum Langage
    Réponses: 15
    Dernier message: 27/09/2005, 19h26
  3. [Débutant] Mon premier programme: rien ne va...
    Par vincent0 dans le forum OpenGL
    Réponses: 10
    Dernier message: 02/08/2005, 13h59

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