android - tamaño - Aplicar dos estilos de fuente diferentes a un TextView
programacion android pdf 2018 (6)
¿Intentó configurar un tipo de letra personalizado en TextView antes de aplicar texto extensible?
Typeface face = Typeface.createFromAsset(ctx.getAssets(), "fonts/boost.ttf")
TextView tv = (TextView) ctx.findViewById(id);
tv.setTypeface(face);
y luego aplique SpannableStringBuilder a partir de la pregunta vinculada. Solo asumo que si su ttf admite "normal" y "negrita", se representará en consecuencia :)
Quiero aplicar dos estilos de fuente diferentes a un texto en un solo TextView.
Mi caso es el mismo que el de Android: dos oraciones, dos estilos, un TextView . La única diferencia es que quiero establecer una fuente personalizada en todo el texto. He incluido Helvetica Font como activo en mi proyecto y quiero aplicar esa fuente a TextView, ya que la primera parte del texto será Helvetica BOLD y la parte restante Helvetica NORMAL. ¿Alguna sugerencia de cómo se puede hacer?
Texto necesario en el siguiente formato. Texto personalizado con diferentes estilos y vista de texto individual.
Aquí hay una solución más sencilla, puede usar HTML para establecer diferentes estilos en el mismo TextView
.
Por ejemplo:
// Styled label
String styledText = "<big><b><font color=''#333333''>title</font></b></big> <small><b><font color=''#CC5490''>subtitle</font></b></small>";
// Apply the styled label on the TextView
textView.setText(Html.fromHtml(styledText));
Necesitas la siguiente importación:
import android.text.Html;
Esto puede funcionar: cree su propio TextView personalizado y luego use un StyleSpan en una parte del mismo:
public class CustomTextView extends TextView {
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setTypeface(Typeface tf, int style) {
if (style == 1){
//replace "HelveticaBOLD.otf" with the name of your bold font
tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaBOLD.otf");
}else{
//replace "HelveticaNORMAL.otf" with the name of your normal font
tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaNORMAL.otf");
}
super.setTypeface(tf, 0);
}
}
Y luego puedes hacer algo como:
int index1 = 0; //wherever bold should begin
int index2 = 5; //wherever bold should end
Spannable span = new SpannableString("some string");
span.setSpan(new StyleSpan(Typeface.BOLD),index1, index2,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
((CustomTextView)findViewById(R.id.yourTextView)).setText(span);
Puede crear una vista personalizada y representar su texto con dos objetos de Paint utilizando el método canvas.drawText
Una forma de hacer esto es extender TypefaceSpan :
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.text.style.TypefaceSpan;
public class CustomTypefaceSpan extends TypefaceSpan {
private final Typeface newType;
public CustomTypefaceSpan(String family, Typeface type) {
super(family);
newType = type;
}
@Override
public void updateDrawState(TextPaint ds) {
applyCustomTypeFace(ds, newType);
}
@Override
public void updateMeasureState(TextPaint paint) {
applyCustomTypeFace(paint, newType);
}
private static void applyCustomTypeFace(Paint paint, Typeface tf) {
int oldStyle;
Typeface old = paint.getTypeface();
if (old == null) {
oldStyle = 0;
} else {
oldStyle = old.getStyle();
}
int fake = oldStyle & ~tf.getStyle();
if ((fake & Typeface.BOLD) != 0) {
paint.setFakeBoldText(true);
}
if ((fake & Typeface.ITALIC) != 0) {
paint.setTextSkewX(-0.25f);
}
paint.setTypeface(tf);
}
}
Entonces cuando quieras usar dos tipos de letra diferentes llama:
String firstWord = "first ";
String secondWord = "second";
// Create a new spannable with the two strings
Spannable spannable = new SpannableString(firstWord+secondWord);
// Set the custom typeface to span over a section of the spannable object
spannable.setSpan( new CustomTypefaceSpan("sans-serif",CUSTOM_TYPEFACE), 0, firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan( new CustomTypefaceSpan("sans-serif",SECOND_CUSTOM_TYPEFACE), firstWord.length(), firstWord.length() + secondWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// Set the text of a textView with the spannable object
textView.setText( spannable );
Yo uso este enfoque
class FooClass {
void Foo() {
textViewSetText(R.id.photo_title, "Title: ", photo.getTitle());
textViewSetText(R.id.photo_tags, "Tags: ", photo.getTags());
textViewSetText(R.id.photo_author, "Author: ", photo.getAuthor());
}
private void textViewSetText(int resourceId, String prefix, String text) {
TextView textView = (TextView) findViewById(resourceId);
SpannableString styledText = new SpannableString(prefix);
styledText.setSpan(new StyleSpan(Typeface.BOLD), 0, prefix.length(), 0);
textView.setText(null);
textView.append(styledText);
textView.append(text);
}
}
Como puede ver, " Autor ", " Título " y " Etiquetas " están en BOLD
Captura de pantalla http://image.prntscr.com/image/dd60bb4a335445c2adca8a4596d7fb32.png