WebView 的scrollTo 不起作用

发布于 2025-01-07 22:41:30 字数 733 浏览 1 评论 0原文

我正在尝试使用 webview 的scrollTo 方法。这是我的网络视图布局文件。

<?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> 

我想做的是显示一个 html 文件(只有一个地图图像)并滚动到图像上的特定区域:

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

但是当加载 webview 时,它总是显示图像的 (0, 0) 。

这里的 scrollTo() 有什么问题?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

半世蒼涼 2025-01-14 22:41:30

我怀疑 mapWebView.loadUrl("file:///android_asset/maps/map.html"); 是异步的,所以 mapWebView.scrollTo(300, 300);在 webview 完成加载之前执行。页面加载后,它将丢失您应用的滚动设置,并将重置到顶部。

您需要监听页面加载,然后滚动它:

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);
        }

    }
    );

希望这有帮助

编辑:事实证明这是不可靠的,请改用它:

mapWebView.setPictureListener(new PictureListener() {

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

        }
    });

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);

        }
    });
在巴黎塔顶看东京樱花 2025-01-14 22:41:30

试试这个...:

 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();
}

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();
}
千纸鹤带着心事 2025-01-14 22:41:30
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();
}
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();
}
早茶月光 2025-01-14 22:41:30

遵循覆盖对我来说效果更好。

 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);
 }

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);
 }
坠似风落 2025-01-14 22:41:30

这有点笨拙,但确实有效。在 onPageFinished 中使用带有 DOM 的 javascript 来描述您要从哪里开始。我最初实现它是为了在页面加载后移动到指定的锚点。如果没有锚点,我需要它转到页面顶部,所以我只需查找“html”标签。

        //Perform operations when page finishes loading
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
            if (anchor != null)
                webHelp.loadUrl("javascript:document.getElementById(\"$anchor\").scrollIntoView()")
            else
                webHelp.loadUrl("javascript:document.getElementsByTagName(\"html\")[0].scrollIntoView()")
        }

This is a little kludgy, but it works. Use javascript with DOM in onPageFinished to describe where you want to start. I originally implemented it to move to a specified anchor after the page loaded. If there is no anchor, I need it to go to the top of the page, so I just look for the 'html' tag.

        //Perform operations when page finishes loading
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
            if (anchor != null)
                webHelp.loadUrl("javascript:document.getElementById(\"$anchor\").scrollIntoView()")
            else
                webHelp.loadUrl("javascript:document.getElementsByTagName(\"html\")[0].scrollIntoView()")
        }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文