19

epubリーダーを作ろうとしています

fbreaderのようにページネーションをしたい

fbreader のソース コードはあるが、どこにページネーションを実装しているかがわからない

私は他の機能に実装しています

fbreader に必要なのはページネーションだけです

似たようなことをした人はいますか?</p>

この質問を読んでいただきありがとうございます。

追記:ページネーションは、画面サイズやフォントサイズに応じて、htmlファイルをページに吐き出すことで、言語も考慮し、フォントサイズを変更するとページ数も変わってしまいます。また、epub ファイルの内容は html 形式です

4

3 に答える 3

4

McLaren が言うように、FBReaderはページネーションを実装していません。FBReaderと同じWeb サイトから入手できるZLibraryを使用します。

元のコードはこれを使用して現在のページ番号を計算します。

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

ただし、これは非常に単純化されているため、独自に実装することもできます。

于 2011-06-25T00:38:29.683 に答える
4

魅力的なコードです。元の学生プロジェクトの翻訳が見たいです (ただし、元のドキュメントはロシア語であると思います)。これは C++ プロジェクトの移植であるため、ところどころ興味深いコーディング スタイルがあります。

アプリは、段落カーソル ( ZLTextParagraphCursor )を使用して、ブック内の位置を追跡します。この状況は、データベース カーソルおよびレコードのページ付けと比較できます。現在のページの提供とページ数の計算を担当するクラスはZLTextViewです。

epubはリフロー可能なドキュメントであり、ページ指向ではないため、実際にはページの具体的な定義はありません。ドキュメント内のどこを見ているか (段落、単語、文字) と表示設定に依存します。

于 2011-06-24T08:44:23.047 に答える
2

私がそれを理解した方法は、前の現在と次の 3 つのビットマップを使用しているということです。彼らが行ったことは、この 3 つのビットマップ上で保存および読み取られるテキストを書き込んだことです。上に表示されているように、他の例で表示されているスクロールの長さの段落データを計算します。android.view パッケージ クラス bitmapManager でリバース エンジニアリングを開始できます。これにより、ページングの方法に関するすべてが説明されるはずです。

于 2011-12-06T17:09:33.083 に答える