Cómo crear alineado verticalmente superíndice y subíndice en TextView
En el ejemplo de la imagen a continuación:
- Tamaño de texto con diferentes resoluciones
- Establecer TextView texto de html-formatted cadena recurso en XML
- TextView sombra destruida mientras captura la imagen
- ¿Hay una manera de crear el stackoverfow "Etiquetas" EditText / Campo de entrada en Android?
- ¿Cómo restaurar la posición de desplazamiento de texto tras la rotación de la pantalla?
¿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
En TextView
? Si hay una forma de utilizar Spannable
o ReplacementSpan
me gustaría ver un ejemplo de trabajo. Gracias.
- Android recibe archivos compartidos pero no comparte contenido de texto
- Android EditText texto y diseño de sugerencias
- Alineación de 2 columnas en una vista de texto
- Cómo escribir texto de derecha a izquierda (Texto árabe) en Android?
- Android ¿Cómo enviar texto e imágenes o cualquier objeto con intención?
- Guardar TextView con onSaveInstanceState
- Cómo ajustar el kerning de texto en Android TextView?
- Zoom textview con imagen y texto (contenido html) en android
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:
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"
- Ionic obtener el número de teléfono del usuario
- No se puede aplicar el brillo de la pantalla del sistema mediante programación en Android