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

android中Webview实现截屏三种方式小结,第1张

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

本人最近学习了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猛戳这里: WebviewCapture_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的android中Webview实现截屏三种方式小结全部内容,希望文章能够帮你解决android中Webview实现截屏三种方式小结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存