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.

Introduzca aquí la descripción de la imagen

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?

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:

Introduzca aquí la descripción de la imagen

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 y layout_gravity funcionan bien si mantiene la rotación en mente, pero el padding y la gravity actúan extrañamente. Así que parece que funciona mejor para usar wrap_content y evitar el uso de padding y gravity . El mismo efecto se puede lograr poniendo MongolTextView en un FrameLayout y usando layout_margin y layout_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.
  • Android: No se puede utilizar android.R.drawable como imagen de fondo para textview
  • Androide ClickableSpan intercepta el evento de clic
  • Cómo obtener marcas de acento en las letras de un TextView Android
  • Cómo manejar el evento "pegar" en Android 3.0 (Honeycomb)?
  • Dibujar contenido de TextView actual en Bitmap
  • Presentación de texto de Android TextView vs WebView
  • Añadir opaco "sombra" (esquema) a Android TextView
  • TextInputLayout setErrorEnabled no crea nuevo objeto TextView
  • Resaltar Textview con EditText
  • El desplazamiento de texto no funciona
  • Error al seleccionar texto de Textview (java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) comienza antes de 0)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.