Small Caps en TextViews, EditTexts y botones en Android
¿Hay algo que pueda hacer para que el texto aparezca en mayúsculas / capitales? Como se describe aquí: http://en.wikipedia.org/wiki/Small_caps . He utilizado un convertidor, pero faltan algunos caracteres.
- Animación simple de Android TextView
- Cómo obtener NoSuchMethodError con métodos TextView
- Cómo cambiar el tamaño de fuente de mensaje ProgressDialog en android mediante programación?
- Cómo cambiar el color de texto de un Android ToogleButton en el cambio de estado?
- Cómo leer un archivo de texto seleccionado de sdcard en android
- ¿Permitir multi-línea en la vista EditarTexto en Android?
- ¿Cómo se cambia el texto a negrita en Android?
- Archivo de sonido grabado (ala google ahora, google keep) - RecognizerIntent / Listener
- Representación inconsistente de SVG entre escritorio y móvil - ¿es Arial una fuente segura en SVG?
- Android: cómo determinar la última letra totalmente visible en TextView?
- Puedo definir el texto de alineación intermedia en un archivo xml de diseño de Android
- Cómo cambiar el sistema de alarma de configuración de texto dinámico
- Establecer el color de la extensión de TextView en Android
EDIT 2015-08-02 : A partir de la API 21 (Lollipop) simplemente puede agregar:
android:fontFeatureSettings="smcp"
A su declaración TextView
en XML o en tiempo de ejecución, invoque:
textView.setFontFeatureSettings("smcp");
Por supuesto, esto sólo funciona para la API 21 y hasta, por lo que todavía tiene que manejar la antigua solución manualmente hasta que sólo están apoyando Lollipop y superiores.
Ser un poco de un friki de la tipografía en el corazón, esto parecía una pregunta realmente buena. Tengo que aprender algo más sobre Unicode hoy, así como una respuesta para su pregunta. 🙂
Primero, necesitará tener una fuente que incluya caracteres "pequeños" reales. Estoy asumiendo que usted sabe que ya que usted está pidiendo, pero por lo general la mayoría de las fuentes profesionales incluyen estos. Desafortunadamente, la mayoría de las fuentes profesionales no tienen licencia para la distribución, por lo que es posible que no pueda utilizarlas en su aplicación. De todos modos, en el caso de que usted encuentra uno (He utilizado Chaparral Pro como un ejemplo aquí), esto es cómo puede obtener pequeñas tapas.
De esta respuesta encontré que los caracteres de mayúsculas (para AZ) se localizan a partir de Unicode-UF761. Así que construí un mapeo de estos personajes:
private static char[] smallCaps = new char[] { '\uf761', //A '\uf762', '\uf763', '\uf764', '\uf765', '\uf766', '\uf767', '\uf768', '\uf769', '\uf76A', '\uf76B', '\uf76C', '\uf76D', '\uf76E', '\uf76F', '\uf770', '\uf771', '\uf772', '\uf773', '\uf774', '\uf775', '\uf776', '\uf777', '\uf778', '\uf779', '\uf77A' //Z };
A continuación, agregó un método auxiliar para convertir una cadena de entrada a una cuyas letras minúsculas han sido reemplazadas por sus equivalentes Small Caps:
private static String getSmallCapsString (String input) { char[] chars = input.toCharArray(); for(int i = 0; i < chars.length; i++) { if(chars[i] >= 'a' && chars[i] <= 'z') { chars[i] = smallCaps[chars[i] - 'a']; } } return String.valueOf(chars); }
A continuación, sólo tiene que utilizar en cualquier lugar:
String regularCase = "The quick brown fox jumps over the lazy dog."; textView.setText(getSmallCapsString(regularCase));
Por lo que obtuve el siguiente resultado:
Disculpas por arrastrar una pregunta muy antigua.
Me gustó @ kcoppock enfoque de esto, pero lamentablemente la fuente que estoy usando falta los caracteres de pequeña capitalización. Sospecho que muchos otros se encontrarán en esta situación.
Eso me inspiró a escribir un pequeño método util que tomará una cadena de caracteres mixtos (por ejemplo, Small Caps
) y crear una cadena spannable con formato que se parece a Sᴍᴀʟʟ Cᴀᴘs
pero sólo utiliza los caracteres AZ estándar.
- Funciona con cualquier fuente que tenga los caracteres
AZ
– nada especial requerido - Es fácilmente utilizable en un TextView (o cualquier otra vista basada en texto, para el caso)
- No requiere HTML
- No requiere ninguna edición de sus cadenas originales
He planteado el código aquí: https://gist.github.com/markormesher/3e912622d339af01d24e
Encontró una alternativa aquí ¿Es posible tener varios estilos dentro de un TextView?
Básicamente, puede utilizar etiquetas html de formato el tamaño de los caracteres y dar un efecto de pequeñas tapas ….
Simplemente llame a esta función getSmallCaps (text):
public SpannableStringBuilder getSmallCaps(String text) { text = text.toUpperCase(); text = text.trim(); SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); if (text.contains(" ")) { String[] arr = text.split(" "); for (int i = 0; i < arr.length; i++) { spannableStringBuilder.append(getSpannableStringSmallCaps(arr[i])); spannableStringBuilder.append(" "); } } else { spannableStringBuilder=getSpannableStringSmallCaps(text); } return spannableStringBuilder; } public SpannableStringBuilder getSpannableStringSmallCaps(String text) { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder( text); spannableStringBuilder.setSpan(new AbsoluteSizeSpan(36), 0, 1, 0); spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), 0, 1, 0); spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), 1, text.length(), 0); return spannableStringBuilder; }
Este no es mi código pero funciona perfectamente.
public SpannableString getSmallCapsString(String input) { // values needed to record start/end points of blocks of lowercase letters char[] chars = input.toCharArray(); int currentBlock = 0; int[] blockStarts = new int[chars.length]; int[] blockEnds = new int[chars.length]; boolean blockOpen = false; // record where blocks of lowercase letters start/end for (int i = 0; i < chars.length; ++i) { char c = chars[i]; if (c >= 'a' && c <= 'z') { if (!blockOpen) { blockOpen = true; blockStarts[currentBlock] = i; } // replace with uppercase letters chars[i] = (char) (c - 'a' + '\u0041'); } else { if (blockOpen) { blockOpen = false; blockEnds[currentBlock] = i; ++currentBlock; } } } // add the string end, in case the last character is a lowercase letter blockEnds[currentBlock] = chars.length; // shrink the blocks found above SpannableString output = new SpannableString(String.valueOf(chars)); for (int i = 0; i < Math.min(blockStarts.length, blockEnds.length); ++i) { output.setSpan(new RelativeSizeSpan(0.8f), blockStarts[i], blockEnds[i], Spannable.SPAN_EXCLUSIVE_INCLUSIVE); } return output; }
Ejemplo:
SpannableString setStringObj = getSmallCapsStringTwo("Object"); tvObj.setText(setStringObj);
En XML editar texto tiene propiedad: android: capitalize = ""
- Problema de zoom con ViewPager y ImageView
- Android AlertDialog con vista personalizada: obtener datos de entrada