2013-09-23 71 views
12

我正在開發一個讀取電子書(以epub格式)的Android應用程序,至於現在我正在使用Paul Siegeman的epublib庫,它確實是一個非常好的epub reader但它有一些限制,例如我需要的一個,你不能水平移動頁面(因爲你閱讀一本真正的書),所以我需要我自己的實現,但我卡住了。如何根據屏幕大小將Epub Html分成頁面

實際讀取EPUB,然後把它網頁視圖內的方法是下一個:

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

} 

所以你看我這樣就顯示在網頁視圖電子書,因爲我知道只有滾動的可能性webview提供了上/下。

我在考慮將getData()返回和webview加載的html字符串拆分成頁面並用viewpager逐個顯示它們,但是如何根據屏幕大小正確拆分html?

你認爲這個想法我正確嗎?任何其他解決方案從左到右/從右到左顯示epub(paginate)或任何其他「免費或便宜」庫來執行此操作? (我試過PageTurner,它確實不錯,但商業版本對我來說太貴了)

回答

2

跟着這個github帳戶。

FbReader爲epub和pdf閱讀器提供了一些很棒的庫。試試這個....

您可以通過擴展的WebView使自己定製的WebView。在這裏,您可以放置​​並修改您的WebView所需的所有功能。

我的同事做了一個讀者使用這個FbReader,它是神話般的。

+0

非常感謝您Jatin,最後也是因爲它是一個重要的項目,我決定買一個閱讀器沒有找到一個解決我的問題後。現在我正在使用Page Turner Reader,它不是免費的,但它只是一個驚人的應用程序。 –

1

嘿,我認爲這會對你有幫助。 Nacho L的回答爲我工作。這裏HTML book-like pagination

+0

非常感謝atihska,正如我在下面爲Jatin所說的,最終沒有找到解決方案,我決定購買一個閱讀器,現在我正在使用Page Turner閱讀器,這不是免費的,但它只是一個驚人的應用程序。 –

+0

@Aishish,我測試了你的建議,它的工作原理。我對js不太好,你能告訴我如何通過點擊或滾動來改變頁面嗎?一個提示將不勝感激。 –

8

我已經做了android系統分頁效果這樣的..

- >創建一個自定義的WebView類。
- >設置在客戶端下載並加載網址,然後您將獲得水平滾動頁數。
- >鎖定webview默認滾動條。
- >爲了平滑的分頁效果,而不是移動webview的滾動,移動整個webview,所以對於一個頁面,將有一個webview。
- >使用您自己的快速瀏覽器緩衝上一頁和下一頁。


我所做的這一切的實現,我做了一個產品一個organisation.Just我分享我的想法如何向使用第三胎次stucking在中間的最佳solution.Instead接近,由於該SDK的限制,讓每一件事都成爲你自己。

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

一個加載網址

+0

broti最後通... ...我真的在尋找一個星期的解決方案。 Ultimatum兄弟,你真的解決了我的一個問題。希望我能給你100分。 任何正在尋找解決方案的人,上面的解決方案都很完美。您可能需要稍微更改addCSS規則,但解決方案肯定有效。謝謝噸兄弟 –

+1

感謝您的評論arunavh!你是最歡迎的任何進一步的幫助:) –

+0

非常感謝你的時間Uday,我會盡可能地嘗試兒子,但你認爲你的解決方案有點容易實現嗎? (因爲我在辦公室,所以我很快就讀過了) –