Как «FBReader» выполняет разбиение на страницы html-файлов в epub

Я пытаюсь сделать читателя эпоса

Я хочу сделать разбивку на страницы, как fbreader

Теперь у меня есть исходный код fbreader, но я не знаю, где он реализует разбиение на страницы

У меня есть реализация по другим функциям

Все, что мне нужно от fbreader, это разбиение на страницы

Есть ли кто-нибудь, кто сделал подобное?

Спасибо за ваше время, чтобы прочитать этот вопрос.

Ps: разбиение на страницы состоит в том, чтобы выталкивать html-файл на страницы, в зависимости от размера экрана и размера шрифта, а также язык также учитывается при изменении размера шрифта номер страницы также изменился. И содержимое файла epub – html-формат

Solutions Collecting From Web of "Как «FBReader» выполняет разбиение на страницы html-файлов в epub"

Это захватывающий код. Мне бы хотелось увидеть перевод оригинального студенческого проекта (но я предполагаю, что исходный документ на русском языке). Поскольку это порт проекта C ++, он имеет интересный стиль кодирования в местах.

Приложение отслеживает, где вы находитесь в книге, используя курсоры абзаца ( ZLTextParagraphCursor ). Эта ситуация сопоставима с курсорами базы данных и разбиением на страницы. Класс, отвечающий за обслуживание текущей страницы и вычисление количества страниц, – ZLTextView .

Поскольку epubs являются reflowable документами, а не ориентированными на страницы, на самом деле нет конкретного определения страницы – это просто зависит от того, где в документе вы выглядите (абзац, слово, символ) и с какими настройками отображения.

Как говорит МакЛарен, FBReader не реализует разбивку на страницы: он использует ZLibrary , который доступен на том же сайте, что и FBReader.

Исходный код использует это для вычисления текущего номера страницы:

size_t ZLTextView::pageNumber() const { if (textArea().isEmpty()) { return 0; } std::vector<size_t>::const_iterator i = nextBreakIterator(); const size_t startIndex = (i != myTextBreaks.begin()) ? *(i - 1) : 0; const size_t endIndex = (i != myTextBreaks.end()) ? *i : textArea().model()->paragraphsNumber(); return (myTextSize[endIndex] - myTextSize[startIndex]) / 2048 + 1; } 

Версия Java использует эту функцию для вычисления номера страницы:

 private synchronized int computeTextPageNumber(int textSize) { if (myModel == null || myModel.getParagraphsNumber() == 0) { return 1; } final float factor = 1.0f / computeCharsPerPage(); final float pages = textSize * factor; return Math.max((int)(pages + 1.0f - 0.5f * factor), 1); } 

Это расположено в org.geometerplus.zlibrary.text.view.TextView

Это настолько упрощенно, что вы можете также реализовать свои собственные.

Как я понял, он использует 3 растровых изображения предыдущего текущего и следующего. То, что они сделали, написано текстом, который хранится и читается над этими 3 растровыми изображениями. По мере того, как вы видите сверху, они вычисляют абзацы данных о том, как долго это относится к прокрутке, которую вы видите на примере других. Вы можете начать обратное проектирование в классе пакетов android.view bitmapManager. Это должно объяснить все о том, как они выполняют свои поисковые вызовы.

Чтобы разбивать файл text / html в соответствии с размерами экрана и шрифта, я рекомендую вам проверить это:

http://cubiq.org/swipeview

И его полностью функциональная демонстрация ereader:

http://cubiq.org/dropbox/SwipeView/demo/ereader/

Я тестировал его в Android и iOS и отлично работал!