Tirage de la toile Android tirezTextrez-vous la taille de la police de la largeur?

Je veux dessiner du texte sur une canvas d'une certaine largeur en utilisant .drawtext

Par exemple, la largeur du texte doit toujours être 400px quel que soit le texte d'entrée.

  • ViewPager PagerAdapter avec le curseur - CursorLoader.onLoadFinished ne s'appelle pas avec une requête différente
  • Comment effectuer explicitement la collecte des ordures
  • Autodétection de la langue d'un texte en Java (Android)
  • Emulateur x86 Android extrêmement lent
  • Lecture rapide de fichiers .wav - Android
  • Com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Impossible d'installer tous
  • Si le texte d'entrée est plus long, il diminuera la taille de la police, si le texte d'entrée est plus court, il augmentera la taille de la police en conséquence.

    3 Solutions collect form web for “Tirage de la toile Android tirezTextrez-vous la taille de la police de la largeur?”

    Voici une méthode beaucoup plus efficace:

     /** * Sets the text size for a Paint object so a given string of text will be a * given width. * * @param paint * the Paint to set the text size for * @param desiredWidth * the desired width * @param text * the text that should be that width */ private static void setTextSizeForWidth(Paint paint, float desiredWidth, String text) { // Pick a reasonably large value for the test. Larger values produce // more accurate results, but may cause problems with hardware // acceleration. But there are workarounds for that, too; refer to // http://stackoverflow.com/questions/6253528/font-size-too-large-to-fit-in-cache final float testTextSize = 48f; // Get the bounds of the text, using our testTextSize. paint.setTextSize(testTextSize); Rect bounds = new Rect(); paint.getTextBounds(text, 0, text.length(), bounds); // Calculate the desired size as a proportion of our testTextSize. float desiredTextSize = testTextSize * desiredWidth / bounds.width(); // Set the paint for that size. paint.setTextSize(desiredTextSize); } 

    Ensuite, tout ce que vous devez faire est de setTextSizeForWidth(paint, 400, str); (400 étant l'exemple de largeur dans la question).

    Pour une efficacité encore plus grande, vous pouvez faire du Rect un membre de classe statique, ce qui l'empêche d'être instancié à chaque fois. Toutefois, cela peut entraîner des problèmes de concurrence et entraverait probablement la clarté du code.

    Essaye ça:

     /** * Retrieve the maximum text size to fit in a given width. * @param str (String): Text to check for size. * @param maxWidth (float): Maximum allowed width. * @return (int): The desired text size. */ private int determineMaxTextSize(String str, float maxWidth) { int size = 0; Paint paint = new Paint(); do { paint.setTextSize(++ size); } while(paint.measureText(str) < maxWidth); return size; } //End getMaxTextSize() 

    La solution de Michael Scheper semble sympa, mais cela ne m'a pas fonctionné, j'ai dû obtenir la taille de texte la plus grande possible, mais cette approche dépend de la première taille de texte que vous avez définie. Chaque fois que vous définissez une taille différente, vous J'aurai des résultats différents qui ne peuvent pas dire que c'est la bonne réponse dans chaque situation.

    J'ai donc essayé d'une autre manière:

     private float calculateMaxTextSize(String text, Paint paint, int maxWidth, int maxHeight) { if (text == null || paint == null) return 0; Rect bound = new Rect(); float size = 1.0f; float step= 1.0f; while (true) { paint.getTextBounds(text, 0, text.length(), bound); if (bound.width() < maxWidth && bound.height() < maxHeight) { size += step; paint.setTextSize(size); } else { return size - step; } } } 

    C'est simple, maxWidth la taille du texte jusqu'à ce que les dimensions du texte rectées soient suffisamment proches pour maxWidth et maxHeight , pour diminuer les répétitions de la boucle, changez simplement l' step à une valeur plus grande ( précision vs vitesse ), Peut-être n'est-ce pas la meilleure façon d'y parvenir Ça marche.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.