android html pagination epub

android - Cómo el "FBReader" hace la paginación de archivos html en epub



pagination (4)

Estoy tratando de hacer un lector de epub

Quiero hacer la paginación como lo hace Fbreader

Ahora tengo el código fuente de fbreader, pero no sé dónde implementa la paginación

Tengo mi implementación en otras características

Todo lo que necesito de Fbreader es la paginación

¿Hay alguien que haya hecho algo similar?

Gracias por su tiempo para leer esta pregunta.

ps: la paginación es escindir el archivo html en páginas, dependiendo del tamaño de la pantalla y el tamaño de la fuente, y el idioma también está en consideración, cuando se cambia el tamaño de la fuente, el número de página también cambia. Y el contenido del archivo epub es formato html


Es un código fascinante. Me encantaría ver una traducción del proyecto original del estudiante (pero supongo que el documento original está en ruso). Como este es un puerto de un proyecto de C ++, tiene un estilo interesante de codificación en algunos lugares.

La aplicación realiza un seguimiento de dónde se encuentra en el libro mediante el uso de cursores de párrafo ( ZLTextParagraphCursor ). Esta situación es comparativa con los cursores de la base de datos y la paginación de registros. La clase que se encarga de servir la página actual y calcular el número de páginas es ZLTextView .

Como los epub son documentos modificables y no están orientados a páginas, no existe realmente una definición concreta de página, solo depende de en qué parte del documento está buscando (párrafo, palabra, carácter) y con qué configuración de visualización.


Como dice McLaren, FBReader no implementa paginación: usa ZLibrary , que está disponible desde el mismo sitio web que FBReader.

El código original usa esto para calcular el número de página actual:

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; }

La versión de Java usa esta función para calcular el número de página:

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); }

Esto se encuentra en org.geometerplus.zlibrary.text.view.TextView

Sin embargo, es tan simplista que podrías implementar la tuya propia.


Lo que entendí es que usa 3 mapas de bits anteriores y posteriores. Lo que han hecho es escribir un texto que se almacena y lee sobre estos 3 mapas de bits. Más de lo que ves en la parte superior, calculan los datos de los párrafos de cuánto tiempo dura el desplazamiento que ves en el ejemplo de los demás. Puede iniciar ingeniería inversa en la clase de paquete android.view bitmapManager. Esto debería explicar todo sobre cómo hacen su paginación.