Editar escala de texto con selección

Tengo un EditText Quiero ampliarlo, y desplazarse con setScaleX / setScaleY y funciona bien – el texto se está editando en la posición correcta.

Pero cuando intento seleccionar el texto – dibuja los tiradores de la selección a las posiciones como cuando el texto no se escala. Es un error conocido.

Se espera resultado porque los identificadores se dibujan en la ventana emergente relacionada con el tamaño de la vista.

Todas las acciones en android.widget.Editor están dirigidas a su campo private TextView mTextView; . Y si vamos a establecer editor propio por reflexión, no sé qué hacer con los métodos privados, que no son invocables.

También las manecillas de selección se dibujan en la ventana emergente android.widget.Editor.HandleView#HandleView coordenadas calculadas en Layout y sólo necesito DynamicLayout pero no tienen ninguna diferencia para nuestros propósitos.

Método android.text.Layout#getPrimaryHorizontal(int, boolean) es público y su valor puede multiplicarse en escala, pero para eso necesitamos extender y anular el método privado android.widget.TextView#makeSingleLayout , pero esto es un problema.

También podríamos implementar nuestro propio Layout con todos los métodos requeridos de overriden, pero todos los métodos que podemos anular están marcados con anotación @hide y no hay campos a los que se pueda acceder con una reflexión.

La siguiente captura de pantalla aparece para escalado en 2x

Introduzca aquí la descripción de la imagen

PS: contexto de la tarea es un editor con pinch-to-zoom editar texto. Relayout de texto con el cálculo de tamaño no es una solución. Porque necesito Documento Portátil en cada tamaño de pantalla.

Puede hacerlo usando MetricAffectingSpan . Aquí hay una clase que lo ejemplifica:

 package android.text.style; import android.os.Parcel; import android.text.ParcelableSpan; import android.text.TextPaint; import android.text.TextUtils; public class AbsoluteSizeSpan extends MetricAffectingSpan implements ParcelableSpan { private final int mSize; private boolean mDip; /** * Set the text size to <code>size physical pixels. */ public AbsoluteSizeSpan(int size) { mSize = size; } /** * Set the text size to <code>size physical pixels, * or to <code>size device-independent pixels if * <code>dip is true. */ public AbsoluteSizeSpan(int size, boolean dip) { mSize = size; mDip = dip; } public AbsoluteSizeSpan(Parcel src) { mSize = src.readInt(); mDip = src.readInt() != 0; } public int getSpanTypeId() { return TextUtils.ABSOLUTE_SIZE_SPAN; } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mSize); dest.writeInt(mDip ? 1 : 0); } public int getSize() { return mSize; } public boolean getDip() { return mDip; } @Override public void updateDrawState(TextPaint ds) { if (mDip) { ds.setTextSize(mSize * ds.density); } else { ds.setTextSize(mSize); } } @Override public void updateMeasureState(TextPaint ds) { if (mDip) { ds.setTextSize(mSize * ds.density); } else { ds.setTextSize(mSize); } } } 

Referencia: Java Source Code Warehouse project

Necesita jugar con MetricAffectingSpan y wrap (CharacterStyle cs) – que permite que CharacterStyle se aplique a una sola región de un determinado Spanned.

En su subclase, anule onTouch y pase sus valores a ScaleGestureDetector . Almacene la escala detectada como una variable miembro.

Anula onDraw y llama a canvas.scale () con tu valor de escala antes de llamar a super.onDraw . Como se puede observar en AbsoluteSizeSpan , utilizando AbsoluteSizeSpan (Parcel src) obtendrá el texto que desea cambiar el tamaño, a continuación, aplicar updateDrawState .

¿Trató de aplicar estilos diferentes a estos elementos? Creo que debería funcionar con algo de condicionamiento.

 <item name="android:textSelectHandle">@drawable/text_select_handle_middle</item> <item name="android:textSelectHandleLeft">@drawable/text_select_handle_left</item> <item name="android:textSelectHandleRight">@drawable/text_select_handle_right</item> 
  • Linux Ubuntu Android SDK manager no está iniciando - android: java: no encontrado
  • ¿Qué es MediaPlayer.OnInfoListener "código 973"?
  • Evitar que la dependencia de Gradle para la biblioteca de soporte sea reemplazada por una versión más reciente
  • Cómo guardar 2 cadenas en una aplicación para Android?
  • Cómo realizar la búsqueda en el texto en árabe en JAVA?
  • IntelliJ IDEA IDE para el desarrollo de Android
  • Diseño de motor de juego para Android: ¿cómo sincronizar el bucle de juego y el hilo de actualización de la galería?
  • Creación de una aplicación de pantalla de bloqueo de Android.
  • ¿Cómo escuchar cualquier teclado en toda la aplicación?
  • ¿Cómo conseguir contar los mismos valores de HashMap?
  • Cómo personalizar CameraView para Android ZBar QrCode Reader
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.