Cómo hacer un script Mongolian tradicional TextView en Android
¿Cómo hacer vertical (con la línea de izquierda a derecha que envuelve) Script de Mongolia TextViews para aplicaciones de Android?
Fondo
Android tiene un apoyo bastante bueno para muchos de los idiomas del mundo, incluso los idiomas RTL como árabe y hebreo. Sin embargo, no hay ningún apoyo construido para los idiomas de arriba a abajo como el tradicional mongol (que todavía está muy vivo en Mongolia Interior y no debe confundirse con el mongol cirílico ). El siguiente gráfico muestra la dirección del texto con el inglés añadido para mayor claridad.
- ¿Cuál es la diferencia entre el estilo de TextView y los atributos android: textAppearance?
- El texto largo pasa a la siguiente línea en ICS, pero no en GB y debajo
- Cómo centrar un texto de dos líneas en un TextView en Android?
- Cómo agregar el radio de la esquina y el relleno al texto spannable de la multi-línea
- Cómo reducir el espaciado de línea de TextView
Dado que esta funcionalidad no está integrada en Android, hace que casi todos los aspectos del desarrollo de aplicaciones sean extremadamente difíciles. También hay muy, muy poca información disponible en línea. Hay una serie de desarrolladores de aplicaciones para el mongol tradicional, pero si es por razones comerciales o no, no parecen hacer que su código de código abierto.
Debido a estas dificultades me gustaría hacer una serie de preguntas StackOverflow que pueden servir como un lugar central para recoger las respuestas a algunos de los problemas de programación más difíciles relacionados con el desarrollo de la aplicación mongol tradicional. Incluso si usted no es alfabetizado en mongol, su ayuda para revisar el código, hacer comentarios y preguntas, dar respuestas o incluso hasta votar la pregunta sería apreciada.
Mongolia Vertical TextView
Un texto de Mongolia necesita tener los siguientes requisitos:
- Soporta una fuente tradicional mongol
- Muestra el texto verticalmente de arriba a abajo
- El envolvimiento de la línea va de izquierda a derecha.
- Los saltos de línea se producen en un espacio (igual que en inglés)
(Tener el apoyo TextView de la fuente mongol no es un requisito absoluto, ya que el TypeFace se puede establecer más tarde, pero es una conveniencia cuando se utilizan muchas TextViews.)
Mi respuesta es la siguiente, pero me doy la bienvenida a otras maneras de resolver este problema.
Otras preguntas relacionadas en esta serie:
- Cómo hacer un script mongol tradicional EditText en Android
- Cómo hacer un script tradicional de Mongolia ListView en Android
- Más por venir … (Tostada, Diálogo, Menú)
IOS:
- ¿Cómo se hace un texto vertical UILabel y UITextView para iOS en Swift?
- Fuente urdu en la vista de texto
- Restablecer la posición de TextView (desplazable) en la nueva carga de texto
- Alineación de ImageSpan en la parte superior del TextView
- Android sola línea TextView sin los puntos
- Establecer el color de texto de Android TextView de forma programática con setTextColor () procesa android: duplicateParentState inválido
- ¿Cómo puedo hacer que un TextView se desplace automáticamente al agregar más líneas de texto?
- Android Enlaza tanto web como @mentions todas en el mismo TextView
- Android: la aplicación se bloquea al iniciar una nueva actividad
Las fuentes mongolas están hechas con la orientación de los glifos en la misma dirección que el inglés, es decir, de izquierda a derecha. Esto permite que las palabras de Mongolia sean añadidas al texto en inglés, chino o cirílico (el único problema es que las palabras son "sentar" en lugar de "levantarse" como deberían).
Girar el TextView 90 grados en el sentido de las agujas del reloj lo hará vertical, pero la línea de envoltura va en la dirección equivocada (de derecha a izquierda en lugar de izquierda a derecha después de la rotación). El problema de la dirección de la línea de envoltura puede resolverse moviendo horizontalmente o reflejando el TextView, pero luego todos los glifos se reflejan. Este problema final se puede resolver empezando con una fuente verticalmente reflejada (algo que es posible hacer editando una fuente existente con software de código abierto como FontForge ). El siguiente gráfico ilustra el proceso:
La rotación y volteo puede hacerse extendiendo TextView y reemplazando los onDraw()
y onMeasure()
:
public class MongolTextView extends TextView { private TextPaint textPaint; // Constructors public MongolTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public MongolTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MongolTextView(Context context) { super(context); init(); } // This class requires the mirrored Mongolian font to be in the assets/fonts folder private void init() { Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/MongolFontMirrored.ttf"); setTypeface(tf); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // swap the height and width super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); } @Override protected void onDraw(Canvas canvas) { textPaint = getPaint(); textPaint.setColor(getCurrentTextColor()); textPaint.drawableState = getDrawableState(); canvas.save(); // flip and rotate the canvas canvas.translate(getWidth(), 0); canvas.rotate(90); canvas.translate(0, getWidth()); canvas.scale(1, -1); canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop()); getLayout().draw(canvas); canvas.restore(); } }
En su diseño xml, use el nombre completo de su TextView ampliado:
<com.example.MongolTextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="@string/title_string" />
Problemas conocidos:
-
layout_margin
ylayout_gravity
funcionan bien si mantiene la rotación en mente, pero elpadding
y lagravity
actúan extrañamente. Así que parece que funciona mejor para usarwrap_content
y evitar el uso depadding
ygravity
. El mismo efecto se puede lograr poniendo MongolTextView en un FrameLayout y usandolayout_margin
ylayout_gravity
. - Esta solución no se ocupa de procesar el texto Unicode. Ya sea que necesite utilizar texto no Unicode (desalentado) o necesita incluir un motor de renderizado en su aplicación. (Android no es compatible con la representación de SmartFont de OpenType en este momento.) Esperamos que esto cambie en el futuro. IOS, por comparación soporta fuentes complejas de renderizado de texto.) Vea este enlace para un ejemplo de Unicode Mongolian rendering engine.
- Gráfico de barras completo en pantalla en AchartEngine
- ¿Cómo puedo obtener la lista de contactos de un teléfono en una aplicación móvil Firemonkey?