2016-12-06 10 views
15

Muszę zaimplementować funkcję Przejdź do strony w czytniku epub. Próbowałem zaimplementować tę funkcję w kodzie źródłowym Page-Turner, ale nie działa ona pomyślnie z powodu wielu xhtml w pliku .epub, ponieważ wiemy, że każdy rozdział ma pojedynczy plik xhtml i jego podział na rozmiar ekranu w tej aplikacji. Tak więc, gdy rozmiar ekranu jest duży, całkowita liczba stron jest mniejsza i większa jest liczba stron, gdy ekran jest mały, więc nie ma numeru strony gdzie można przeskoczyć. Mam edycję i próbuję zaimplementować podobnego dawcę poniżej.Przejdź do strony w czytniku epub (PageTurner)

ReadingFragment.java

public void performSearch(String query) { 

    int index = Integer.parseInt(query); 

    if (index > bookView.getTotalNumberOfPages()) { 
     Toast.makeText(context, "Please enter number between 0 to " + bookView.getTotalNumberOfPages(), Toast.LENGTH_SHORT).show(); 
    } else { 
     bookView.gotoPageNumber(index); 
    } 
} 

BookView.java

public void gotoPageNumber(int pageNum) { 
    strategy.gotoPage(pageNum); 
    progressUpdate(); 
} 

PageChangeStrategy.java

public void gotoPage(int pageNumber); 

FixedPagesStrategy.java

@Override 
public void gotoPage(int pageNumber) { 

    PageTurnerSpine spinePos = bookView.getSpine(); 

    this.storedPosition = -1; 

    int currentPage = getCurrentPage() + spinePos.getUptoPage(spinePos.getPosition()); 
    Log.e(TAG, "Adding >> Upto Page : " + spinePos.getUptoPage(spinePos.getPosition()) 
      + ", currentPage : " + getCurrentPage()); 
    Log.e(TAG, "pagenum : " + pageNum); 

    if (pageNumber > currentPage) {  //pageNumber is greater then current page 

     int jumpSpine = spinePos.getIndexFromPage(pageNumber); 
     int currentSpine = spinePos.getPosition(); 
     Log.e(TAG, "jumpSpine : " + jumpSpine + ", currentSpine : " + currentSpine); 

     if (jumpSpine == currentSpine) { 

      int diffrence = pageNumber - currentPage; 
      Log.e(TAG, "diffrence < : " + diffrence); 

      Log.e(TAG, "Minimum >> PageOffSets - 1 : " + (spinePos.getPageOffSets(currentSpine) - 1) 
        + ", pageNum + diffrence : " + (pageNum + diffrence)); 

      this.pageNum = Math.min(pageNum + diffrence, spinePos.getPageOffSets(currentSpine) - 1); 
      updatePosition(); 

     } else { 

      PageTurnerSpine spine = bookView.getSpine(); 

      if (spine == null || !spine.navigateFrontSpine(spine.getIndexFromPage(pageNumber))) { 
       return; 
      } 
      this.pageNum = 0; 

      gotoPage(pageNumber); 

     } 

    } else {       //pageNumber is less then current page 

     int jumpSpine = spinePos.getIndexFromPage(pageNumber); 
     int currentSpine = spinePos.getPosition(); 
     Log.e(TAG, "jumpSpine : " + jumpSpine + ", currentSpine : " + currentSpine); 

     if (jumpSpine == currentSpine) { 

      int diffrence = currentPage - pageNumber; 
      Log.e(TAG, "diffrence > : " + diffrence); 

      Log.e(TAG, "pagenum - diffrence : " + (pageNum - diffrence)); 

      this.pageNum = Math.max(pageNum - diffrence, 0); 
      updatePosition(); 

     } else { 

      PageTurnerSpine spine = bookView.getSpine(); 

      if (spine == null || !spine.navigateBackSpine(spine.getIndexFromPage(pageNumber))) { 
       return; 
      } 
      this.pageNum = 0; 

      gotoPage(pageNumber); 
     } 
    } 

    Log.e(TAG, "In last pageNum : " + pageNum); 
} 

PageTurnerSpine.java

public int getIndexFromPage(int pageNumber) { 
    int total = 0; 
    int totalIndex = 0; 

    for (List<Integer> pagesPerSection : pageOffsets) { 
     total += pagesPerSection.size(); 
     totalIndex = totalIndex + 1; 
     if (total - 1 >= pageNumber) { 
      return totalIndex - 1; 
     } 
    } 
    return 0; 
} 

public int getUptoPage(int position) { 
    int total = 0, max = 0; 
    for (List<Integer> pagesPerSection : pageOffsets) { 
     max = max + 1; 

     if (position == max - 1) { 
      return total; 
     } 
     total += pagesPerSection.size(); 
    } 
    return 0; 
} 

public int getPageOffSets(int position) { 
    int max = 0; 
    for (List<Integer> pagesPerSection : pageOffsets) { 
     max = max + 1; 

     if (position == max - 1) { 
      return pagesPerSection.size(); 
     } 
    } 
    return 0; 
} 

public boolean navigateFrontSpine(int indexSpine) { 

    if (this.position == size() - 1) { 
     return false; 
    } 

    this.position = indexSpine; 
    return true; 
} 

public boolean navigateBackSpine(int indexSpine) { 

    if (this.position == 0) { 
     return false; 
    } 

    this.position = indexSpine; 
    return true; 
} 

Kiedy stosuje ten kod i uruchomić jakiś czas działa poprawnie. ale w pewnym momencie przeskakuje on na inny numer strony, na przykład, gdy wprowadzę 110, to przeskoczy on o 109. i kiedy próbuję przeskoczyć na stronę początkową rozdziału, wtedy dawka nie zmieni się. Proszę pomóż mi.

https://github.com/NightWhistler/PageTurner W tym kodzie źródłowym edytowałem plik podany powyżej. już istnieją w tym projekcie.

Przeważnie widzę, że większość czytników epub takich jak Kindle, FBReader itp. Nie implementuje funkcji Przejdź do strony. Więc chcę również wiedzieć, że jest możliwe zaimplementowanie tej funkcji, czy nie?

podziękowania za pomoc :)

+0

Proponuję opublikować bardziej szczegółowy kod identyfikujący problem. W obecnej postaci ilość kodu w tym pytaniu jest dość duża, co utrudnia debugowanie bez możliwości jego uruchomienia. http://stackoverflow.com/help/mcve – Anthony

+0

https://github.com/NightWhistler/PageTurner W tym kodzie źródłowym edytowałem plik podany powyżej.istnieją już w projekcie. –

Odpowiedz

3

Naprawdę trzeba skonsultować standardy IDPF Epub na IDPF.org/epub.

Jednym podejściem, które według mnie jest opcjonalne w ramach standardu (ale nie jestem tego pewien), jest oznaczenie zawartości fizycznymi numerami stron z papierowej książki (jeśli takowa istnieje) lub podjęcie decyzji w sprawie własnego systemu numerowania wraz ze spisem treści i używaj odpowiedniej strony wirtualnej jako początkowej.

Umożliwia to przechodząc do początku z tej samej strony, ale liczba wirtualnych stron na stronie fizycznej będą się różnić, w zależności od rozmiarów czcionek itp aktualnie w użyciu.

To kwestia danych tak samo jak programująca.

Powiązane problemy