Nuestros mejores desarrolladores han agotado sus reservas de café, buscando noche y día por la solución, hasta que Lila halló la respuesta en Beanstalk así que hoy la comparte con nosotros.
Solución:
Construí una clase personalizada que extiende TextView y agrega un método “setSpacing”. La solución es similar a lo que dijo @Noah. El método agrega un espacio entre cada letra de la Cadena y con SpannedString cambia la TextScaleX de los espacios, permitiendo espacios positivos y negativos.
Espero que ayude a alguien ^^
/**
* Text view that allows changing the letter spacing of the text.
*
* @author Pedro Barros (pedrobarros.dev at gmail.com)
* @since May 7, 2013
*/
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ScaleXSpan;
import android.util.AttributeSet;
import android.widget.TextView;
public class LetterSpacingTextView extends TextView
private float spacing = Spacing.NORMAL;
private CharSequence originalText = "";
public LetterSpacingTextView(Context context)
super(context);
public LetterSpacingTextView(Context context, AttributeSet attrs)
super(context, attrs);
public LetterSpacingTextView(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
public float getSpacing()
return this.spacing;
public void setSpacing(float spacing)
this.spacing = spacing;
applySpacing();
@Override
public void setText(CharSequence text, BufferType type)
originalText = text;
applySpacing();
@Override
public CharSequence getText()
return originalText;
private void applySpacing()
public class Spacing
public final static float NORMAL = 0;
Usándolo:
LetterSpacingTextView textView = new LetterSpacingTextView(context);
textView.setSpacing(10); //Or any float. To reset to normal, use 0 or LetterSpacingTextView.Spacing.NORMAL
textView.setText("My text");
//Add the textView in a layout, for instance:
((LinearLayout) findViewById(R.id.myLinearLayout)).addView(textView);
Si alguien está buscando una forma sencilla de aplicar el interletraje a cualquier string (técnicamente, CharSequence
) sin usar un TextView
:
public static Spannable applyKerning(CharSequence src, float kerning)
if (src == null) return null;
final int srcLength = src.length();
if (srcLength < 2) return src instanceof Spannable
? (Spannable)src
: new SpannableString(src);
final String nonBreakingSpace = "u00A0";
final SpannableStringBuilder builder = src instanceof SpannableStringBuilder
? (SpannableStringBuilder)src
: new SpannableStringBuilder(src);
for (int i = src.length() - 1; i >= 1; i--)
builder.insert(i, nonBreakingSpace);
builder.setSpan(new ScaleXSpan(kerning), i, i + 1,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return builder;
AFAIK, no puedes ajustar el interletraje en TextView
. Es posible que pueda ajustar el interletraje si dibuja el texto en el Canvas
usted mismo utilizando las API de gráficos 2D.
Tienes la opción de defender nuestra faena fijando un comentario y dejando una valoración te damos las gracias.