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 :

Dessiner des rectangles superposés


Sujet :

Android

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Points : 24
    Points
    24
    Par défaut Dessiner des rectangles superposés
    Bonjour à tous,

    Tout d'abord je m'excuse pour la peut-être facilité du problème posé, je débute sous Android (et oui encore un nouveau développeur sur cette platforme !).

    Je souhaite créer des petits rectangles les uns au dessous des autres. Ces rectangles forment une entité occupant toute la hauteur de l'écran, et sont de largeur fixé, 10 par exemple. La hauteur de chaque rectangle doit donc être la hauteur de l'écran divisée par le nombre de rectangle.

    Le rendu visuel est donc un unique grand rectangle de largeur 10 et qui occupe l'entière hauteur de l'écran. Mais en réalité, ce n'est pas un unique rectangle mais plusieurs petits rectangles de largeur 10 et de hauteur "taille écran / nombre rectangle".

    J'espere que je me fais bien comprendre...


    Via la methode drawRect dans le canevas, et dans une boucle for je crée donc mes N rectangles. Mais le problème est que ceux-ci n'ont pas tous la même taille... J'utilise la methode getHeight pour avoir la hauteur de l'écran.
    Je suspecte une erreur d'arrondie... Mais pourtant la methode drawRect prend des floats... :o

    Je sais que ce n'est pas evident de travailler sans code et je ne vois pas comment vous pourriez m'aider sans voir mon code. Mais je ne suis pas chez moi pour le moment et ne peut vous transmettre le code (j'édite mon post demain ou ce soir).

    Si je post déja ma demande, c'est que j'aimerais avoir vos suggestions pour effectuer ce dont je vous parle, parceque je pense ne pas m'y être pris proprement.

    Merci d'avance

    Seb


    EDIT : Mon bout de 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
     
     
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(new Panel(this));
    }
     
    class Panel extends View {
       public Panel(Context context) {
          super(context);
       }
     
       public void onDraw(Canvas canvas) {
     
          canvas.drawColor(Color.RED);
          Paint thePaint = new Paint();
          thePaint.setColor(Color.CYAN);
     
          boolean[] deadBrick = new boolean[40];
          deadBrick[5] = true;
     
          for (int brickInHeight = 0; brickInHeight < 40; brickInHeight++){
     
             if (!deadBrick[brickInHeight]){
                canvas.drawRect(0, brickInHeight * (this.getHeight() / 40),20,(brickInHeight + 1) * this.getHeight() / 40, thePaint);
             }
     
          }
     
       }
    }

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Points : 24
    Points
    24
    Par défaut
    En précision a l'édit que je viens de faire : j'ai créer un petit boolean pour cacher des rectangles, selon lequel on cache on a un plus ou moins gros trou (voir aucun trou !)

    Merci d'avance a tous ceux qui m'auront lu et qui tenteront de m'aider.
    Je rappelle que je ne suis pas fermé, et que je suis ouvert a toute autre proposition me permettant de réaliser ce "dessin". Je ne cherche pas seulement une correction.

  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 : 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
    un truc comme ça peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int nbBrick = 40;
    float myHeight = (float)(this.getHeight() / nbBrick);
    for (int brickInHeight = 0; brickInHeight < nbBrick ; brickInHeight++){
     
             if (!deadBrick[brickInHeight]){
                float h = myHeight * (float)brickInHeight;
                canvas.drawRect(0, h, 20, (float)h+myHeight, thePaint);
             }
     
    }
    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

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup d'avoir pris le temps de me lire et de me répondre :=)

    Je ne suis encore pas chez moi (au taf) et ne peut donc pas tester ce code. Mais je l'ai entierement lu et compris... et je suis d'accord avec. Il est même bien plus clair que le miens

    La difference entre nos deux codes (mise a part la clarté...) est que je demande d'aller jusqu'a la nième case quand tu demandes d'aller a la case suivante.

    Mais pourquoi mon code ne fonctionne pas ? Les deux methodes devraient fonctionner ! J'aime bien comprendre mes erreurs

  5. #5
    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
    En faîte, je pense que le soucis peut venir d'un soucis d'arrondi.
    D'après tes dires (j'ai pas vérifié ^^), la méthode pour dessiner prend des floats en paramètre.
    Or quand tu fais tes calculs tu inclus des "int" dans tes divisions. donc souvent le résultat est casté en int, donc ça peut créer un problème d'arrondi.
    Après j'ai pas testé, donc je ne sais pas si ça va résoudre ton soucis, mais ça peut y contribuer
    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

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Points : 24
    Points
    24
    Par défaut
    Ok, donc a priori tu es d'accord avec mon code et tu suis ma suspection faite au premier post sur l'erreur d'arrondi. Je vais voir ça ce soir en testant et j'editerais ce post pour te tenir au courant.

    Cependant je trouve ca etrange qu'un double (getHeight est en double je crois) divisé par un int (40) dans un parametre float soit casté en int... Je l'aurais plus vu casté en float...!

    Merci beaucoup en tout cas :=)

    EDIT : Cela fonctionne a moitié ! Les rectangles ne vont plus jusqu'en bas de l'écran... mais ils font toutes la bonne taille. Erreur d'arrondi je suppose, en tout cas ça a l'air de le confirmer. Une idée pour éviter ça ?

    EDIT 2 : Problème résolu ! Il fallait utiliser un float pour la variable nbBrick, c'était bien un p**** de problème d'arrondi ! Merci pour l'aide

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/12/2012, 21h32
  2. Réponses: 0
    Dernier message: 21/12/2012, 22h50
  3. Réponses: 1
    Dernier message: 21/11/2006, 17h00
  4. Réponses: 6
    Dernier message: 22/05/2006, 12h21
  5. [Image]Dessiner des rectangles sur une image
    Par navona dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 09/03/2006, 22h51

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