WebView получить максимальную ширину прокрутки
Здравствуйте, ребята, я создаю epub reader и загрузил книгу в android webview, а также сделал webview для горизонтального перемещения, ссылаясь на это, но теперь я хочу, чтобы webview двигался как страницы, поэтому я хочу сделать это 1. рассчитать общую ширину горизонтального прокрутки и экран ширину, теперь разделите их, чтобы получить общее количество страниц. 2. заблокируйте прокрутку веб-просмотра, а когда пользователь перелистывает, установите прокрутку веб-просмотра на screenwidth*swipeCount
Теперь проблема в том, что когда я пытаюсь получить totalHor HorizontalScrollWidth, он дает ширину экрана, я пробовал эти способы, но оба дают одинаковый результат.
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();
}
}
и использовал этот веб-вид, чтобы получить computeHor HorizontalScrollRange, как это
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;";
кто-то, пожалуйста, помогите мне получить максимальную ширину горизонтальной прокрутки веб-просмотра или какой-нибудь другой вариант, чтобы получить эффект, как перелистывание страниц.
2 ответа
Я понял проблему, и решение состояло в том, чтобы сохранить таймер обратного отсчета и дать задержку в 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();
}
Я думаю, что я довольно поздно, но благодаря этому я смог реализовать плавную горизонтальную анимацию смахивания в WebView.
Возвращаясь к вашему первоначальному вопросу, где вы хотели получить общую ширину html-страницы, в своем решении я использовал метод onCsAlert() WebChromeClients, в котором вы можете получить возвращаемые значения из javascript. Я использую этот метод, чтобы получить количество горизонтальных страниц.
В моем MainActivity.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, в которой я возвращаю количество созданных горизонтальных страниц. который я потом перехожу на Custom 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;
}
}
Вы можете найти полное рабочее решение здесь