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.
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
Duplicata possible de Ajouter une "ombre" opaque (contour) au TextView Android