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

Composants graphiques Android Discussion :

Dessiner sur un Canvas


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 67
    Par défaut Dessiner sur un Canvas
    Bonjour à tous,

    Une question probablement basique d'un grand débutant ... que je me résoud à poser après avoir cherché (longtemps) et essayé plein de trucs .....

    Ci dessous le code d'une appli me permettant de vérifier ma capacité à réaliser sous Android une appli que j'ai développé sur un PALM et dont je maitrise toute la partie calcul, algorithmes, etc ...

    Je teste donc ma capacité à placer des botons et des champs où je veux, à récupérer et exploiter des valeurs saisies, afficher des résultats, etc ... et, à dessiner des formes géométriques calculées réalisées avec des cercles et des segments de droites.

    Et après avoir transpiré sur le reste, c'est maintenant pour le dessin que ça coince, car, vous l'aurez compris, je suis très loin de penser en ANDROID !!!

    Voici le code, l'écran est défini dans main.xml, et ça cela marche bien :
    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
     
     
    package org.HSI03.riAndroid;
     
    import org.HSI03.riAndroid.R;
     
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.widget.EditText;
    //import android.widget.TextView;
    import android.widget.Button;
    import android.view.View;
     
    public class Hsi03Main extends Activity
    {
    	// déclaration des objets dont on aura besoin
    	private Button bGoto;
    	private EditText fieldGoto;
    	private EditText fieldRoute;
    	private EditText fieldObs;
    	private DessineView dessinCourant ;
     
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            initSaisies(); // le lancement de ces méthodes se fait ici pour l'essai
            calculate() ;
            dessinCourant = new DessineView(this);
            //dessinCourant.
        }
        private void initSaisies()// méthode d'initialisation
    	{
        	// récupération des objets champs et bouton avec leur ressources du main.xml
        	fieldGoto= (EditText)findViewById(R.id.fieldGoto);
        	fieldRoute = (EditText)findViewById(R.id.fieldRoute);
        	fieldObs = (EditText)findViewById(R.id.fieldObs);
        	bGoto = (Button)findViewById(R.id.bGoto);
        	// mise en place du listener du bouton qui lance la méthode calculate()
        	bGoto.setOnClickListener(new Button.OnClickListener()
        	{ public void onClick (View v){ calculate(); }});
     
    	}
     
        private void calculate()
    	{
    		double valGoto = Double.parseDouble(fieldGoto.getText().toString());
    		double valRoute = Double.parseDouble(fieldRoute.getText().toString());
    		double vTotal = valGoto + valRoute ;
    		fieldObs.setText(Double.toString(vTotal));
    	}
     
        static public class DessineView extends View
        { 
        	public DessineView(Context context)
        	{ 
        		super(context); 
        	} 
        	@Override 
        	protected void onDraw(Canvas canvas)
        	{ 
        	// Drawing commands go here 
        		float xA = 10;
        		float yA = 10;
        		float xB = 100;
        		float yB = 100;
        		Paint ColTrace = new Paint(); 
        		ColTrace.setColor(Color.BLUE); 
        		Paint ColFond = new Paint(); 
        		ColFond.setColor(Color.WHITE); 
        		canvas.drawRect(0, 0, 320, 400, ColFond);
        		canvas.drawLine(xA, yA, xB,yB ,ColTrace); 
     
        	} 
        }
    }
    Quand je lance l'application dans l'émulateur, le bouton et les champs s'affichent, la saisie et le calcul fonctionnent, mais aucune ligne n'apparait pas plus qu'un fond blanc ....

    Qu'ai-je oublié ?
    Qu'ai-je fait de travers ?
    Oui, l'imagination des débutants est sans limite !

    Merci de votre aide ...

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2008
    Messages
    658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 658
    Par défaut
    Cette declaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dessinCourant = new DessineView(this);
    ne suffit pas pour afficher ; il faut ecrire setContentView( dessinCourant) pour afficher les lignes; mais ds ce cas les champs de textes, les boutons ne seront plus afficher

    Pour les afficher ensemble il faut declarer un layout en code java ou ajouter tout simplement DessineView en layout.xml

    <org.HSI03.riAndroid.DessineView
    les parametres//

    />

    setContentView(r.layout.main) affichera alors tous ensemble

  3. #3
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Ou alors si tu souhaites garder le code tel que tu l'as fait, et juste afficher ton composant de dessin en pluss, tu peux faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            initSaisies(); // le lancement de ces méthodes se fait ici pour l'essai
            calculate() ;
            dessinCourant = new DessineView(this);
            //dessinCourant.
     
            LinearLayout monMain = (LinearLayout)findViewById(R.layout.main);
            monMain.addView(dessinCourant);
        }
    Bien sûr adapte le type de "monMain" en fonction de ce que tu as déclaré dans ton XML...

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2008
    Messages
    658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 658
    Par défaut
    Exacte c'est ce que je voudrais dire aussi

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 67
    Par défaut
    Bonjour à vous deux et merci de votre aide,

    Bon j'ai expérimenté et continué à chercher.
    J'ai vérifié que le fait de rajouter
    setContentView( dessinCourant);
    me permettait de voir le tracé en bleu sur fond blanc mais en perdant le reste. C'est déjà une grande victoire !

    Par contre, je n'ai pas compris la façon de déclarer DessineView qui est une classe de ma fabrication dans le main.xml (de layers) ...

    J'ai essayé la méthode de MrDuChnok, qui consiste, si j'ai bien compris à ajouter l'instance de ma classe DessineView au layer défini dans mon main.xml.

    J'ai utilisé un AbsoluteLayer parceque c'est plus facile pour faire mes essais, mais j'ai compris que ce n'était pas le top.
    Cela donne ;
    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
     
     
    	@Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            initSaisies(); // le lancement de ces méthodes se fait ici pour l'essai
            calculate() ;
            dessinCourant = new DessineView(this);
            //setContentView( dessinCourant);
            AbsoluteLayout monMain = (AbsoluteLayout)findViewById(R.layout.main);
            monMain.addView(dessinCourant);
     
     
        }
    et cela plante l'application avec le message qui montre la sortie obligatoire ...

    Quand j'élimine la ligne :
    monMain.addView(dessinCourant);
    cela ne plante pas mais le tracé n'est pas affiché. Normal !

    Eclipse ne montre pas d'erreur en dehors du fait que Absolutelayer est deprecated (obsolete ?)

    Bon, je sens que j'avance, mais il faut pousser encore un peu !

    Merci d'avance....

  6. #6
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Je pense que c'est parce que tu n'as pas rajouté de paramètres lorsque tu as ajouté ton composant (DessineView) à ton layout principale (AbsoluteLayout).

    http://developer.android.com/referen...outParams.html

    Sinon voir les tutoriels et cours de formation pour apprendre la prog Android: http://android.developpez.com/cours/

    Pour en être sûr, je t'invite à consulter la view "LogCat" sous Eclipse. Elle te permettra de suivre les logs de ton application et surtout de voir les exceptions remontées...

    Si tu n'arrives pas à résoudre ton soucis, colle ici ton exception (ainsi que ton xml contenant le layout, ça peut aider)

    Bon courage

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2008
    Messages
    658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 658
    Par défaut
    Ce que MrDuChnok a dit est une solution mais moi je vais te donner une autre solution avec les AbsoluteLayout.


    Copie et colle ce code dans ton fichier main.xml [ avec AbsoluteLayout]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <org.HSI03.riAndroid.DessineView
     android:id="@+id/mondession"
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_y="300px"
     android:layout_x="10px"
    />
    Et met en commentaire tout ces lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     dessinCourant = new DessineView(this);
            //setContentView( dessinCourant);
            AbsoluteLayout monMain = (AbsoluteLayout)findViewById(R.layout.main);
            monMain.addView(dessinCourant);
    Donc ta methode on create doit etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            initSaisies(); // le lancement de ces méthodes se fait ici pour l'essai
            calculate() ;
        }
    Ou bien comme MrDuChnok colle ton main.xml ici!!!

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

Discussions similaires

  1. [API HTML5] Enlever une image dessinée sur le canvas
    Par tails dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 21/01/2015, 02h19
  2. Dessin sur un canvas dans une DLL
    Par colorid dans le forum Langage
    Réponses: 1
    Dernier message: 07/03/2009, 14h09
  3. [C#] Dessiner sur un canvas et manipuler des formes avec la souris
    Par nemesisTHEone dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 18/01/2009, 15h37
  4. [Lazarus] [Débutant] Opération de trame dans un dessin sur un canvas
    Par Alcatîz dans le forum Lazarus
    Réponses: 3
    Dernier message: 30/10/2008, 15h17

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