сделать книгу epub в андроиде? - PullRequest
5 голосов
/ 15 декабря 2011

Я пытаюсь показать книгу EPUB в Android Pad.Я могу разобрать html и css, чтобы показать содержание и формат книги, возможно, в книгу включены картинки. Кажется, у меня есть два варианта:

  1. использовать Webview.
  2. Напишите представление клиента, чтобы он мог отображать html / css - это кажется очень сложной задачей.

Какой хороший способ?Если мне нужно использовать WebView, как насчет логики разрыва страницы, так как веб-просмотр анализирует один HTML-файл на одной странице, я не могу найти разрыв страницы в веб-просмотре.

Ответы [ 3 ]

6 голосов
/ 08 августа 2014

Я разработал собственный epub-плеер для android и ios

Код, которым я поделился здесь, является частью исходного кода моего продукта, копирование и вставка его не будут работать для вас. Считайте это ссылкой.

Я использовал webview в android и uiwebview в ios, создавая пользовательский вид и анализ html/css почти как разработка нового движка рендеринга (т.е. браузера). Это утомительно и сложно.

Вкратце я дам вам шаги, которые я выполнил для Android

  • Создание собственного веб-просмотра
  • загрузка URL и запись клиентов с обратным вызовом (WebViewClient, WebChromeClient)
  • после загрузки веб-просмотра выполните нумерацию страниц, используя метод ниже

Код:

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);
            //  GlobalConstants.ENABLE_WEB_VIEW_TOUCH = false;
            if(newProgress == 100)
            {
                postDelayed(new Runnable() 
                {
                    @Override
                    public void run() 
                    {
                        calculateNoOfPages();

                    }
                },300);
            }
        }
    }

private void calculateNoOfPages()
    {

        if(getMeasuredWidth() != 0)
        {
            int newPageCount = computeHorizontalScrollRange()/getMeasuredWidth();
        }
    }

Внедрение jquery.js в веб-просмотр:

private void addJQueryJS() 
    {
        String path = "file:///android_asset/JSLibraries/jquery.min.js";
        String data = "{\"MethodName\":\"onJQueryJSLoaded\",\"MethodArguments\":{}}";
        String callBackToNative  = " jsInterface.callNativeMethod('jstoobjc:"+data+"');";
        String script = "function includeJSFile()"
                               +"{"
                               +"function loadScript(url, callback)"
                               +"{"
                               +"var script = document.createElement('script');"
                               +"script.type = 'text/javascript';"
                               +"script.onload = function () {"
                               +"callback();"
                               +"};"
                               +"script.src = url;"
                               +"if(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0])"
                               +"{"
                               +"(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(script);"
                               +"}"
                               +"else { callback(); }"
                               +"}"
                               +"loadScript('"+path+"', function ()"
                               +"{"
                               +callBackToNative
                               +"});"
                               +"} ; includeJSFile();";
        loadUrl("javascript: "+script);
    }
  • Обернуть все слова в интервалы - используется для выделения текста и навигации по странице.
  • будет 3 просмотра - текущая страница, следующая страница и предыдущая страница. Вы должны установить смещение на прокрутку веб-просмотра в соответствии с количеством страниц в этой главе. Допустим, в одном .html-файле содержится 3 страницы - предыдущее веб-просмотр - это первая страница, текущее веб-просмотр - вторая страница, следующее веб-просмотр - третья страница, но все веб-просмотры загружают один и тот же URL.
  • написать собственную логику перелистывания страниц вместо использования viewpager. Просто передайте текущую страницу адаптеру, после чего адаптер вернет вам следующую страницу и предыдущую страницу. По некоторым вычислениям.

Код:

