Я разрабатываю приложение для создания заметок для рукописного ввода.
Приложение работает следующим образом: пользователь пишет (рисует) текст на сенсорном экране, приложение преобразует рукописный текст в растровое изображение (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 генерируется, когда createBitmap ().
После многих поисков в Google я узнал, что растровые изображения используют "собственную память", которая очень ограничена.
Я также узнал, что gc для битовых карт не происходитв то же время с GC JVM имеют место.Таким образом, людям лучше использовать bitmap.recycle (), когда точечный рисунок, безусловно, больше не нужен.
Исходя из вышеизложенного, я думаю, что мне нужно повторно использовать растровые изображения для невидимых текстов и загружать этот растровый файл только при необходимости (т.е.visible)
Прежде чем перерабатывать растровое изображение, я должен убедиться, что оно не будет использоваться в будущем, иначе получит «RuntimeException: Canvas: попытка использовать переработанное растровое изображение…»
то есть мне нужно очиститьсоответствующие пролеты, прикрепленные к SpannableString.(С помощью getText (). RemoveSpan () или getText (). ClearSpans (), но это уже другая история.)
Для этого мне нужно указать, какие строки видимы, а какие нет.В ViewGroups, таких как GridView, я могу вызвать «getFirstVisiblePosition ()», но я не знаю, как это сделать для TextView.
Я знаю, что можно уменьшить выборку растрового изображения для поддержки большего количества растровых изображений, но я хочу, чтобы TextView поддерживал UNLIMITED ImageSpans.
Если это GridView или ListView, реализация с отложенной загрузкой сделает эту работу.Но как это сделать в одном TextView?
Разделение контента на несколько страниц теоретически должно работать в некоторых ситуациях, но в моем приложении пользователь также может «экспортировать» заметку.При экспорте просто копируют текущее представление (как сделать экспорт без создания нового растрового изображения - другая проблема, не обсуждаемая в этой теме).Если заметка разделена на несколько страниц, пользователь должен «экспортировать» для каждой страницы, так что это не вариант.
Мои вопросы:
1. Можно ли определить видимые строки в TextView?
2. Есть ли лучший способ (шаблоны) для реализации такого «TextView, содержащего множество ImageSpans» безполучить OutOfMemoryError?
Любая идея приветствуется.Заранее спасибо!