当前位置: 移动技术网 > IT编程>移动开发>Android > android中Webview实现截屏三种方式小结

android中Webview实现截屏三种方式小结

2019年07月24日  | 移动技术网IT编程  | 我要评论

快乐大本营吴尊,虎扑nba直播,大唐帝国游戏

本人最近学习了android中webview实现截屏三种方式,下面我来记录一下,有需要了解的朋友可参考。希望此文章对各位有所帮助。

第一种方式

通过调用webview.capturepicture(),得到一个picture对象,根据图像的宽和高创建一个bitmap,再创建一个canvas,绑定bitmap,最后用picture去绘制。

//获取picture对象
picture picture = wv_capture.capturepicture();
//得到图片的宽和高(没有reflect图片内容)
int width = picture.getwidth();
int height = picture.getheight();
if (width > 0 && height > 0) {
  //创建位图
  bitmap bitmap = bitmap.createbitmap(width, height, bitmap.config.argb_8888);
  canvas canvas = new canvas(bitmap);
  //绘制(会调用native方法,完成图形绘制)
  picture.draw(canvas);

}

这种方式可以获取webview中已加载的所有数据图像,也就是长截屏的效果。这种方式在android 4.4以下是没有问题的,但是在5.0以上就行不通了。capturepicture()方法在4.4中废弃掉了,官方建议使用ondrow()方法来获取webview的bitmap快照。具体实现如下:

//获取webview缩放率
float scale = wv_capture.getscale();
//得到缩放后webview内容的高度
int webviewheight = (int) (wv_capture.getcontentheight()*scale);
bitmap bitmap = bitmap.createbitmap(wv_capture.getwidth(),webviewheight, bitmap.config.argb_8888);
canvas canvas = new canvas(bitmap);
//绘制
wv_capture.draw(canvas);

但是此时在5.0+上会发现,截取的快照只显示了webview中显示出来的那部分,没有显示出来的部分是空白的。通过google找到了原因,在5.0+版本上,android对webview做了优化,旨在减少内存占用以提高性能。因此在默认情况下会智能的绘制html中需要绘制的部分,其实就是当前屏幕展示的html内容,因此会出现未显示的图像是空白的。解决办法是调用enableslowwholedocumentdraw()方法。这个方法需要在webview创建之前调用,在activity里就是在setcontentview前去调用,此方法会有显著的性能开销。

这里需要注意的是在传递webview的高度时,是通过缩放率计算的,这样就会算出绘制整个已加载的html内容所需的高度。如果没有这个缩放率,那么得到的快照就仅仅是这个html内容最上面的那一段。还有一个问题就是在5.0+系统上得到快照比较模糊,在其他版本上没有问题,不知道原因何在?

第二种方式

利用view的缓存功能。android为了提高滚动等各方面的绘制速度,可以为每一个view建立一个缓存,使用 view.builddrawingcache为自己的view建立相应的缓存, 这个cache就是一个bitmap对象。利用这个功能可以对整个屏幕视图进行截屏并生成bitmap,也可以 获得指定的view的bitmap对象。

因此对于webview来说也可以使用这种方式,在使用getdrawingcache()方法获取bitmap对象前,先开启webview的缓存功能.

webview.setdrawingcacheenabled(true);
...
bitmap bitmap = webview.getdrawingcache();

需要注意的是,在上述情况下,这个缓存bitmap对象只有一个,因此每次获取的bitmap指向的是同一块地址空间的缓存对象,如果在使用完bitmap后就立即回收掉这个对象,那么再次获取当前view的缓存对象时就会得到null。所以要在activity销毁时进行回收,所以开启缓存的话会有性能开销。

第三种方式

比较简单,通过获取当前window的decorview,然后绘制bitmap对象。

view view = context.getwindow().getdecorview();
bitmap bitmap = bitmap.createbitmap(view.getwidth(), view.getheight(), bitmap.config.argb_8888);
canvas canvas = new canvas(bitmap);
view.draw(canvas);
保存到文件

try {
  string filename = environment.getexternalstoragedirectory().getpath()+"/webview_capture4.jpg";
  fileoutputstream fos = new fileoutputstream(filename);
  //压缩bitmap到输出流中
  bitmap.compress(bitmap.compressformat.jpeg, 70, fos);
  fos.close();
  toast.maketext(webviewfromgetdecorview.this, "截屏成功", toast.length_long).show();
  } catch (exception e) {
    log.e(tag, e.getmessage());
  }finally {
    if(bitmap!=null) {
      bitmap.recycle();
    }

  }

具体demo猛戳这里:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网