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 :

Problèmes de positions de boutons avec XML, respect des echelles avec les DPI


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Association cyberculturelle
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Association cyberculturelle
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Par défaut Problèmes de positions de boutons avec XML, respect des echelles avec les DPI
    Bonjour à tous.

    Attention, je suis débutant en dev sous Android Apres de nombreuses nuits (et jours) de recherche, tests et expériences, je n'ai pas encore réussi a faire complètement ce que je souhaite...

    J'essaie de faire une palette de peinture tactile pour android et je souhaite faire fonctionner l'application sur un tablet.

    Voici les 2 captures d'ecran de ce que je suis entrain de faire:





    En fait le problème que j'ai c'est que la position du bouton rouge que je defini par 100dp en X et 100dp en Y, j'ai l'impression que c'est en pixels que cela s'affiche et non pas en dp, qui devraient théoriquement s'adapter en fonction de la resolution de l’écran. (Regardez bien la position du point rouge sur les deux résolutions d’écran Android différentes).

    Pour ce qui concerne le background et l'image de la palette, celui-ci s'adapte parfaitement a tout type d'ecran.

    Pour info, le dessin de la palette est un fichier d'image vectoriel SVG, et j'utilise une librairie de visualisation d'image vectoriel afin d'avoir aucun pixel quel que soit la résolution. (svg-android-1.1.jar). - D'ailleurs cette librairie je la trouve fantastique

    Pour la taille des boutons je sais que je doit placer les XML de design des boutons dans les dossiers drawable-hdpi, drawable-mdpi et drawable-ldpi, j'ai testé et cela fonctionne

    Je suis juste bloqué avec les positions des boutons en fonction des differentes resolutions.

    Certes, je pourrai brider mon application a fonctionner juste sur la tablet que je vais utiliser mais le but n'est pas la, le but est d'en faire profiter toute la communauté artisique et de developpement android.

    Ici je vous met le code source de mon XML :

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/backgnd_main"
    >
     
         <ImageView
            android:id="@+id/bkgndimage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"            
            />
     
            <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
        	android:orientation="horizontal" 
        	>
     
     
            <Button
            android:id="@+id/buttonred"   
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="100dp"
            android:layout_marginTop="100dp"
            android:background="@drawable/button_red"
            />
     
            <Button
            android:id="@+id/buttonorange"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="300dp"
            android:layout_marginTop="190dp"
            android:background="@drawable/button_orange"
            />   
     
            <Button
            android:id="@+id/buttonyellow"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="220dp"
            android:layout_marginTop="215dp"
            android:background="@drawable/button_yellow"
            />
     
            <Button
            android:id="@+id/buttonlime"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="140dp"
            android:layout_marginTop="230dp"
            android:background="@drawable/button_lime"
            />   
     
           <Button
            android:id="@+id/buttonsky"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="60dp"
            android:layout_marginTop="215dp"
            android:background="@drawable/button_sky" />
     
            <Button
            android:id="@+id/buttonblue"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="25dp"
            android:layout_marginTop="150dp"
            android:background="@drawable/button_blue"
            />  
     
            <Button
            android:id="@+id/buttonpink"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="57dp"
            android:layout_marginTop="82dp"
            android:background="@drawable/button_pink" />        
     
            <Button
            android:id="@+id/buttongrey"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="120dp"
            android:layout_marginTop="40dp"
            android:background="@drawable/button_grey"
            />       
     
            <Button
            android:id="@+id/buttonwhite"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginLeft="195dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/button_white"
            />
     
            </LinearLayout>
     
    </RelativeLayout>
    Merci d'avance pour pouvoir m'aider

    Salutation

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    dp c'est pas indépendant de l'écran....

    La notion de DP est "similaire à l'oeil"... donc un truc de 30dp aura grosso modo la meille taille (en cm) de partout, quelque soit la taille de l'écran et le nombre de pixels....

    La règle ultime étant:
    px = dp * (dpi / 160)

    Sur un écran à 240dpi (GalaxySII), on aura donc px = dp * 1.5
    Sur un écran à 80dpi, on aura donc px = dp / 2

    Il y a plusieurs façons de réaliser ce que tu cherches... ma préférée est de tout passer en "pourcentage"...
    Le layout aura donc un background (la palette), au passage je ne sais pas trop à quoi sert l'ImageView (autant l'intégrer au background non ?)
    Et ensuite, positionner les boutons en fonction de la taille véritable (en pixels) du background...

  3. #3
    Membre averti
    Femme Profil pro
    Association cyberculturelle
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Association cyberculturelle
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Par défaut
    Merci pour ta réponse nicroman

    Effectivement, je me suis perdu avec les DPI, en effet cela n'a rien à voir et je doit donc devoir travailler avec les pourcentages...

    Donc déja le background affiche juste le degradé bleu du fond. L'imageview sert a visualiser la palette de peinture qui est au format SVG. Enfin par dessus nous affichons nos boutons qui correspondent aux couleurs.

    J'ai cherchjé de informations pour positionner des objets dans le XML avec des pourcentages mais je n'ai pas trouvé grand chose a part cette instruction :

    android:layout_weight=".70"

    http://stackoverflow.com/questions/4...relativelayout

    J'ai essayé et mon bouton disparaît totalement.

    Suis-je entrain de suivre le bon chemin?


  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Oui et non....

    layout_weight permet au layout qui contient l'objet de savoir quel "poids" a cette objet....

    Donc un layout avec un total_weight de 10, et 3 objets de layout_weight respectifs 3,2,5 verra ses enfants prendre respéctivement 30%, 20% et 50% de la place du layout.

    Donc on parle bien de "width"... Pour positionner c'est autre chose....

    Une solution consiste à créer des 'view' vides avec les % correspondant aux positions, puis de placer les vrais boutons relativement à ces views...

  5. #5
    Membre averti
    Femme Profil pro
    Association cyberculturelle
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Association cyberculturelle
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Par défaut
    Merci nicroman pour ces infos (1 an après je reviens ), bon j'avais un peu abandonné le projet (car il s'agit d'un projet purement personnel et bon parfais faute de temps... ) Et là c'est cool j'ai un peu de temps devant moi donc je vais essayer de me remettre dessus

    Donc j'ai tout ressorti et recompilé le projet avec la dernière version du SDK Android en API8 avec le nouvel Eclipse fourni avec déja tout préparé Android, qui d'ailleurs au passage je le trouve fantastique Et a priori tout est OK

    Pour en revenir a nos pourcentages, je crains que cela ne fonctionnera pas (si j'ai bien compris ton explication pour la raison suivante :

    Un machine ayant une résolution de 480 X 800, si on divise les deux valeurs on a un ratio de 0,6

    Une machine ayant une résolution de 480 X 854, on obtiens un ratio de 0,5620

    Poussons le vice encore plus loin :

    720 X 1280 on obtiens un ratio de 0,5625 (différence mineure)

    240 X 432 on obtiens un ratio de 0,5555 (différence mineure)

    240 X 400 on obtiens un ratio de 0,6 (différence mineure)

    Ce qui me permet de penser que quoi qu'il en soit, j'aurai toujours de légers décalages... ce qui dans un certain sens n'importe guère dans le cas de cette application.

    Néanmoins, durant cette année j'ai entendu parler des dossiers drawable-hdpi, drawable-ldpi, drawable-mdpi (High, Medium et Low DPI) - Ce qui d'après mes recherches sur le net, correspondent aux 3 différents "Standards" de ratio possibles sur du hard Android... En gros, je me fait 3 fois des fichiers XML avec des boutons gros, moyen et petits, cela voudrai dire que théoriquement, l'application quand elle se lance va automatiquement détecter si c'est du HDPI MDPI ou LDPI et prendre les ressources directement dans les bons dossiers qui correspondent? Et donc ceci corrigerai mon problème


  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    A peu pret la même question qu'un autre membre du forum.

    Tant qu'on reste en "dp" le problème de résolution d'écran ne se pose pas.
    Et on n'a alors pas besoin de faire des layouts différents en fonction de la résolution (d'autant qu'il y en a 5, voir 7 avec les "non officiels", ou non encore déployés: ldpi,mdpi,hdpi,tvdpi,xhdpi,xxhdpi,xxxhdpi)

    Le device est dans l'une de ces résolutions. C'est sur et certain.
    La relation pixels / dp est alors constante.

    Le problème survient quand on veut prendre tout l'écran (le background)... car en effet tous les écrans n'ont pas le même ratio, loin de là (même si le 16:9 deviendra probablement la règle).
    Et surtout quand on veut "positionner" à la main un objet.

    Une possibilité (parmi d'autres):
    Utiliser un background d'une taille (en dps) de T
    Dans un FrameLayout qui prend tout l'écran luis mettre en background la couleur du "tour" de l'image de background précdent.
    A l'intérieur de ce FrameLayout, mettre un autre FrameLyout de la taille exacte du background (T en "dp"), et le centrer (layout_gravity="center"), lui coller en background l'image du background.
    Voilà, dans ce layout, tous les objets peuvent être positiionnés en "dp" et placés de manière correcte, même si l'écran change de ratio.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/10/2012, 18h35
  2. Suivez l'actualité des projets avec le portail des projets
    Par Baptiste Wicht dans le forum Projets
    Réponses: 0
    Dernier message: 28/02/2010, 13h34
  3. Réponses: 4
    Dernier message: 24/08/2009, 13h56
  4. Réponses: 8
    Dernier message: 29/10/2008, 18h02
  5. Réponses: 22
    Dernier message: 03/01/2008, 22h42

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