107 votes

Android textview outline text

Existe-t-il un moyen simple de faire en sorte que le texte puisse avoir un contour noir ? J'ai des vues de texte qui seront de différentes couleurs, mais certaines des couleurs n'apparaissent pas très bien sur mon fond, donc je me demandais s'il y avait un moyen simple d'obtenir un contour noir ou quelque chose d'autre qui ferait l'affaire ? Je préférerais ne pas avoir à créer une vue personnalisée et à créer un canevas, etc.

9 votes

Pour tous ceux qui lisent cette question et qui envisagent d'utiliser la solution Paint-Stroke, veuillez noter qu'il y a une bogue avec les traits dans Android 4.4 . Si la taille du texte est supérieure à 256 pixels, le rendu des traits est très bizarre. Une solution de contournement consiste à dessiner le contour/le trait avec la méthode alternative suivante présenté dans cette réponse . Je n'ai pas voulu mettre ce message sur toutes les réponses de type Stroke, alors je l'ai mis ici pour sensibiliser les gens et leur épargner la peine que j'ai endurée.

1 votes

57voto

Steve Pomeroy Points 3968

Vous pouvez mettre une ombre derrière le texte, ce qui peut souvent améliorer la lisibilité. Essayez de mettre des ombres noires translucides à 50 % sur votre texte vert. Vous trouverez des détails sur la façon de procéder ici : Android - ombre sur le texte ?

Pour vraiment ajouter un trait autour du texte, vous devez faire quelque chose d'un peu plus compliqué, comme ceci : Comment dessiner du texte avec une bordure sur une MapView dans Android ?

3 votes

Veuillez noter qu'il y a un bogue avec les traits dans Android 4.4 . Si la taille du texte est supérieure à 256 pixels, le rendu des traits est très bizarre. Une solution de contournement consiste à dessiner le contour/le trait avec la méthode alternative suivante présenté dans cette réponse .

0 votes

Ce commentaire fait-il référence à l'affichage du texte ou à la taille de la police ?

0 votes

l'ombre n'est pas suffisante, le texte blanc sur fond blanc a toujours l'air très mauvais avec cette ombre noire

57voto

ABentSpoon Points 2379

Alors, un peu tard, mais MagicTextView permet de faire des contours de texte, entre autres choses.

enter image description here

<com.qwerjk.better_text.MagicTextView
    xmlns:qwerjk="http://schemas.android.com/apk/res/com.qwerjk.better_text"
    android:textSize="78dp"
    android:textColor="#ff333333"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    qwerjk:strokeColor="#FFff0000"
    qwerjk:strokeJoinStyle="miter"
    qwerjk:strokeWidth="5"
    android:text="Magic" />

Note : J'ai fait ceci, et je poste plus pour le bien des futurs voyageurs que pour le PO. C'est à la limite du spam, mais étant sur le sujet, peut-être acceptable ?

1 votes

Bonjour, comment ajouter des bordures comme celles-ci sur le texte saisi dans EditText ?

0 votes

Une idée sur l'EditText ?

0 votes

dreamText.setStroke(4, Color.BLACK) ; dreamText.setTextColor(Color.WHITE) ; J'UTILISE ces paramètres mais la couleur de mon texte est transparente et je peux voir le contour noir. Quel est le problème ?

23voto

Zsolt Safrany Points 1688

Le cadre prend en charge le text-shadow mais pas le text-outline. Mais il y a une astuce : l'ombre est quelque chose qui est translucide et qui s'estompe. Redessinez l'ombre plusieurs fois et tout l'alpha s'additionne et le résultat est un contour.

Une mise en œuvre très simple étend TextView et remplace le draw(..) méthode. Chaque fois qu'un dessin est demandé, notre sous-classe effectue 5 à 10 dessins.

public class OutlineTextView extends TextView {

    // Constructors

    @Override
    public void draw(Canvas canvas) {
        for (int i = 0; i < 5; i++) {
            super.draw(canvas);
        }
    }

}

<OutlineTextView
    android:shadowColor="#000"
    android:shadowRadius="3.0" />

3 votes

Merci beaucoup. Cependant, je préfère utiliser cette méthode : '@Override protected void onDraw(Canvas canvas) { for (int i = 0 ; i < 5 ; i++) { super.onDraw(canvas) ; } }. }'

1 votes

Informations supplémentaires : Il faut implémenter au moins le ctor avec Context et AttributeSet. Sinon, vous vous heurtez à. java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet

