Размер шрифта слишком большой, чтобы соответствовать кешу

17

Итак, я недавно переключился на Android 3.0 (сотовые), и у меня возникли некоторые проблемы с аппаратным рендерингом, особенно в определенном пользовательском представлении, которое я написал, где я использую размер шрифта 200 для отображения некоторого текста.

К сожалению, кажется, что openGLRenderer не очень любит такие довольно большие размеры шрифта, учитывая ошибку, которую я получаю в журнале:

06-06 16:22:00.080: ERROR/OpenGLRenderer(2503): Font size to large to fit in cache. width, height = 97, 145

Существуют ли способы (или способы его устранения), чтобы я мог получить текст, отображаемый с требуемым размером шрифта?

    
задан MrJre 06.06.2011 в 16:28
источник
  • Итак, я работал над этим, создавая изображения для всех персонажей, которые мне нужны в этом размере шрифта, но я могу себе представить, что есть моменты, когда вы не хотите делать такие вещи, поэтому держите его открытым для более окончательный ответ. –  MrJre 21.06.2011 в 15:20

3 ответа

7

Просто идея: возможно, вы можете преобразовать шрифт в контур, используя Paint.getTextPath (...) и используйте этот путь для визуализации текста. Это должно позволить вам изменить размер пути по мере необходимости.

    
ответ дан Stefan Mücke 01.07.2011 в 02:43
источник
  • Кажется работать, потрясающе. Стиль рисунка должен иметь набор заливок, и кажется, что getTextPath () возвращает Path, который не закрыт, поэтому перед его рисованием нужно закрыть его с помощью path.close (). –  MrJre 04.07.2011 в 11:10
  • не могли бы вы разместить какой-нибудь код для этого? на данный момент я отключил ускорение просмотра HW, так как он всегда имеет эту проблему. –  android developer 10.09.2012 в 17:58
  • Существует метод для метода path.close () –  Eduardo Reis 02.06.2017 в 20:59
  • , пожалуйста, введите код здесь, потому что я заканчиваю тем, что мой код не работает –  zihadrizkyef 06.12.2017 в 03:29
29

Это действительно ошибка в ОС Android внутри модулей аппаратного ускорения. Я думаю, что лучший способ - попросить систему избежать ускорения HW в TextViews, содержащих большой размер текста. Для этого просто добавьте в код:

TextView bigText = (TextView) findViewById(R.id.bigtext);
bigText.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    
ответ дан Shaish81 11.09.2012 в 16:16
источник
  • Это простое решение и работает, если вы используете TextView; Я не использовал это, потому что с помощью текстовых полей моя иерархия просмотров стала глубокой и дорогой для рендеринга и компоновки в то время. Вместо этого я сделал собственное представление и сам нарисовал текст на холсте. –  MrJre 24.10.2012 в 09:33
  • +1 У меня был большой текст, исчезающий на мне, и мне потребовалось некоторое время, чтобы понять, что это проблема аппаратного ускорения. это сработало для меня, но я сбросил переопределение прямо в xml: android: layerType="software" –  ggenglish 14.03.2013 в 20:53
  • К сожалению, это больше не работает на 4.4 (это означает: я больше не вижу ошибки, но текст не нарисован). –  BoD 30.03.2014 в 19:42
  • , используя xml-версию этого, решил это для меня в Android 6.0.1 –  Someone Somewhere 15.08.2016 в 00:39
  • Я пробовал эту работу на другом телефоне, и один шрифт не отображается. Однако на моем планшете это показывает. Есть ли более эффективная работа, более надежная? –  Someone Somewhere 16.08.2016 в 21:30
3

Метод setLayerType полезен, но, к сожалению, он поддерживается только для API & gt; = 11. Разработка для API = 8 или менее становится непригодной.

Если вы можете, простое решение отключает аппаратное ускорение только для активности, которая создает проблемы. У меня была эта проблема и она была решена так:

<application
    android:...
    android:hardwareAccelerated="true" >
    <activity ...>
        ...
    </activity>

    <activity
        ...
        android:hardwareAccelerated="false">
        ...
    </activity>
</application>

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

    
ответ дан marzapower 23.10.2012 в 22:22
источник
  • с API 8 или меньше, нет аппаратного ускорения, поэтому нет необходимости в каком-либо из них. android: hardwareAccelerated работает только API 11 и выше. См. Также developer.android.com/guide/topics/graphics/hardware-accel.html –  MrJre 24.10.2012 в 09:26
  • Я разрабатываю приложение, которое должно запускаться на API 8, но требует API 11 для Admob. Итак, я должен найти способ решить проблему, используя только общедоступные API, доступные из API v. 8 on. И этот подход устраняет проблему. –  marzapower 26.10.2012 в 15:03