13

私は電子ブック (epub 形式) を読み取る Android アプリケーションを開発しています。今のところ、非常に優れた epub リーダーである Paul Siegeman の epublib ライブラリを使用していますが、いくつかの制限があります。 (実際の本を読むように)ページを水平方向に移動できないため、独自の実装が必要ですが、行き詰まっています。

実際に epub を読み取り、それを webview 内に配置する方法は次のとおりです。

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 でスクロールできる唯一の方法が上/下であることがわかっている限り、WebView に電子ブックを表示します。

getData() が返し、webview がページにロードする html 文字列を分割し、viewpager で 1 つずつ表示することを考えていましたが、画面サイズに応じて html を正しく分割するにはどうすればよいですか?

この考えで、私は正しい道を進んでいると思いますか? epub を左から右/右から左 (ページネーション) に表示する他のソリューション、またはそうするための他の「無料または安価な」ライブラリはありますか? (PageTurner を試してみました。とても良いですが、商用版は私には高すぎます)

4

3 に答える 3

14

私はこのようなアンドロイドでページネーション効果を行いました..

-> カスタム webview クラスを作成します。
-> クライアントの下に設定して URL をロードすると、ページ数とともに水平スクロールが表示されます。
-> webview のデフォルト スクロールをロックします。
-> webview のスクロールを移動する代わりにスムーズなページネーション効果を得るには、webview 全体を移動して、1 つのページに 1 つの webview が存在するようにします。
-> 独自のビューフリッパーを使用して、前後のページをバッファリングします。


私はこれらすべての実装を行い、組織向けの製品を作成しました。最善のソリューションに向けてどのようにアプローチするかという私の考えを共有しているだけです.サードパーティを使用して、その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();
    }

URLをロードするもの

于 2014-08-08T06:48:34.553 に答える
2

このgithubアカウントをフォローしてください。

FbReader は、epub および pdf リーダー用の優れたライブラリを提供します。これを試して....

また

WebView を拡張することで、独自のカスタム WebView を作成できます。ここで、WebView から必要なすべての機能を配置および変更できます。

私の同僚は、この FbReader を使用してリーダーを作成しました。それは素晴らしいものでした。

于 2013-11-30T10:31:24.620 に答える