Android webview仅从页面顶部截取屏幕截图

时间:2015-07-08 14:10:24

标签: android android-webview webpage-screenshot

我正在做一个非常简单的任务,从我的webView截取到Bitmap的截图...我这样做:

webView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(webView.getDrawingCache(false));
webView.setDrawingCacheEnabled(false);
Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);

问题是最终的位图始终显示在我的网页内容的顶部!我实际上需要它来截取我滚动内容的截图,但这不是简单的发生!我一直在网上搜索两个小时,但似乎没有其他人有类似的问题。什么可能出错?

4 个答案:

答案 0 :(得分:2)

我猜,这是在Lollipop上?如果是这样,请确保在第一次调用使用WebView扩展布局的setContentView()之前调用WebView.enableSlowWholeDocumentDraw()(doc)。

答案 1 :(得分:0)

我遇到了同样的问题,并以下列方式解决了这个问题:

WebView.enableSlowWholeDocumentDraw()之前先呼叫setContentView()。然后截取Web视图全部内容的屏幕截图,然后将位图裁剪为具有所需滚动偏移量的实际视图大小:

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

答案 2 :(得分: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的屏幕截图。

答案 3 :(得分:0)

实际上,您不需要最后两行,只需删除它们即可。

webView.setDrawingCacheEnabled(true);  
Bitmap bitmap = Bitmap.createBitmap(webView.getDrawingCache(false));  
webView.setDrawingCacheEnabled(false);

根据我所见,将返回您所需的位图。