安卓Webview只能从页面顶部截取屏幕截图

6
我正在执行一个非常简单的任务,从我的webView中获取截图并转换为位图... 我是这样做的:
webView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(webView.getDrawingCache(false));
webView.setDrawingCacheEnabled(false);
Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);

问题是最终的位图总是显示我的网页内容的顶部!实际上,我需要它从我滚动内容的地方截屏,但这并没有简单地发生!我已经在网上搜索了两个小时,但似乎没有人遇到类似的问题。有什么想法出了什么问题吗?


你是想在webView中明确显示位图吗?还是只是为了看看位图的内容?如果是后者,可以尝试创建第二个可见视图,在其中绘制画布/位图。 - tobyUCT
@tobyUCT 我将稍后把位图保存为SD卡上的PNG文件。我实际上想要用户滚动后的屏幕截图。 - Hadi tavakoli
这里也有同样的问题。如果WebView向下滚动足够远,那么在位图中只会得到一个空白屏幕。这显然是WebView中的一个不幸的错误。 - Slion
4个回答

3

我猜这是在Lollipop上?如果是的话,请确保在你第一次调用setContentView()来填充一个包含WebView的布局之前,调用WebView.enableSlowWholeDocumentDraw() (文档)。


不,这不是关于棒棒糖的问题...我在测试安卓2.3和4.0.2版本时遇到了一个奇怪的问题。 - Hadi tavakoli
2
好的,那么你的WebView有多高? 你需要将WebView的高度设置为“wrap_content”,并将其放置在ScrollView中。 然后,您将获得足够高的WebView以适应您的网页,并且绘制到位图中现在应该输出整个页面。 - Mikhail Naganov

1
实际上,您不需要最后两行。只需将它们删除即可。
webView.setDrawingCacheEnabled(true);  
Bitmap bitmap = Bitmap.createBitmap(webView.getDrawingCache(false));  
webView.setDrawingCacheEnabled(false);

会按照您的需求返回所需的位图,根据我所见。

虽然那些API已经被弃用,但对我来说还是可以用的。不确定他们是否有计划将其移除。 - Slion

0
我遇到了相同的问题,我用以下方式解决:
在调用setContentView()之前首先调用WebView.enableSlowWholeDocumentDraw()。然后对WebView的整个内容进行截屏,再根据所需的滚动偏移量裁剪位图至实际视图大小:
// the minimum bitmap height needs to be the view height
int bitmapHeight = (webView.getMeasuredHeight() < webView.getContentHeight())
         ? webView.getContentHeight() : webView.getMeasuredHeight();

Bitmap bitmap = Bitmap.createBitmap(
         webView.getMeasuredWidth(), bitmapHeight, Bitmap.Config.ARGB_8888);

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

// prevent IllegalArgumentException for createBitmap: 
// y + height must be <= bitmap.height()
int scrollOffset = (scrollTo + webView.getMeasuredHeight() > bitmap.getHeight())
         ? bitmap.getHeight() : scrollTo;

Bitmap resized = Bitmap.createBitmap(
         bitmap, 0, scrollOffset, bitmap.getWidth(), webView.getMeasuredHeight());

0

这对我有用...

首先,在LinearLayout中添加webview..

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layoutWeb"
    >
    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webview"/>
</LinearLayout>

其次,在onCreate()方法中初始化视图...
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    webView = (WebView) findViewById(R.id.webview);
    webLayout = (LinearLayout) findViewById(R.id.layoutWeb);
    ....
 }

第三步,编写一个函数来截取屏幕... 这里,View v1 = webLayout; 指定了我们想要截图的视图。
public void takeScreenshot() {
  try{   
      View v1 = webLayout;
      v1.setDrawingCacheEnabled(true);
      Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
      v1.setDrawingCacheEnabled(false);
      String mPath = Environment.getExternalStorageDirectory().toString() + "/screenshot.jpg";
      File imageFile = new File(mPath);
      FileOutputStream outputStream = new FileOutputStream(imageFile);
      int quality = 100;
      bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
      outputStream.flush();
      outputStream.close();
 } catch(Throwable e) {
       e.printStackTrace();
  }

此代码片段将截取被webLayout遮盖的部分的屏幕截图。上下滚动以聚焦于其他区域并截取webView的屏幕截图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接