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 :)
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
https://github.com/NightWhistler/PageTurner W tym kodzie źródłowym edytowałem plik podany powyżej.istnieją już w projekcie. –