Подтвердить что ты не робот

Как "FBReader" делает разбиение на страницы html файлов в epub

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Как говорит МакЛарен, 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 растровых изображения предыдущего текущего и следующего. То, что они сделали, написано текстом, который хранится и читается над этими 3 растровыми изображениями. По мере того, как вы видите сверху, они вычисляют параграфы данных о том, как долго это относится к прокрутке, которую вы видите на примере других. Вы можете начать обратное проектирование в классе пакетов android.view bitmapManager. Это должно объяснить все о том, как они выполняют свои поисковые вызовы.

Ответ 4

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

http://cubiq.org/swipeview

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

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

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