2013-09-23 26 views
12

Zajmuję się tworzeniem aplikacji na Androida, która czyta ebooki (w formacie epub) i jak na razie używam biblioteki epublib Paula Siegemana, która jest naprawdę bardzo dobrym czytnikiem epublib ale ma pewne ograniczenia, na przykład i te, których potrzebuję, nie możesz poruszać się po stronach w poziomie (tak jak czytasz prawdziwą książkę), więc potrzebuję mojej własnej implementacji, ale utknąłem.Jak podzielić Epub HTML na strony według rozmiaru ekranu

Metoda faktycznie czyta EPUB a następnie umieszcza go wewnątrz WebView jest następny:

private void openEpub(String bookFilename){ 

    WebView webView = (WebView) findViewById(R.id.webView); 

    nl.siegmann.epublib.domain.Book book=null; 
    try { 
     book = (new EpubReader()).readEpub(new FileInputStream(Environment.getExternalStorageDirectory().getPath() + "/" + bookFilename)); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    String baseUrl = Environment.getExternalStorageDirectory().getPath() + "/"; 
    String data=null; 
    try { 
     data = new String(book.getContents().get(1).getData()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    webView.loadDataWithBaseURL(baseUrl, data, "text/html", "UTF-8", null); 

} 

Więc jak widać wyświetlać ebook w WebView tak, o ile wiem możliwość tylko przewijanie liczba wyświetleń w przeglądarce to góra/dół.

Zastanawiałem się nad podziałem ciągu html, który getData() zwraca, a przeglądanie stron internetowych ładuje na strony i wyświetla je po kolei za pomocą narzędzia ViewPager, ale jak poprawnie podzielić HTML według rozmiaru ekranu?

Czy myślisz, że dzięki temu pomysłowi jestem na dobrej drodze? Jakieś inne rozwiązania do wyświetlania epubu od lewej do prawej/od prawej do lewej (paginacja) lub jakiejkolwiek innej "darmowej lub taniej" biblioteki, aby to zrobić? (Próbowałem PageTurner, jest naprawdę dobry, ale wersja komercyjna jest dla mnie zbyt droga)

Odpowiedz

2

Śledź to konto github.

FbReader udostępnia wspaniałe biblioteki do odczytu epub i pdf. Spróbuj to ....

lub

mogą tworzyć własne niestandardową WebView rozszerzając WebView. Tutaj możesz umieścić i zmodyfikować wszystkie funkcje, które chcesz z WebView.

Mój kolega zrobił czytnik przy użyciu tego FbReadera i było wspaniałe.

+0

Dziękuję bardzo Jatin wreszcie i po nie znalezienia rozwiązania mojego problemu, ponieważ jest to ważny projekt postanowiłem kupić czytelnika. Teraz używam programu Page Turner Reader, który nie jest darmowy, ale jest to po prostu niesamowita aplikacja. –

1

Hej, myślę, że to ci pomoże. Odpowiedź Nacho L zadziałała dla mnie. Tutaj HTML book-like pagination?

+0

Dziękuję bardzo atihska, jak mówię poniżej dla Jatin w końcu bez znalezienia rozwiązania postanowiłem kupić czytnik, a teraz używam czytnika Page Turner, który nie jest darmowy, ale jest to po prostu niesamowita aplikacja. –

+0

@Atishka, przetestowałem twoją radę i to działa. Nie pasuję do js, ​​więc czy możesz mi powiedzieć, jak zmieniać strony, klikając lub przewijając? Podpowiedź byłaby doceniona. –

8

Zrobiłem paginacji wpływ na Androida tak ..

-> Tworzenie niestandardowej klasy Webview.
-> Ustaw poniżej klientów i załaduj URL, a otrzymasz poziome przewijanie z liczbą stron.
-> Zablokuj domyślny przewijanie w widoku strony.
-> Aby uzyskać płynny efekt paginacji zamiast przesuwania zwoju strony internetowej, przenieś całą stronę internetową, tak aby na jednej stronie był jeden widok WWW.
-> Używaj własnych widokówek do buforowania poprzedniej i następnej strony.


Zrobiłem wszystkie te wdrożenia i stworzyłem produkt do organizacji. Po prostu dzielę się pomysłem, jak podejść do najlepszego rozwiązania. Zamiast używać trzecich parytetów i utknąć w środku ze względu na ograniczenie tego sdk Uczyń wszystko swoim.

private class MyWebClient extends WebViewClient 
    { 
     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 

      super.onPageStarted(view, url, favicon); 
     } 
     @Override 
     public void onPageFinished(WebView view, String url) 
     { 
      super.onPageFinished(view, url); 

      final MyWebView myWebView = (MyWebView) view; 


       String varMySheet = "var mySheet = document.styleSheets[0];"; 

       String addCSSRule = "function addCSSRule(selector, newRule) {" 
         + "ruleIndex = mySheet.cssRules.length;" 
         + "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);" 

         + "}"; 

       String insertRule1 = "addCSSRule('html', 'padding: 0px; height: " 
         + (myWebView.getMeasuredHeight()/getContext().getResources().getDisplayMetrics().density) 
         + "px; -webkit-column-gap: 0px; -webkit-column-width: " 
         + myWebView.getMeasuredWidth() + "px;')"; 



       myWebView.loadUrl("javascript:" + varMySheet); 
       myWebView.loadUrl("javascript:" + addCSSRule); 
       myWebView.loadUrl("javascript:" + insertRule1); 




     } 
    } 

    private class MyWebChromeClient extends WebChromeClient 
    { 
     @Override 
     public void onProgressChanged(WebView view, int newProgress) 
     { 
      super.onProgressChanged(view, newProgress); 

      if(newProgress == 100) 
      { 
       postDelayed(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         calculateNoOfPages(); 
        }  

       },200); 
      } 
     } 
    } 
private void calculateNoOfPages() 
    { 
     if(GlobalSettings.EPUB_LAYOUT_TYPE == GlobalConstants.FIXED) 
     { 

     } 
     else 
     { 
      if(getMeasuredWidth() != 0) 
      { 
       int newPageCount = computeHorizontalScrollRange()/getMeasuredWidth(); 
       getData().getChapterVO().setPageCount(newPageCount); 

      } 
     } 
    } 
@Override 
    public int computeHorizontalScrollRange() { 
     // TODO Auto-generated method stub 
     return super.computeHorizontalScrollRange(); 
    } 

jeden załadować url do

+0

bro ultimatum ... naprawdę szukałem rozwiązania na tydzień. Ultimatum, naprawdę rozwiązałeś dla mnie ogromny problem. Chciałbym dać ci 100. Każdy, kto szuka rozwiązania, powyższe działa idealnie. Może zaistnieć potrzeba zmiany reguły addCSS, ale rozwiązanie zdecydowanie działa. Dzięki tona bracie –

+1

Dziękujemy za komentarz arunavh !! jesteś bardzo mile widziany na dalszą pomoc :) –

+0

Bardzo dziękuję za poświęcony czas Uday, spróbuję jak najdokładniej, ale czy uważasz, że twoje rozwiązanie jest łatwe do wdrożenia? (Przeczytałem to tak szybko, jak jestem w biurze) –