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.
- Actualizar la altura de TextView después de establecer la fuente con setTypeface en Android
- ¿Qué personajes están disponibles en Android?
- Idiomas de indicador en el navegador de Android / GUI (Gujarati) interpretación incorrecta
- ¿Qué fuentes están disponibles en Android?
- Android TextView getTextSize () incluye descendientes, ascenders
Aquí hay un ejemplo:
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!
- La fuente del recurso no se carga en android webView
- No se puede usar la clase de ejemplo publicada aquí en mi proyecto
- Cómo evitar el cambio de fuente TextView, cuando cambiamos el estilo de fuente del dispositivo en dispositivos Samsung
- ¿Cómo funciona la fuente de emoji de color de Apple, y hay una versión de Android?
- ¿Cómo Android conjunto de fuentes personalizadas en la lona?
- Cambio de fuente de Roboto regular a Roboto condensado
- Cómo cambiar la fuente en los widgets de Android a las fuentes definidas por el usuario en la carpeta "assets" de la aplicación?
- Uso de fuentes tipo otf en el estudio de Android
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());
- Google Play Store: la página de mi aplicación no muestra los iconos de las tablas de clasificación y los logros.
- Android Beacon Library funciona bien en un dispositivo Android 4.4, pero no en otro