WebView получить максимальную ширину прокрутки
Здравствуйте ребята я создаю epub reader и загрузил книгу в android webview а также заставил webview двигаться горизонтально, ссылаясь на это но теперь я хочу, чтобы webview двигался как страницы, поэтому я хочу сделать это таким образом 1.вычислите общую ширину горизонтального скролла и ширину экрана, теперь разделите их, чтобы получить общее количество страниц 2.заблокируйте прокрутку webview и ,когда когда-либо пользователь проводит пальцем, установите прокрутку webview на screenwidth*swipeCount
Теперь проблема в том, когда я пытаюсь получить totalHorizontalScrollWidth это дает ширину экрана я пробовал эти способы, но оба дают тот же результат
FirstMethod
ViewTreeObserver vto = webView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
webView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
Log.e("ScrollWidth",""+webView.getMeasuredWidth());
Toast.makeText(getApplicationContext(), "new Width is"+webView.getMeasuredWidth(), Toast.LENGTH_SHORT).show();
}
});
Возврат ширины экрана 480
И Метод
public class WebViewWidth extends WebView {
public WebViewWidth(Context context) {
super(context);
}
public WebViewWidth(Context context, AttributeSet attrs) {
super(context, attrs);
}
public int getContentWidth()
{
return this.computeHorizontalScrollRange();
}
public int getContentHeight()
{
return this.computeVerticalScrollRange();
}
}
И использовал этот webView для получения computeHorizontalScrollRange, как это
private class MyWebViewClient extends WebViewClient {
private Context mContext;
public MyWebViewClient(Context context) {
this.mContext = context;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
mProgressDialog.dismiss();
final WebView myWebView = (WebView) 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() / mContext.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);
super.onPageFinished(view, url);
int widthis = webView.getContentWidth();
Toast.makeText(getApplicationContext(), "Width is"+widthis, Toast.LENGTH_SHORT).show();
Log.i("WidthTotoal Scroll", ""+widthis);
}
}
Даже это дает результат в виде 480, который является размером экрана
Я также наткнулся на этот скрипт, но не знаю, как получить значения из этого скрипта на android
String js = ""+
"var desiredHeight;"+
" var desiredWidth;"+
" var bodyID = document.getElementsByTagName('body')[0];"+
" totalHeight = bodyID.offsetHeight;"+
"pageCount = Math.floor(totalHeight/desiredHeight) + 1;"+
" bodyID.style.padding = 10;"+ //(optional) prevents clipped letters around the edges
" bodyID.style.width = desiredWidth * pageCount;"+
" bodyID.style.height = desiredHeight;"+
" bodyID.style.WebkitColumnCount = pageCount;";
Кто-нибудь, пожалуйста помогите мне получить максимальную ширину горизонтальной прокрутки webview или какой-то альтернативный эффект, например, переворачивание страниц.
2 ответа:
Я думаю, что я довольно поздно, но благодаря этому я смог реализовать плавную горизонтальную анимацию салфетки в WebView.
Переходя к вашему первоначальному вопросу, где вы хотели получить общую ширину html-страницы, в моем решении я использовал WebChromeClients onJsAlert () метод, в котором вы можете получить возвращаемые значения из javascript. Я использую этот метод, чтобы получить количество горизонтальных страниц.В моей основной активности.java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); } wv = (HorizontalWebView) findViewById(R.id.web_view); wv.getSettings().setJavaScriptEnabled(true); wv.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url) { injectJavascript(); } }); wv.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { int pageCount = Integer.parseInt(message); wv.setPageCount(pageCount); result.confirm(); return true; } }); wv.loadUrl("file:///android_asset/ch03.html"); } private void injectJavascript() { String js = "function initialize(){\n" + " var d = document.getElementsByTagName('body')[0];\n" + " var ourH = window.innerHeight;\n" + " var ourW = window.innerWidth;\n" + " var fullH = d.offsetHeight;\n" + " var pageCount = Math.floor(fullH/ourH)+1;\n" + " var currentPage = 0;\n" + " var newW = pageCount*ourW;\n" + " d.style.height = ourH+'px';\n" + " d.style.width = newW+'px';\n" + " d.style.margin = 0;\n" + " d.style.webkitColumnCount = pageCount;\n" + " return pageCount;\n" + "}"; wv.loadUrl("javascript:" + js); wv.loadUrl("javascript:alert(initialize())"); }
Я использую javascript: alert (initialize ()) для выполнения функции javascript, в которой я возвращаю количество горизонтальных страниц, которые были созданы. который я затем передаю в пользовательский WebView.
HorizontalWebView.java
public class HorizontalWebView extends WebView { private float x1 = -1; private int pageCount = 0; public HorizontalWebView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: x1 = event.getX(); break; case MotionEvent.ACTION_UP: float x2 = event.getX(); float deltaX = x2 - x1; if (Math.abs(deltaX) > 100) { // Left to Right swipe action if (x2 > x1) { turnPageLeft(); return true; } // Right to left swipe action else { turnPageRight(); return true; } } break; } return true; } private int current_x = 0; private void turnPageLeft() { if (getCurrentPage() > 0) { int scrollX = getPrevPagePosition(); loadAnimation(scrollX); current_x = scrollX; scrollTo(scrollX, 0); } } private int getPrevPagePosition() { int prevPage = getCurrentPage() - 1; return (int) Math.ceil(prevPage * this.getMeasuredWidth()); } private void turnPageRight() { if (getCurrentPage() < pageCount - 1) { int scrollX = getNextPagePosition(); loadAnimation(scrollX); current_x = scrollX; scrollTo(scrollX, 0); } } private void loadAnimation(int scrollX) { ObjectAnimator anim = ObjectAnimator.ofInt(this, "scrollX", current_x, scrollX); anim.setDuration(500); anim.setInterpolator(new LinearInterpolator()); anim.start(); } private int getNextPagePosition() { int nextPage = getCurrentPage() + 1; return (int) Math.ceil(nextPage * this.getMeasuredWidth()); } public int getCurrentPage() { return (int) (Math.ceil((double) getScrollX() / this.getMeasuredWidth())); } public void setPageCount(int pageCount) { this.pageCount = pageCount; } }
Вы можете найти полное рабочее решение здесь
Я понял проблему, и решение состояло в том, чтобы держать таймер обратного отсчета и давать задержку в 1 сек перед вычислением ширины
Вот как я это сделал
@Override public void onPageFinished(final WebView view, String url) { final WebView myWebView = (WebView) 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() / mContext.getResources().getDisplayMetrics().density) + "px; -webkit-column-gap: 0px; -webkit-column-width: " + myWebView.getMeasuredWidth() + "px;')"; String js = ""+ "var desiredHeight;"+ " var desiredWidth;"+ " var bodyID = document.getElementsByTagName('body')[0];"+ " totalHeight = bodyID.offsetHeight;"+ "pageCount = Math.floor(totalHeight/desiredHeight) + 1;"+ " bodyID.style.padding = 10;"+ //(optional) prevents clipped letters around the edges " bodyID.style.width = desiredWidth * pageCount;"+ " bodyID.style.height = desiredHeight;"+ " bodyID.style.WebkitColumnCount = pageCount;"+ "function getPagesCount() {"+ " android.getPagesCount(pageCount);"+ " };"; myWebView.loadUrl("javascript:" + varMySheet); myWebView.loadUrl("javascript:" + addCSSRule); myWebView.loadUrl("javascript:" + insertRule1); view.setVisibility(View.VISIBLE); super.onPageFinished(view, url); CountDownTimer test= new CountDownTimer(3000,1000) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { int widthis = webView.getContentWidth(); TotalScrollWidth=widthis; Log.i("WidthTotoal Scroll", ""+widthis); TotalPages= (TotalScrollWidth/ScreenWidth)-1; Toast.makeText(getApplicationContext(), "Total Pages are" +TotalPages, 100).show(); progressPages.setMax(TotalPages); progressdialog.dismiss(); } }; test.start(); }