French Largeur dynamique d'un label

yfleury

Active Member
Licensed User
Longtime User
Hallo

J'ai un label dont je dois adapter la largeur au texte qui change dynamiquement. Comment dois-je m'y prendre pour connaitre la largeur du texte du label pour changer la largeur du label pour contenir tout le texte?
 

klaus

Expert
Licensed User
Longtime User
Avec le code ci-dessous, avec un Canvas en utilisant la fonction MeasureStringWidth .
B4X:
Dim bmp As Bitmap
bmp.InitializeMutable(2dip, 2dip)
Dim cvs As Canvas
cvs.Initialize2(bmp)
lbl.Width = cvsDummy.MeasureStringWidth(lbl.Text, Typeface.DEFAULT, FontSize) + DipToCurrent(FontSize / 2)
DipToCurrent(FontSize / 2) à la fin ajoute un espace supplémentaire.
 

yfleury

Active Member
Licensed User
Longtime User
Ca ne fonctionne pas
MeasureStringWidth retourne un Float alors que
lbl.Width a besoin d'un Int
 

klaus

Expert
Licensed User
Longtime User
Et qu'est-ce qui ne fonctionne pas, y a-t-il un message d'erreur ?
Essaie ce code:
B4X:
Dim bmp As Bitmap
bmp.InitializeMutable(2dip, 2dip)
Dim cvs As Canvas
cvs.Initialize2(bmp)
Dim w As Int
w = cvsDummy.MeasureStringWidth(lbl.Text, Typeface.DEFAULT, FontSize) + DipToCurrent(FontSize / 2)
lbl.Width = w
 

yfleury

Active Member
Licensed User
Longtime User
Avec le code ci-dessous, avec un Canvas en utilisant la fonction MeasureStringWidth .
B4X:
Dim bmp As Bitmap
bmp.InitializeMutable(2dip, 2dip)
Dim cvs As Canvas
cvs.Initialize2(bmp)
lbl.Width = cvsDummy.MeasureStringWidth(lbl.Text, Typeface.DEFAULT, FontSize) + DipToCurrent(FontSize / 2)
DipToCurrent(FontSize / 2) à la fin ajoute un espace supplémentaire.

cvsDummy est en rouge dans l'IDE mais en corrigent cvs ca passe.
FontSize est en rouge aussi, j'ai remplacer par 14. Mais j'aimerais bien pouvoir récupérer la valeur aussi.

Maintenant ca fonctionne quand j'ai pas d'erreur sur mon cell

Je suis connecté a mon cell via bluetooth et je pense que ca peut me donner des erreurs. Curieusement avant que j'ajoute ton code, je n'avais pas eu d'erreur. Après vérification, j'ai une erreur une fois sur 2 mais c'est aléatoire.

Voici comment ca se passe. je compile et le code est transmis au cell via bluetooth. Quand je n'ai pas d'erreur, je peux installer l'application et il fonctionne bien. Quand j'ai une erreur, voici comment ca se passe. Je compile et le code est transmis au cell via bluetooth. sur le cell, j'ai cette erreur:

Erreur d'analyse
Un problème est survenu lors de l'analyse du package.
OK

Quand je clique OK, je reviens a l'affichage par défaut du cell et l'IDE est encore en mode exécution du code.
 

yfleury

Active Member
Licensed User
Longtime User
voici mon projet.

Je le commence a peine, je suis en train de faire un menu genre application goolge play ou est-ce que l'on peut défiler les pages soit vers la gauche ou vers la droite, soit en déplacant le menu ou les pages.

Merci de jeter un coup d'oeil
 

Attachments

  • PAQ2014-3.zip
    8.5 KB · Views: 250

klaus

Expert
Licensed User
Longtime User
Ci-joint une version modifiée.
J'ai remplacé 14 (FontSize) par Lbmenu1.TextSize.
Tu pourrais aussi définir la variable FontSize = 14.

Je n'ai pas compris le positionnement des Labels du menu, je l'ai modifié.
A toi de voir si ça te convient.

Tu travailles en mode Debug(legacy), Debug(rapid) ou Release ?

As-tu regardé la librairie AHViewPager ?
Ou cette librairie AHActionBar ?
 

Attachments

  • PAQ2014-4.zip
    8.6 KB · Views: 244

yfleury

Active Member
Licensed User
Longtime User
Merci, je vais regarder ca aussi.... si j'ai pas besoin de réinventer la roue, c'est un bonne chose.

Je travail en mode Debug(legacy)
 

yfleury

Active Member
Licensed User
Longtime User
Dans le même ordre d'idée

Je dois récupérer la hauteur d'un label dont la longueur du texte a changer de quelques lignes.

J'ai essayé avec
B4X:
        retour = cvs.MeasureStringHeight(leLabel.Text, Typeface.DEFAULT, leLabel.TextSize) + DipToCurrent(leLabel.TextSize / 2

ca me donne la hauteur de la première ligne alors que j'ai 5 lignes a afficher.

Une idée?
 

yfleury

Active Member
Licensed User
Longtime User
Merci pour l'info et entre temps, j'ai trouver la solution pour ceux que ca pourrait intéresser.

avec
B4X:
LargeurDuTexte= cvs.MeasureStringWidth(leLabel.Text, Typeface.DEFAULT, leLabel.TextSize) 'DipToCurrent(labelMenu.TextSize / 2) + 20dip
retour = cvs.MeasureStringHeight(leLabel.Text, Typeface.DEFAULT, leLabel.TextSize) * Ceil(LargeurDuTexte/ leLabel.Width )

Ainsi, on a la largeur d'une ligne et connaissant la largeur du label, il est facile de trouver le nombre de ligne Ceil()
 

klaus

Expert
Licensed User
Longtime User
Je ne suis pas persuadé que ce calcul fonctionne correctement dans tous les cas.
Selon la répartition des mots dans une ligne la longueur du texte peut être plus courte que la largeur du Label.
Il est donc plus sûr d'utiliser StringUtils1u.MeasureMultilineTextHeight(Label1, Label1.Text) de la librairie StringUtils.
 
Top