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.

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:

Ejemplo de Small Caps

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 = ""

  • Texto en negrita o en cursiva en Toast sin creación Ver?
  • Android EditText, problema del textWatcher del teclado
  • android xml El atributo de texto Textview no puede tomar '<' como valor
  • android: establece textColor con el atributo textAppearance
  • Android TextView defStyle parámetro ignorado?
  • Render el texto en la aplicación puramente nativa de Android
  • ¿Cómo usar el sombreado de píxeles para lograr un texto suave?
  • Mostrar texto en el polígono android Google map v2
  • Obtener texto de la página web a la cadena
  • Obtener palabra de EditText en la posición actual del cursor
  • Android - El botón de radio no muestra su texto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.