Сделать книгу epub в андроиде?
Я пытаюсь показать книгу EPUB в Android Pad. Я могу разобрать html и css, чтобы показать содержание и формат книги, возможно, в книгу включены картинки. Кажется, у меня есть два варианта:
- использовать Webview.
- Напишите представление клиента, чтобы он мог отображать html / css - это кажется очень сложной задачей.
Какой хороший способ? Если мне нужно использовать WebView, как насчет логики разрыва страницы, так как веб-просмотр анализирует один HTML-файл на одной странице, я не могу найти разрыв страницы в веб-просмотре.
3 ответа
Хороший, но в вопросе...:-)
Я не думаю, что какая-либо логика Page Break для веб-просмотра Android доступна. По вашему мнению, WebView - хороший выбор для отображения файла.epub (вы можете добавить множество функций, таких как выделение, поиск, закладки и т. Д.). И если вы нашли это то, что если размер устройства изменился. Что я делаю, я просто отображаю веб-страницу в веб-просмотре и отключаю прокрутку, затем я могу найти максимальную высоту веб-просмотра и размер экрана устройства (высота и ширина), теперь я поставил две кнопки для следующей и предыдущей страниц, которые просто прокрутка страницы в зависимости от высоты устройства.
Что-то легкое.. Попробуй это, если хочешь... (Это моё личное мнение, может я ошибаюсь)
Я разработал родной 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;
}
}
Нет необходимости использовать какие-либо сторонние библиотеки. Просто нужно тратить много времени на то, чтобы написать каждую вещь самостоятельно.
Есть эта библиотека JavaScript, которая заботится о проблеме нумерации страниц
http://monocle.inventivelabs.com.au/
Этот проект использует его в Android
https://github.com/sharathpuranik/chaek-android
Возьмите исходный код и посмотрите.