Tipo de letra de Android o ttf de tipo de letra otf que renderiza símbolos / letras aleatorios

Tengo una View personalizada en la que estoy dibujando algún texto. Estoy usando varios archivos libres de la fuente de otf / ttf que están disponibles en la carpeta de los activos

 public class ProjectView extends View { private final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private void init(Context context) { textPaint.setStyle(Paint.Style.FILL); textPaint.setAntiAlias(true); typeface = Typeface.createFromAsset(context.getAssets(), "fonts" + File.separator + fontFileName); textPaint.setTypeface(typeface); } } 

Todo parece estar funcionando bien, excepto una cosa: las palabras que estoy dibujando se desordenan al azar, lo que significa que las letras se sustituyen al azar por otras letras o símbolos.

Aquí hay un ejemplo:

Introduzca aquí la descripción de la imagen

La palabra correcta está en la imagen izquierda pero a veces se dibuja como en la imagen derecha. Llamando invalidate() nuevo todo se vuelve a renderizar correctamente corrige el problema.

Este efecto es más obvio en un ListView , que ocurre más a menudo allí debido a los notifyDatasetChanged() frecuentes como llamo notifyDatasetChanged() en cada clic de artículo. En el adaptador lo uso así:

 @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; ViewHolder holder; if (convertView == null) { view = inflater.inflate(R.layout.list_item_fonts, null); holder = new ViewHolder(); holder.txtFont = (TextView) view.findViewById(R.id.txtFont); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } //tried this two but no success holder.txtFont.setPaintFlags(holder.txtFont.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.DEV_KERN_TEXT_FLAG); holder.txtFont.getPaint().setSubpixelText(true); holder.txtFont.setTextSize(TypedValue.COMPLEX_UNIT_SP, fonts.get(position).getSize()); holder.txtFont.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts" + File.separator + font.getFileName())); } 

Para ser honesto, no tengo ni idea de las causas de esto o cómo podría evitarlo. Cualquier ayuda es apreciada!

Está creando el tipo de letra cada vez que getView se llama. Esto es ineficiente, y podría causar carreras al cargar y analizar los archivos de tipografía.

En cambio, tenga en la actividad un mapa de todos los tipos de letra cargados y cargue cada uno solo una vez.

Incluso trataré de administrar los tipos de letra en la clase Application, si muchas actividades y vistas utilizan los mismos tipos de letra.

Puede que esto pueda ayudar a alguien. Tengo el mismo problema. Lo solucioné usando lru caché.

 import android.content.Context; import android.graphics.Paint; import android.graphics.Typeface; import android.text.TextPaint; import android.text.style.MetricAffectingSpan; import android.util.LruCache; public class TypefaceSpan extends MetricAffectingSpan { private static LruCache<String, Typeface> sTypefaceCache = new LruCache<>(12); private Typeface mTypeface; public TypefaceSpan(Context context, String typefaceName) { mTypeface = sTypefaceCache.get(typefaceName); if (mTypeface == null) { mTypeface = Typeface.createFromAsset(context.getApplicationContext().getAssets(), String.format("fonts/%s", typefaceName)); sTypefaceCache.put(typefaceName, mTypeface); } } @Override public void updateMeasureState(TextPaint p) { p.setTypeface(mTypeface); p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG); } @Override public void updateDrawState(TextPaint tp) { tp.setTypeface(mTypeface); tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG); } } 

ejemplo:

 private TypefaceSpan typefaceSpan; 

constructor:

 typefaceSpan = new TypefaceSpan(context, "name_of_font.otf"); 

GetView:

 typefaceSpan.updateDrawState(holder.title.getPaint()); 
  • Cómo crear fuentes personalizadas en android studio
  • Cómo dibujar con una fuente predeterminada de Android en una lona?
  • Android: ¿Cómo encajar grandes fuentes en un pequeño botón?
  • Cómo volver a fuente predeterminada en TextView
  • Ignorar el tamaño de fuente mínimo de la aplicación de Gmail de Android (Newsletter)
  • En Photoshop el tamaño de fuente de archivo es 20px ¿qué sp será para esto en android? ¿Es igual? Significa 20px = 20sp o algo más?
  • ¿Cómo puedo estandarizar Helvetica Neue line cross-browser (no sobre texto en negrita)?
  • Cómo configurar una fuente en particular para un texto de botón en android?
  • ¿Puedo cambiar la fuente de salida de un teclado personalizado de Android?
  • Multi texto de fuente en android
  • Valores válidos para android: fontFamily y para qué se correlacionan?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.