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 dans une View


Sujet :

Composants graphiques Android

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Points : 65
    Points
    65
    Par défaut Dessiner dans une View
    Bonjour,

    J'aimerais, en tant que débutant sur Androïd, commencer par faire le programme suivant :
    Le programme démarre avec un écran noir et ne fait rien tant que l'utilisateur n'a pas touché l'écran.
    À chaque fois que l'utilisateur touche l'écran, un petit cercle de couleur aléatoire apparaît à l'endroit où l'écran a été touché.
    Petite précision : si l'utilisateur clique n fois sur l'écran, il y aura n cercles d'affichés (pas de réinitialisation de l'affichage).

    J'aimerais ne pas relancer à chaque fois le dessin de tous les cercles lorsqu'un nouveau cercle est ajouté (bonjour l'optimisation si l'écran est encombré de cercles) !
    Du coup comment faire ?
    Y a t'il moyen de dessiner en dehors de la fonction OnDraw (dans la fonction onTouch dans mon cas) ?

  2. #2
    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 : 40
    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
    Points : 4 240
    Points
    4 240
    Par défaut
    Tu peux effectivement demander de redessiner qu'une partie de l'écran (là où se trouve ton nouveau cercle).
    mais je pense que dans un premier temps cela ne sert pas à grand chose.

    Souhaites-tu partir sur un composant à toi pour gérer le dessin ? basé sur un Canvas ?
    N'hésites pas à nous détailler un peu ton algo pour voir où les optimisations peuvent être placées.
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Points : 65
    Points
    65
    Par défaut
    Je souhaite dessiner dans un canvas

    J'aimerais dessiner le cercle (fonction drawCircle de la classe Canvas) dans la fonction onTouch plutôt que dans la fonction onDraw.
    Est-ce possible ? Si oui comment faire ?

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Points : 65
    Points
    65
    Par défaut
    Autre problème :
    Je récupère la largeur et la hauteur de l'écran (par les fonctions canvas.getWidth() et canvas.getHeight()).
    Mais ceux-ci sont bien supérieurs à la largeur et la hauteur réelle de l'écran dans l'émulateur !!!!
    Du coup mes fonctions de dessins débordent de l'écran.
    Comment cela se fait-il ?

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Points : 65
    Points
    65
    Par défaut
    Bon j'ai trouvé une solution pour ne pas avoir à redessiner tout l'affichage à chaque fois que je mets à jour celui-ci.

    L'idée est de créer, dans la fonction onDraw, et uniquement lors du 1er appel de celle-ci, un bitmap qui a pour dimensions les dimensions de l'écran.
    Ensuite la fonction onDraw ne se contente que d'afficher le bitmap qui occupe tout l'écran :
    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
     
    public class DrawView extends View
    {
    	boolean init = true;
    	Bitmap ecran;
    	Canvas can;
    	...
    	...
    	public void onDraw(Canvas canvas)
    	{
    		if (init == true)
    		{
    			width = canvas.getWidth();
    			height = canvas.getHeight();
    			ecran = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    			can = new Canvas(ecran);
    		}
    		else
    			canvas.drawBitmap(ecran, 0, 0, null);
    		init = false;
    	}
    	...
    	...
    }

    Ensuite ailleurs dans le code, je dessine tout simplement dans le bitmap !
    Par exemple à l'appui d'une touche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public boolean onTouch(View v, MotionEvent event) 
    {
    	float x, y;
    	x = event.getX() - 5;
    	y = event.getY() - 5;
    	can.drawCircle(x, y, 10, null);
    	this.invalidate();
    }
    J'ai testé, ça a l'air de marcher et je trouve que cette solution apporte beaucoup de souplesse, mais est-ce une bonne façon de faire ?
    Qu'en pensez-vous ?

  6. #6
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Tu n'en as pas besoin de ceci :

    là tu forces le onDraw

    Event Handling and Threading

    The basic cycle of a view is as follows:

    An event comes in and is dispatched to the appropriate view. The view handles the event and notifies any listeners.
    If in the course of processing the event, the view's bounds may need to be changed, the view will call requestLayout().
    Similarly, if in the course of processing the event the view's appearance may need to be changed, the view will call invalidate().
    If either requestLayout() or invalidate() were called, the framework will take care of measuring, laying out, and drawing the tree as appropriate.
    Du coup pas besoin de l'invalidate si tu ne veux pas redessiner la bitamp.

    A toi de voir .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

Discussions similaires

  1. Un éditeur de dessin dans une page web
    Par Kyp dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 31/01/2006, 01h52
  2. Réponses: 10
    Dernier message: 09/11/2005, 15h08
  3. [MFC] Dessin dans une boite de dialogue .
    Par Platypus dans le forum MFC
    Réponses: 8
    Dernier message: 21/07/2005, 11h21
  4. [debutant]dessins dans une fenetre
    Par drosophile dans le forum 2D
    Réponses: 4
    Dernier message: 04/11/2004, 14h55
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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