Intereting Posts
Как получить исходный код Chromium для Android Обрезка изображения при съемке с камеры Как использовать тип вызова с EventBus Как анализировать дату с GMT TimeZone на IST TimeZone и наоборот в android Не удалось разрешить ресурс @ style / Widget.Holo.Light.ActionMode.Inverse Java.lang.illegalStateException случайным образом возникает при получении mediaPlayer.getCurrentPosition Как загрузить файл с помощью библиотеки Volley в android? Запустить Python в терминале Android Как я могу разобрать xml из url в android? Обнаружение вращения Android-телефона в браузере с помощью JavaScript Загрузите проблему с большим размером изображения в imageview. Растровое изображение слишком велико для загрузки в текстуру Установите разрешения приложений на Android 6.x (Marschmallow) в приложении phonegap / cordova Android программно рисует изображение как фон Как вы протестируете приглашение в firebase? Как передать ключ авторизации api и идентификатор транзакции в authorize.net sdk для Android?

Как избежать OutOfMemory для TextView, содержащего неограниченные ImageSpans?

Я разрабатываю приложение для записи почерка.
Приложение работает таким образом: пользователь пишет (рисует) текст на сенсорном экране, приложение конвертирует почерк в битмап (getBitmapFromHandwriting ()), а затем использует это растровое изображение для создания SpannableString и покажет его пользователю в TextView (В моем случае я использую EditText, но для упрощения, скажем, это TextView).
Вот фрагмент кода в расширенном TextView:

class MyTextView extends TextView{ ... BitmapDrawable bmd = new BitmapDrawable(getBitmapFromHandwriting()); int width = bmd.getIntrinsicWidth(); int height = bmd.getIntrinsicHeight(); bmd.setBounds( (int)(height/4.0f), (int)(height/4.0f), (int)(width + height/4.0f), (int)(height*5.0f/4.0f)); final ImageSpan img = new ImageSpan(bmd); getText().setSpan(img, position, position+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); … } 

В getBitmapFromHandwriting () приложение создает новое растровое изображение для каждого текста, нарисованного пользователем.

Все отлично работает до того, как нота становится большой (значит, в родной памяти много растровых изображений), OutOfMemoryError бросается при созданииBitmap ().
После многих поисковых запросов я узнал, что растровые изображения используют «родную память», что очень ограничено.
Я также узнал, что gc для битмапа не происходит одновременно с gc JVM. Поэтому людям лучше делать bitmap.recycle (), когда битмап, безусловно, больше не нужен.
Из приведенных выше знаний, я думаю, мне нужно переработать растровые изображения для невидимых текстов и загрузить это растровое изображение только тогда, когда это необходимо (то есть, видимо)
Прежде чем перерабатывать растровое изображение, я должен убедиться, что он не будет использоваться в будущем, иначе получится «RuntimeException: Canvas: попытка использования переработанного растрового изображения …»
Т.е. я должен очистить соответствующие промежутки, прикрепленные к SpannableString. (GetText (). RemoveSpan () или getText (). ClearSpans (), но это уже другая история.)
Для этого мне нужно указать, какие строки видны и которые невидимы. В ViewGroups, например GridView, я могу вызвать «getFirstVisiblePosition ()», но я не знаю, как это сделать для TextView.

Я знаю, что можно сбрасывать образец растрового изображения для поддержки большего количества растровых изображений, но я хочу, чтобы TextView поддерживал UNLIMITED ImageSpans.
Если это GridView или ListView, ленивая загрузка будет выполнять эту работу. Но как это сделать в одном TextView?
Разделение контента на несколько страниц должно теоретически работать в некоторых ситуациях, но в моем приложении пользователь может также «экспортировать» заметку. Экспорт просто делает копию текущего представления (как сделать экспорт без создания нового растрового изображения, это еще одна проблема, не обсуждаться в этом потоке). Если заметка разделена на несколько страниц, пользователь должен «экспортировать» для каждой страницы, поэтому это не вариант.

Мои вопросы:
1. Можно ли определить видимые строки в TextView?
2. Есть ли лучший способ (шаблоны) для реализации такого «TextView, содержащего множество ImageSpans» без получения OutOfMemoryError?

Любая идея ценится. Заранее спасибо!