Intereting Posts
Скопируйте файлы из папки SD-карты в другую папку на SD-карте Android BLE: onCharacteristicRead (), по-видимому, заблокирован потоком Данные не загружаются в WebView, но загружаются после блокировки – устройство разблокировки Как загрузить файлы (pdf, doc и т. Д.) В SDCard и открыть файл с помощью volley in android? Есть ли что-то быстрее, чем Jsoup для очистки HTML? Lint для android в Eclipse дает неправильные результаты Сломанный … Системный образ для Android в SDK Manager Каков наилучший способ уникальной идентификации пользователей Android на сервере? Изменить размер Drawable в Android Android: ошибка SSLException I / O во время системного вызова, время ожидания подключения Автозаполнение не работает в файлах XML в определенной иерархии Второй AsyncTask не выполняется Android TextView Timer Как сделать плавный переход от одного изображения к другому Есть ли простой способ настроить эмулятор Android для доступа к локальной сети хост-машины?

Шкала EditText с выбором

У меня есть EditText я хочу увеличить его и прокручивать с помощью setScaleX / setScaleY и он отлично работает – текст редактируется в правильной позиции.

Но когда я пытаюсь выбрать текст – он рисует дескрипторы выделения для позиций, например, когда текст не масштабируется. Это известная ошибка .

Это ожидаемый результат, потому что ручки отображаются в всплывающем окне, связанном с размером представления.

Все действия на android.widget.Editor нацелены на его поле private TextView mTextView; , И если мы настроим собственный редактор по рефлексии, я не знаю, что делать с частными методами, которые не являются переопределяемыми.

Также на android.widget.Editor.HandleView#HandleView всплывающих окон android.widget.Editor.HandleView#HandleView рассчитанные в android.widget.Editor.HandleView#HandleView и мне нужен только DynamicLayout но это не имеет никакого значения для наших целей.

Метод android.text.Layout#getPrimaryHorizontal(int, boolean) является общедоступным, и его значение можно умножить по шкале, но для этого нам нужно расширить и переопределить частный метод android.widget.TextView#makeSingleLayout , но это проблема.

Также мы могли бы реализовать наш собственный макет со всеми необходимыми методами переопределения, но все методы, которые мы можем переопределить, отмечены аннотацией @hide и нет полей, к которым можно получить доступ с отражением.

Следующий снимок экрана для масштабирования на 2x

Введите описание изображения здесь

PS: контекст задачи – редактор с текстом редактирования с фиксированным увеличением. Передача текста с вычислением размера не является решением. Потому что мне нужен Portable Document для каждого размера экрана.

Solutions Collecting From Web of "Шкала EditText с выбором"

Вы можете сделать это с помощью MetricAffectingSpan . Вот пример, иллюстрирующий это:

 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); } } } 

Ссылка: Проект исходного кода Java Source Code

Вам необходимо сыграть с MetricAffectingSpan и wrap (CharacterStyle cs), что позволяет применять CharacterStyle к одной области заданного Spanned.

В вашем подклассе переопределите onTouch и передайте его значения в ScaleGestureDetector . Храните обнаруженную шкалу в качестве переменной-члена.

Переопределите onDraw и вызовите canvas.scale () с вашим значением шкалы перед вызовом super.onDraw . Как вы можете заметить в AbsoluteSizeSpan , использование AbsoluteSizeSpan (Parcel src) получит текст, который вы хотите изменить, тогда вы примените updateDrawState .

Вы пытались применить к этим элементам разные стили? Я думаю, что он должен работать с некоторой обусловленностью.

 <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>