Cómo crear alineado verticalmente superíndice y subíndice en TextView

En el ejemplo de la imagen a continuación:

Introduzca aquí la descripción de la imagen

¿Cómo puedo hacer que tanto los números de superíndice como de subíndice sean alineados para producir una notación científica común como la siguiente

Introduzca aquí la descripción de la imagen

En TextView ? Si hay una forma de utilizar Spannable o ReplacementSpan me gustaría ver un ejemplo de trabajo. Gracias.

Es posible que desee probar algo como esto.

Es basicall un ReplacementSpan que toma el texto que se aplica, lo separa en dos partes, y los dibuja en el lienzo. El factor de tamaño y la traducción y son algo elegidos a mano. Espero que sea útil (o al menos que usted o alguien más puede construir en él).

 public class SuperSubSpan extends ReplacementSpan { @Override public int getSize(Paint paint, CharSequence text, int start, int end, FontMetricsInt fm) { text = text.subSequence(start, end); String[] parts = text.toString().split(","); Paint p = getSuperSubPaint(paint); return (int) Math.max(p.measureText(parts[0]), p.measureText(parts[1])); } private static TextPaint getSuperSubPaint(Paint src) { TextPaint paint = new TextPaint(src); paint.setTextSize(src.getTextSize() / 2.5f); return paint; } @Override public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { text = text.subSequence(start, end); String[] parts = text.toString().split(","); Paint p = getSuperSubPaint(paint); float width1 = p.measureText(parts[0]); float width2 = p.measureText(parts[1]); float maxWidth = Math.max(width1, width2); canvas.drawText(parts[0], x + (maxWidth - width1), y - (bottom - top) / 3f, p); canvas.drawText(parts[1], x + (maxWidth - width2), y + (bottom - top) / 10f, p); } } 

Luego úsalo como:

 Spannable str = new SpannableString("9,4Be -> 2000,127Jo"); str.setSpan(new SuperSubSpan(), 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new SuperSubSpan(), 9, 17, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); mTextView.setText(str); 

Que produce el siguiente resultado:

Muestra

Una solución un poco mejor sería tener un formato especial para estas cadenas (por ejemplo, "{9,4}Be -> {2000,127}Jo" ) y tener una expresión regular de la cadena y añadir el correspondiente SuperSubSpans , sólo para que No es necesario hacerlo manualmente. Pero la parte real de Span sería más o menos la misma.

Si sólo desea subíndice y superíndice, utilice SubscriptSpannable y SuperscriptSpannable. Si no te gusta cómo los dibujar por alguna razón, siempre se puede hacer una costumbre spannable y dibujar usted mismo.

Utilizar este código para la solución ….

TextView txt = (TextView)findViewById(R.id.txt_label); txt.setText(Html.fromHtml("<sup>9</sup><sub>4</sub>Be"));

Usted puede seguirme paso a paso. Obtienes ayuda de esto. como

MainActivity.java

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView txtView = (TextView) findViewById(R.id.textView1); TextView water = (TextView) findViewById(R.id.textView2); txtView.setText(Html.fromHtml("a" + "<sup>" + "2" + "</sup>" + " + " + "b" + "<sup>" + "2" + "</sup>" + "=" + "(" + "ab" + ")" + "<sup>" + "2" + "</sup>" + " + " + "2ab")); water.setText(Html.fromHtml("H" + "<sub>" + "2" + "</sub>" + "O")); } } 

Aquí supersón de la mansión sup y subsíndice de la sub mansión.

Y activity_main.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context="com.example.textview.MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="TextView" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="TextView" /> </LinearLayout> 

¡La mejor de las suertes!

No intentaré doblar el widget de TextView para hacer eso. En su lugar, usted podría fácilmente hacer su propio widget que tiene dos pinturas diferentes: una para el nombre del elemento (tamaño de fuente grande) y uno para los números (tamaño pequeño, cursiva).

Usted haría setters apropiados y almacenaría cada característica separada en vez de almacenar un spannable grande o una secuencia.

Usted también sería capaz de alinear fácilmente horizontal y verticalmente (números en la parte superior e inferior del nombre del elemento)

Para calcular el ancho, puede tener una propiedad para ajustar el relleno entre los números y el nombre del elemento. A continuación, puede utilizar cada pintura para calcular el ancho del texto y agregar todo esto (no olvide añadir los valores de relleno del widget).

También puede referir mi respuesta en este enlace Simplemente utilice SpannableString que solucionará su problema.

  SpannableString styledString = new SpannableString("9-10th STD"); styledString.setSpan(new SuperscriptSpan(), 4, 6, 0); textView.setText(styledString); 

Y poner su android:textAllCaps="false"

  • Acceso a TextView desde otra clase
  • Cómo establecer la sombra alrededor de TextView
  • Desplazamiento horizontal automático en TextView
  • Diferentes tamaños en 2 dispositivos, incluso si utilizo "dp"
  • GetDimension () / getDimensionPixelSize () - problema mutliplier
  • Animación de texto de pantalla de personaje de Android por caracteres
  • En Android cómo obtener el ancho de la vista de texto que se establece en Wrap_Content
  • El texto de Android se recorta en algunos dispositivos
  • Separe el texto largo en las páginas de viewpager
  • Cómo agregar una ruptura de línea en un Android TextView?
  • ¿Cómo alinear el texto tanto a la izquierda como a la derecha de una línea TextView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.