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 Studio Java Discussion :

Insérer un composant dans un canvas


Sujet :

Android Studio Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Insérer un composant dans un canvas
    Bonsoir,

    J'essaie de créer une application de dames avec Android Studio.
    Pour la partie, j'ai utilisé une classe View qui possède un canvas (onDraw) qui affiche l'échiquier et gère toute la partie en parallèle d'une autre classe.
    Je voulais ajouter un chronomètre dans cette activité mais je ne vois pas comment je peux faire : il n'est pas compatible avec le canvas.

    Est-ce que quelqu'un pourrait m'aider.

    Je suis vraiment perdu.

    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    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 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par André1251 Voir le message
    ... il n'est pas compatible avec le canvas. ...
    Qu'est-ce que ce widget qui n'est pas compatible avec quoi ?

    Dans votre layout xml, vous ajoutez à votre View par exemple un TextView auquel vous donnez une élévation de 10 dp. Il apparaitra en premier plan.

    Après, à l'aide d'un chronomètre, vous affichez le temps qui vous intéresse dans ce TextView.

    Cordialement.

    Pierre.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonsoir Chpr,

    Merci pour ta réponse cependant, sauf erreur de ma part ce n'est pas si simple.
    En effet, j'ai une classe EngineJeu et une classe ViewJeu qui sont toutes les 2 utilisées dans la classe main (j'ai créé une instance de EngineJeu et j'ai fait setContentView(l'instance de ViewJeu) ).
    Ceci implique que le jeu est fonctionnel (mais n'a pas encore toutes les possibilités comme de créer des dames par exemple).
    Le problème, c'est que si je fais setContentView(R.layout.nom_du_fichier_xml_correspondant), je perd toutes les relations entre mes 2 classes EngineJeu et ViewJeu et par conséquent le jeu ne marche plus (même si je peux dans ce cas ajouter des composants).
    Je voudrais donc, si possible, arriver à mettre par exemple 2 setContentView() l'un avec un layout qui contiendrait le chrono et l'autre avec le ViewJeu, mais je ne sais pas si c'est possible et si ce n'est pas trop lourd.
    Ou si il existe une autre solution, je suis preneur parce que là je galère un peu .

    Merci d'avance pour toute aide.

    Bonne soirée.

  4. #4
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    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 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Si je comprends votre demande, vous voulez un écran sur lequel s'affiche le jeu et un autre écran montrant un chronomètre ou tout au moins une image montrant un temps. Un bouton (ou tout autre commande) permettant de basculer d'un écran à l'autre.

    Je ne pense pas qu'il soit possible d'attacher des layout différents à une même activité. Vous devez :

    • soit créer une deuxième activité à l'aide des Intent ;
    • soit sur un même layout disposer les view relatifs à chacun des deux écrans et, par un commande, rendre visibles ou invisibles les view que vous voulez afficher.

    Cordialement.

    Pierre.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour Pierre (désolé j'avais pas vu le nom),

    En fait, ce que je veux, c'est que mon activité Main ait comme layout la vue que j'ai définie dans ViewJeu mais qu'en plus de tous les dessins dans le onDraw (le damier, les pion, ...) en dessus du damier (ou en dessous peu importe) il y ait un chronomètre qui affiche le temps de chaque tour.
    Et je veux surtout que le tout soit fonctionnel , càd que les pion se déplacent bien, que les pions mangés disparaissent...

    Merci pour ton aide.

    Cordialement

  6. #6
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    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 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Dans ce cas, la proposition que je t'ai faite en #2 est valable et fonctionnelle.

    Cordialement.

    Pierre.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    Désolé du temps de réponse.

    Merci pour votre réponse mais pourriez vous me préciser comment on fait pour utiliser une vue définie dans un layout. Je pense que mon problème vient de là. Pourriez vous écrire un code en xml pour inclure la vue définie dans un fichier java ?

    Merci d'avance.

    Bonne soirée.

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    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 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Dans votre cas, il faut insérer un "TextView" dans votre layout.

    Si vous utilisez Android Studio, vous sélectionnez le fichier "app/res/layout/activity_main.xml et :

    • soit graphiquement vous sélectionnez "TextView" et vous le faites glisser dans la liste des vues,
    • soit par code, vous ajoutez - par exemple - ce qui suit :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        <TextView
            android:id="@+id/TempsRestant"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="500dp"
            android:layout_marginTop="16dp"
            android:layout_marginEnd="500dp"
            android:hint="Temps restant"
            android:textSize="24sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    Attention : ces lignes sont fonction du layout dans lequel vous vous trouvez (constraintlayout, linearlayout, relativelayout, ). Donnez à ce "TextView" un id. Par exemple : "TempsRestant".

    Ensuite, pour utiliser ce TextView, dans votre fichier "MainActivity.java", il faut déclarer un variable :

    puis, après le setContentView, lui affecter la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            tempsRestant = findViewById(R.id.TempsRestant);
    Dès lors, vous pourrez assigner un texte à ce "TextView" (la valeur numérique du temps restant) en faisant appel à une fonction de type "Timer".

    Mais plutôt que de vous détailler tout cela, ce qui qui ne serait qu'une reprise d'un tuto, je ne peux que vous conseiller de suivre un tuto sur la conception d'une application Android.

    Cordialement.

    Pierre.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour Pierre,

    Merci pour ta réponse mais il y a un malentendu, coder du code xml est la base sous android studio et ceci, j'arrive parfaitement à le faire.
    L'exemple que je vous ai demandé de m'écrire, ce serai une vue définie par un fichier java.
    Par exemple, pour mon appli, dans viewJeu j'ai défini et dessiné dans le canvas un damier avec les pions. Je voudrais que vous m'écrivez le code de comment appeler cette classe viewJeu dans un fichier layout. Pour qu'ensuite, plutôt que de relier ma classe mainActivity à viewJeu en faisant setContentView(nom_de_l'instance_de_viewJeu), je fasse setContentView(R.layout.activityMain) où activityMain est le layout qui contient désormais le damier et que lorsqu'on bouge un pion, il bouge bien.

    Merci d'avance.

    Cdt.

  10. #10
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    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 022
    Points : 1 049
    Points
    1 049
    Par défaut
    J'ai du mal à vous suivre.

    A mon sens, une classe définie dans un fichier *.java peut se servir de vues définies dans un fichier layout.xml, mais pas l'inverse. D'autres, plus instruits que moi en Android me contrediront peut-être.

    D"après ce que je comprends, vous avez une classe "MainActivity" qui gère un peu tout, mais qui n'affiche rien. Puis, vous avez une classe "ViewJeu" qui au travers la gestion de son canvas, vous permet d'afficher le damier et ses pions.

    Cette classe se compose certainement de la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Override
    protected void onDraw(Canvas canvas) {
    	super.onDraw(canvas);
    	...
    	...
    }
    qui gère le canvas.

    Pour gérer l'affichage de votre damier via "MainActivity", il faut que dans cette activité, vous ayez une variable qui instancie la classe "ViewJeu, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static ViewJeu monDamier;
    Puis, pour que ce damier s'affiche, il suffit d'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monDamier.invalidate();
    Vous faites cet appel à chaque fois qu'il y a une action sur la damier.

    Maintenant, pour afficher votre compteur de temps, vous faites comme je vous l'ai dit.

    Vous pouvez aussi le gérer directement à l'intérieur de la méthode onDraw en appelant par exemple :

    canvas.drawText(...);

    NOTA : si votre "MainActivity" doit aussi afficher des informations, rendez-les "Visibles/Invisibles" selon ce que vous voulez faire.

    Cordialement.

    Pierre.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour Pierre,

    Merci encore une fois pour votre réponse, je vais essayer comme ça (je ne savais pas qu'on pouvait mettre un composant dans un canvas (chrono, bouton, …).

    Cela dit j'ai encore une question, en faisant ceci, la méthode onDraw sera appelée toutes les secondes (pour mettre à jour l'affichage du chrono) donc si on a un chrono de 5 min par exemple alors il y aura 300 appels à onDraw plus lors des déplacements des pièces.
    Comme le onDraw est assez chargé (il redessine à chaque fois le damier, les pions, ...) j'ai peur que l'appli bloque (soit surchargée) ! N'y aurait-il pas un moyen d'appeler la méthode postInvalidate pour ne dessiner qu'une partie du canvas ? (Rien ne sert que l'échiquier et les pions ne soient dessinés toutes les secondes).

    Merci d'avance.

    Cdt

  12. #12
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    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 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par André1251 Voir le message
    ... Merci encore une fois pour votre réponse, je vais essayer comme ça (je ne savais pas qu'on pouvait mettre un composant dans un canvas (chrono, bouton, …). ...
    Je n'ai pas dit qu'on pouvait mettre un composant dans un canvas. J'ai seulement dit que dans un canvas, comme vous dessinez un damier, des pions, il est possible alors de dessiner un bouton (un rectangle avec du texte à l'intérieur).

    Citation Envoyé par André1251 Voir le message
    ... Comme le onDraw est assez chargé (il redessine à chaque fois le damier, les pions, ...) j'ai peur que l'appli bloque (soit surchargée) ...
    Avez-vous fait l'essai ?

    J'ai une appli GPS qui via le canvas, redessine toute la carte(1280 x 1280 pixels²), zoomée ou pas, dessine une dizaine de waypoints (icônes de 128 x 128 pixels²), dessine deux flèches de direction et dessine deux traces d'une quinzaine de pixels de large avec antialiasing qui peuvent comporter 10000 points chacune.

    Avec des smartphones avec Android 9 ou 10 , cela ne prend que quelques millisecondes.

    Citation Envoyé par André1251 Voir le message
    ... N'y aurait-il pas un moyen d'appeler la méthode postInvalidate pour ne dessiner qu'une partie du canvas ? ...
    Faut essayer.

    Cordialement.

    Pierre.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour Pierre,

    J'ai cherché pendant longtemps (je préfère chercher le plus possible par moi-même et solliciter votre aide que quand je suis vraiment bloqué : je ne vous avais pas oublié ) mais je n'y arrive vraiment pas.
    Le problème vient que comme je n'utilise pas de layout (puisque tout se définit dans des classes java) alors je dois instancier un chronomètre en faisant Chronometer chrono = new Chronometer(getContext());.
    Puis la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    chrono.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener(){
        @Override
        public void onChronometerTick(Chronometer chronometer)
        {
            // CODE
        }
    });
    (qui est appelée à chaque fois que la valeur du chronomètre change) ne fonctionne pas car le chronomètre ne se met pas à jour (à mon avis).

    Pour le chrono, je fais chrono.setBase(...), chrono.start() et chrono.setOnChronometerTickListener(...) après l'instanciation du chronomètre. N'aurais je pas oublié une méthode pour rendre mon chronomètre "reconnu" pour le décompte ?

    Il existe la méthode setCountDown(true) qui pourrait peut-être résoudre ce problème mais je ne peux pas l'essayer car je travaille sur un téléphone réel qui qui a une version d'android inférieure et l'API 24 ne fonctionne pas sur celui ci.

    Pourriez vous m'aider, svp.

    Merci d'avance.

  14. #14
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    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 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par André1251 Voir le message
    ... Pourriez vous m'aider, svp. ...
    Personnellement, j'utilise la méthode suivante (je l'ai utilisée avec l'API 14) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	private final CountDownTimer watchDog = new CountDownTimer(864000000, 1000) { // Compteur à 1 secondes ; durée 10 jours
    		@Override
    		public void onTick(long millisUntilFinished) {
    			// faire ce que vous avez à faire
    		}
     
    		@Override
    		public void onFinish() {
    			start(); // On redémarre pour 10 jours
    		}
    	};
    Cordialement.

    Pierre.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonsoir Pierre,

    Merci pour ton aide.

    Comme tu peux le voir, ca a été long mais ça y est, j'ai réussi à le coder. C'était un peu plus compliqué que ce que tu m'avais dit mais merci quand même .

    Bonne soirée.

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

Discussions similaires

  1. Insérer des composants dans un tableau
    Par Leniouns dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 18/06/2013, 18h12
  2. [Lazarus] Insérer une image dans un canvas
    Par anto974 dans le forum Lazarus
    Réponses: 3
    Dernier message: 14/05/2009, 19h09
  3. insérer un composant dans la palette
    Par laredo dans le forum Débuter
    Réponses: 6
    Dernier message: 18/09/2008, 14h09
  4. Insérer une image dans un canvas en XAML
    Par BlackStorm dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/07/2008, 15h39
  5. Insérer un objet dans un canvas : possible ?
    Par gedeon555 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 04/06/2006, 14h42

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