15voto

sversch Points 356

J'ai essayé de comprendre comment faire cela et je n'ai pas trouvé de bon guide en ligne, mais j'ai fini par trouver la solution. Comme Steve Pomeroy l'a suggéré, vous devez faire quelque chose de plus compliqué. Pour obtenir l'effet de texte contourné, il faut dessiner le texte deux fois : une première fois avec un contour épais, puis une seconde fois avec le texte principal par-dessus le contour. Mais la tâche est facilitée car vous pouvez très facilement adapter l'un des échantillons de code fournis avec le SDK, à savoir celui qui se trouve sous ce nom dans votre répertoire SDK : "/samples/Android-/ApiDemos/src/com/example/Android/apis/view/LabelView.java". Qui peut également être trouvé sur le site web du développeur Android ici .

Selon ce que vous faites, il est très facile de voir que vous n'aurez besoin que d'apporter des modifications mineures à ce code, comme le changer pour l'étendre à partir de TextView, etc. Avant de découvrir cet exemple, j'avais oublié de surcharger onMeasure() (ce que vous devez faire en plus de surcharger onDraw() comme indiqué dans le guide "Building Custom Components" sur le site Android Developer), ce qui explique en partie pourquoi j'avais des problèmes.

Une fois que tu as fait ça, tu peux faire ce que j'ai fait :

public class TextViewOutline extends TextView {

private Paint mTextPaint;
private Paint mTextPaintOutline; //add another paint attribute for your outline
...
//modify initTextViewOutline to setup the outline style
   private void initTextViewOutline() {
       mTextPaint = new Paint();
       mTextPaint.setAntiAlias(true);
       mTextPaint.setTextSize(16);
       mTextPaint.setColor(0xFF000000);
       mTextPaint.setStyle(Paint.Style.FILL);

       mTextPaintOutline = new Paint();
       mTextPaintOutline.setAntiAlias(true);
       mTextPaintOutline.setTextSize(16);
       mTextPaintOutline.setColor(0xFF000000);
       mTextPaintOutline.setStyle(Paint.Style.STROKE);
       mTextPaintOutline.setStrokeWidth(4);

       setPadding(3, 3, 3, 3);
}
...
//make sure to update other methods you've overridden to handle your new paint object
...
//and finally draw the text, mAscent refers to a member attribute which had
//a value assigned to it in the measureHeight and Width methods
   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
       canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, 
           mTextPaintOutline);
       canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, mTextPaint);
   }

Ainsi, pour obtenir l'effet de texte contourné, vous dessinez le texte deux fois : une fois avec un contour épais et la deuxième fois, nous dessinons le texte principal par-dessus le contour.

8voto

VinZen Points 53

Voici l'astuce que j'ai trouvée et qui fonctionne mieux que le trait de MagicTextView IMO

@Override
protected void onDraw(Canvas pCanvas) {
    int textColor = getTextColors().getDefaultColor();
    setTextColor(mOutlineColor); // your stroke's color
    getPaint().setStrokeWidth(10);
    getPaint().setStyle(Paint.Style.STROKE);
    super.onDraw(pCanvas);
    setTextColor(textColor);
    getPaint().setStrokeWidth(0);
    getPaint().setStyle(Paint.Style.FILL);
    super.onDraw(pCanvas);
}

0 votes

Je vois que le côté droit du TextView est rogné - et le contour n'est pas complètement dessiné de ce côté... comme s'il manquait de place

8 votes

Une dernière chose. Je soupçonne que setTextColor force un redessin - ce qui provoque une boucle sans fin de ce onDraw appelé encore et encore. Il est conseillé de mettre un logcat ou un autre indicateur dans cette méthode lors des tests.

0 votes

@RoundSparrowhilltx a raison. Comme je l'ai mentionné dans un commentaire sur une autre réponse similaire, je pense que le seul moyen de contourner ce problème est de copier et de coller l'intégralité du fichier TextView dans votre propre classe est d'utiliser Reflection pour accéder directement à la privé mCurTextColor dans le champ TextView . Cette réponse fournit une ligne directrice générale sur la manière de procéder. Si vous souhaitez que le texte des indices et des liens ait également un trait, vous devrez également modifier les éléments suivants mHintTextColor et mLinkTextColor . Malheureusement, le changement mTextColor ne fait rien, puisqu'il est seulement référencé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X