@Override
    public PageView getPreviousView(PageView oldPage) 
    {
        MyWebView oldWebView = ((PageView)oldPage).getWebView();

        int chapterIndex = oldWebView.getData().getIndexOfChapter();
        int pageIndex = oldWebView.getData().getIndexOfPage();
        int pageCount = oldWebView.getData().getChapterVO().getPageCount();
        pageIndex--;
        if(pageIndex < 0)
        {
            pageIndex = 0;
            chapterIndex--;
            if(chapterIndex<0)
            {
                //return the same page
                chapterIndex = 0;
                return null;
            }
            else
            {
                //previous chapter last page
                PageView pageView = new PageView(oldPage.getContext(),_mViewPager);
                MyWebView webView= pageView.getWebView();

                PageVO data = new PageVO();
                data.setChapterVO(_chaptersColl.get(chapterIndex));
                data.setIndexOfChapter(chapterIndex);
                data.setIndexOfPage(-2);

                webView.setData(data);
                return pageView;
            }
        }
        else if(pageIndex <= pageCount-1)
        {
            //same chapter previous page
            PageView pageView = new PageView(oldPage.getContext(),_mViewPager);
            MyWebView webView= pageView.getWebView();

            PageVO data = new PageVO();
            data.setChapterVO(_chaptersColl.get(chapterIndex));
            data.setIndexOfChapter(chapterIndex);
            data.setIndexOfPage(pageIndex);

            webView.setData(data);
            return pageView;
        }
        return oldPage;
    }

    @Override
    public PageView getNextView(PageView oldPage) 
    {
        MyWebView oldWebView = ((PageView)oldPage).getWebView();
        int chapterIndex = oldWebView.getData().getIndexOfChapter();
        int pageIndex = oldWebView.getData().getIndexOfPage();
        int pageCount = oldWebView.getData().getChapterVO().getPageCount();
        pageIndex++;
        if(pageIndex>=pageCount)
        {
            pageIndex=0;
            chapterIndex++;
            if(chapterIndex>=_chaptersColl.size())
            {
                //end of the chapters and pages so return the same page
                chapterIndex--;
                return null;
            }
            else
            {
                //next chapter first page
                PageView pageView = new PageView(oldPage.getContext(),_mViewPager);
                MyWebView webView= pageView.getWebView();

                PageVO data = new PageVO();
                data.setChapterVO(_chaptersColl.get(chapterIndex));
                data.setIndexOfChapter(chapterIndex);
                data.setIndexOfPage(pageIndex);

                webView.setData(data);

                return pageView;
            }
        }
        else
        {
            //next page in same chapter
            PageView pageView = new PageView(oldPage.getContext(),_mViewPager);
            MyWebView webView= pageView.getWebView();

            PageVO data = new PageVO();
            data.setChapterVO(_chaptersColl.get(chapterIndex));
            data.setIndexOfChapter(chapterIndex);
            data.setIndexOfPage(pageIndex);
            //data.setPageCount(pageCount);

            webView.setData(data);

            return pageView;
        }
    }

Нет необходимости использовать какие-либо сторонние библиотеки. Просто нужно тратить много времени на то, чтобы написать каждую свою вещь.

4 голосов
/ 05 апреля 2012

Есть эта библиотека javascript, которая решает проблему нумерации страниц

http://monocle.inventivelabs.com.au/

Этот проект использует его в Android

https://github.com/sharathpuranik/chaek-android

Возьмите исходный код и посмотрите.

4 голосов
/ 15 декабря 2011

Хороший, но в вопросе ... :-)

Я не думаю, что какая-либо логика Page Break для веб-просмотра Android доступна. В соответствии с вашей заботой, WebView является хорошим выбором для отображения файла .epub (вы можете добавить множество функций, таких как выделение, поиск, закладки и т. Д.). И если вы нашли это то, что если размер устройства изменился. Что я делаю, я просто отображаю веб-страницу в веб-просмотре и отключаю прокрутку, затем я могу найти максимальную высоту веб-просмотра и размер экрана устройства (высота и ширина), теперь я поместил две кнопки для следующей и предыдущей страниц, которые просто прокрутка страницы в зависимости от высоты устройства.

Что-то легко .. Попробуйте, если хотите ... (Это моё личное мнение, может быть, я ошибаюсь)

...