13

我正在开发一个读取电子书(epub 格式)的 Android 应用程序,目前我正在使用 Paul Siegeman 的 epublib 库,它确实是一个非常好的 epub 阅读器,但它有一些限制,例如,我需要的那个,你不能水平移动页面(就像你阅读一本真正的书一样),所以我需要自己实现它,但我被卡住了。

实际读取 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()返回的html字符串和webview加载到页面中并用viewpager一一显示,但是如何根据屏幕大小正确拆分html?

你认为我的这个想法是正确的吗?从左到右/从右到左(分页)或任何其他“免费或便宜”库显示 epub 的任何其他解决方案?(我试过PageTurner,真的很好,但是商业版对我来说太贵了)

4

3 回答 3

14

我在android中做过这样的分页效果..

-> 创建一个自定义 webview 类。
-> 在客户端下方设置并加载 url,然后您将获得带有页数的水平滚动。
-> 锁定 webview 默认滚动。
->为了平滑的分页效果而不是移动webview的滚动,移动整个webview,这样一页就会有一个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();
    }

一个你加载网址的

于 2014-08-08T06:48:34.553 回答
2

关注这个github帐户。

FbReader 为 epub 和 pdf 阅读器提供了一些很棒的库。尝试这个....

或者

您可以通过扩展 WebView 来制作自己的自定义 WebView。在这里,您可以放置​​和修改 WebView 所需的所有功能。

我的同事使用这个 FbReader 做了一个阅读器,非常棒。

于 2013-11-30T10:31:24.620 回答
1

嘿,我想这会对你有所帮助。Nacho L 的回答对我有用。这里是 HTML 书式分页

于 2014-01-30T01:15:54.330 回答