在scrollTo()

时间:2017-02-09 19:21:15

标签: android scroll webview bitmap draw

我正在编写一个应用程序,我需要一个WebView作为Android服务的Web呈现机制。 所以WebView并没有附加到窗口。 但是,通过手动测量和布局视图(ViewGroup),然后将其绘制到位图,我可以生成页面的快照,而无需将其放入视图层次结构中。

问题是,一旦我调用它来滚动(),视图就不会绘制在滚动之前隐藏的页面部分并将其裁剪掉,就像这样

scrolled a bit along x and y axis as well

WebView在使用以下方法

请求页面加载之前很久就已布局
private void layout(
        @NonNull final WebView webView, final int targetWidth, final int targetHeight) {
    webView.measure(
            View.MeasureSpec.makeMeasureSpec(targetWidth, View.MeasureSpec.AT_MOST),
            View.MeasureSpec.makeMeasureSpec(targetHeight, View.MeasureSpec.AT_MOST));

    webView.layout(0, 0, targetWidth, targetHeight);
}

使用以下代码

捕获位图
private Bitmap capture(
        @NonNull final WebView webView) {
    webView.setDrawingCacheEnabled(true);
    webView.buildDrawingCache();

    final Bitmap bitmap = Bitmap.createBitmap(
            webView.getWidth(), webView.getHeight(), Bitmap.Config.ARGB_8888);

    final Canvas canvas = new Canvas(bitmap);
    webView.draw(canvas);

    webView.setDrawingCacheEnabled(false);

    return bitmap;
}

整个程序就像这样

layout(mWebView, maxWidth, maxHeight);
// page is loaded
mWebView.scrollTo(...);
// here I've tried number of things like mWebView.invalidate(), mWebView.requestLayout() or mWebView.refreshDrawableState()
final Bitmap bitmap = capture(mWebView);

重要提示:当我在通常附加到活动窗口的WebView中加载页面时,WebView会在我想要的地方滚动,页面显示得很好。

有什么区别?当它附加到活动窗口时,它与Web对WebView的作用有何不同?

2 个答案:

答案 0 :(得分:1)

我终于找到了根本原因。 我创建位图的机制依赖于WebView启用了绘图缓存并在我的画布上绘制自己的事实。

图形缓存将被启用,但滚动更改后它从未更新,因为只有视图状态发生了变化。

看来,由于我为视图渲染启用了硬件加速,所以我需要做的就是启用绘图缓存,只需在需要新位图时使用它(我甚至不需要使视图无效)目的)我设置滚动位置。

所以解决方案就像:

public void init() {
    mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    mWebView.setDrawingCacheEnabled(true);
    // (layout the view)
}

public void capture(...) {
    mWebView.scrollTo(...);
    final Bitmap capturedBitmap = mWebView.getDrawingCache();
    // do sth with the bitmap
    // ...
}

所以这简单得多。

答案 1 :(得分:0)

试试这个 -

size

它可能会解决您的问题...: - )