Недавно я обнаружил, что TextView
на Android отображаются размытыми / нечеткими, когда они масштабируются в диапазоне 1.0 - 1.49 .
Я не уверен, почему это происходит, но похоже, что растровая версия немасштабированной версии используется, когда представление масштабируется по оси XY в этом диапазоне.Тем не менее, проблема исчезает, если представление масштабируется со значением выше 1,5 (150%).Пожалуйста, проверьте прикрепленный скриншот коллаж в полном разрешении: https://i.imgur.com/A31ZC1N.png
![scale issues](https://i.imgur.com/1z7ysHY.png)
Прикрепленные скриншоты с реального устройства под управлением Android 7.1.2 (API Level 25).
Я также проверил это на эмуляторе под управлением Android 9 (API Level 28), результаты идентичны.Однако на моем другом устройстве (OnePlus 6, Android 9) этой проблемы нет, все хорошо масштабируется, без размытости.
Обходным решением для меня было отключение ускорения HW для текущей активности:
<activity android:hardwareAccelerated="false" />
Другим обходным решением было установить программный слой на родительском объекте масштабируемого представления:
((View) mScaleValueTextView.getParent()).setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Обе эти операции приведут к масштабированию TextView
без указанной проблемы, ноу этих методов есть недостатки, первое, что я заметил, было то, что тень TextView
, вызванная свойством elevation
, не была нарисована.
Чтобы продемонстрировать поведение по умолчанию, я создал пример приложения, в котором ядобавлены TextView
и SeekBar
, управляющие масштабом, в диапазоне от 100% до 200%.
Вид масштабируется этим методом:
private void scaleView(View v, float scaleValue) {
v.setScaleX(scaleValue);
v.setScaleY(scaleValue);
}
Вы можете получитьвесь пример приложения здесь .
Поскольку один и тот же код ведет себя по-разному на разных устройствах, и проблема возникает только между упомянутым диапазоном шкалы, я предполагаю, что эторезультат оптимизации производительности более низкого уровня, которая может быть или не быть реализована на некоторых устройствах.
Есть ли способ отключить или обойти это чисто, без нежелательных побочных эффектов?