WebView scrollTo is not working

2020-02-06 00:57发布

I'm trying to use scrollTo method of webview. This my layout file for the webview.

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout  
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:orientation="vertical"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent"   
>  
<WebView  
   android:id="@+id/webMap"  
   android:layout_width="fill_parent"  
   android:layout_height="fill_parent"  
 />  
</LinearLayout> 

What I'm trying to do is showing a html file (which has only a map image) and scrolling to certain area on image with :

mapWebView.loadUrl("file:///android_asset/maps/map.html");
mapWebView.scrollTo(300, 300);

But when the webview is loaded it always shows the (0, 0) of the image.

What is the problem with scrollTo() here?

4条回答
▲ chillily
2楼-- · 2020-02-06 01:25

Try this..:

 try {
webview.setWebChromeClient(new WebChromeClient() {

    @Override
    public void onProgressChanged(WebView view,
            int newProgress) {

        if (newProgress >= 100) {

            webview.scrollTo(x,y);
        }

        super.onProgressChanged(view, newProgress);
    };

});
} catch (Exception e) {
e.printStackTrace();
}
查看更多
一夜七次
3楼-- · 2020-02-06 01:29

I suspect that mapWebView.loadUrl("file:///android_asset/maps/map.html"); is asynchronous, so mapWebView.scrollTo(300, 300); executes before the webview has finished loading. Once the page loads it will have lost the scroll setting you applied and will be reset to the top.

You need to listen in for the the page loading and then scroll it:

mapWebView.setWebViewClient(new WebViewClient(){

        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
            mapWebView.scrollTo(300, 300);
        }

    }
    );

Hope this helps

EDIT: Turns out this is unreliable, use this instead:

mapWebView.setPictureListener(new PictureListener() {

        @Override
        public void onNewPicture(WebView view, Picture picture) {
             mapWebView.scrollTo(300, 300);

        }
    });
查看更多
Melony?
4楼-- · 2020-02-06 01:34

Following override works better for me.

 protected void onLayout(boolean changed, int l, int t, int r, int b) {
 // set initial scroll to
 scrollTo(yourXpos,yourYpos);
 super.onLayout(changed, l, t, r, b);
 }
查看更多
霸刀☆藐视天下
5楼-- · 2020-02-06 01:37
MyViewClient myViewClient = new MyViewClient();


    // Обработка переворачивания экрана и начальная инициализация выбранной темы (ID_TOPIC) в приложении
    if (savedInstanceState != null) {
        // Вторичное создание окна после переворачивания экрана
        scrollTopic = savedInstanceState.getFloat(SCROOL_TOPIC, 0);
    } else {
        // Первый запуск программы до переворачивания экрана
        // Чтение данных с настроек программы
        scrollTopic = sPref.getFloat(SCROOL_TOPIC, 0);
    }

    webView.setWebViewClient(myViewClient);


// Сохранение данных в буфер при переворачивании экрана
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putFloat(SCROOL_TOPIC, getScrollWebView()); // Сохраняем вертикальную прокрутку
    super.onSaveInstanceState(savedInstanceState);
}

// Метод при закрытии окна
@Override
protected void onStop() {
    super.onStop();
    // Сохранение настроек программы в файл настроек
    SharedPreferences.Editor ed = sPref.edit();
    ed.putFloat(SCROOL_TOPIC, getScrollWebView());
    ed.apply();
}

// Класс собственного загрузчика html
public class MyViewClient extends WebViewClient {
    // Переопределение метода окончания загрузки страницы
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        setScrolling();
    }
}

// Установка нужной прокрутки в нашем webView
private void setScrolling() {
    final WebView newView = webView;
    try {
        if (scrollTopic > 0) {
            newView.postDelayed(new Runnable() {
                public void run() {
                    if (newView.getProgress() >= 100) {
                        newView.postDelayed(new Runnable() {
                            public void run() {
                                newView.scrollTo(0, (int) getScrollingFromPercentage());
                                scrollTopic = 0;
                            }
                        }, 10);
                    } else {
                        newView.post(this);
                    }
                }
            }, 1000);
        }
    } catch (Exception ignored) {
    }
}

// Определение процента прокрутки (без умножения на 100)
private float getScrollWebView() {
    return (float) (webView.getScrollY() - webView.getTop()) / webView.getContentHeight();
}

// Определение прокрутки по проценту (без деления на 100)
private float getScrollingFromPercentage() {
    return webView.getTop() + scrollTopic * webView.getContentHeight();
}
查看更多
登录 后发表回答