studio programacion para herramientas fundamentos desarrollo con avanzado aplicaciones android formatting textview highlight spannablestring

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.