Я пишу простой текстовый /eBook viewer для Android, поэтому я использовал TextView
для отображения текста в формате HTML для пользователей, чтобы они могли просматривать текст на страницах, переходя туда и обратно. Но моя проблема в том, что я не могу разбивать текст на Android.
Я не могу (или я не знаю, как) получить соответствующую обратную связь от алгоритмов разрыва строки и разбиения на страницы, в которых TextView
используется для разбиения текста на строки и страницы. Таким образом, я не могу понять, где содержимое заканчивается на фактическом дисплее, поэтому я продолжаю с оставшегося на следующей странице. Я хочу найти способ преодолеть эту проблему.
Если я знаю, что является последним символом, нарисованным на экране, я могу легко разместить достаточное количество символов, чтобы заполнить экран, и зная, где закончилась фактическая живопись, я могу продолжить работу на следующей странице. Это возможно? Как?
Аналогичные вопросы задавались несколько раз в StackOverflow, но удовлетворительного ответа не было. Это лишь некоторые из них:
- Как разбивать длинный текст на страницы в Android?
- Проблема с разбивкой по страницам электронной книги в android
- Разделить текст на основе отображаемого размера текста
Был один ответ, который, похоже, работает, но он медленный. Он добавляет символы и строки до тех пор, пока страница не будет заполнена. Я не думаю, что это хороший способ сделать разбивку страницы:
Вместо этого вопроса бывает, что PageTurner eBook reader делает это в основном правильно, хотя это как-то медленно.
PS: Я не ограничен TextView, и я знаю, что алгоритмы разбивки строк и разбиения на страницы могут быть довольно сложными (как в TeX), поэтому я не ищу оптимального ответа, а достаточно разумное решение, которое может быть использовано пользователями.
Обновление: Это кажется хорошим началом для получения правильного ответа:
Есть ли способ получить видимую строку или диапазон видимых строк TextView?
Ответ: После завершения компоновки текста можно узнать видимый текст:
ViewTreeObserver vto = txtViewEx.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewTreeObserver obs = txtViewEx.getViewTreeObserver();
obs.removeOnGlobalLayoutListener(this);
height = txtViewEx.getHeight();
scrollY = txtViewEx.getScrollY();
Layout layout = txtViewEx.getLayout();
firstVisibleLineNumber = layout.getLineForVertical(scrollY);
lastVisibleLineNumber = layout.getLineForVertical(height+scrollY);
}
});