programacion - manual android studio avanzado
Cómo limitar la altura de la línea de spannablestring pero mantener el resto de la línea (1)
Tengo un TextView
que tiene un SpannableString
dentro para resaltar los términos buscados. Al igual que :
<TextView android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/textBox"
android:textSize="16sp"
android:paddingTop="10dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:lineSpacingExtra="5dp"
android:textColor="@color/TextGray"/>
Como se puede ver, estoy usando android:lineSpacingExtra
para dar a las líneas un espacio agradable, sin embargo, está causando que el fondo de SpannableString
sea demasiado alto. Me gustaría mantener el espacio entre las líneas pero hacer que SpannableString
más corto.
¿Cómo es esto posible?
Puede crear su propio intervalo extendiendo ReplacementSpan . En el método draw
, puedes tener en cuenta el fontSpacing
que puedes obtener del parámetro Paint
.
Me gusta esto:
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.FontMetricsInt;
import android.graphics.RectF;
import android.text.style.ReplacementSpan;
public class BetterHighlightSpan extends ReplacementSpan {
private int backgroundColor;
public BetterHighlightSpan(int backgroundColor) {
super();
this.backgroundColor = backgroundColor;
}
@Override
public int getSize(Paint paint, CharSequence text, int start, int end, FontMetricsInt fm) {
return Math.round(paint.measureText(text, start, end));
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom,
Paint paint) {
// save current color
int oldColor = paint.getColor();
// calculate new bottom position considering the fontSpacing
float fontSpacing = paint.getFontSpacing();
float newBottom = bottom - fontSpacing;
// change color and draw background highlight
RectF rect = new RectF(x, top, x + paint.measureText(text, start, end), newBottom);
paint.setColor(backgroundColor);
canvas.drawRect(rect, paint);
// revert color and draw text
paint.setColor(oldColor);
canvas.drawText(text, start, end, x, y, paint);
}
}
Puedes usarlo así:
TextView textView = (TextView) findViewById(R.id.textView);
SpannableStringBuilder builder = new SpannableStringBuilder("here some text and more of it");
builder.setSpan(new BetterHighlightSpan(Color.CYAN), 4, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(builder);
No pude probarlo mucho pero puedes mejorarlo.