版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/miao9999/article/details/84618449
-
截取整个 webview 的内容(包括未显示的部分)
-
在实现之前需要了解几个概念
-
webview.getContentHeight()
Gets the height of the HTML content.
获取到的是 html 内容的高度,但是这个值的单位不是 px,而是 dp,所以不能直接拿来就用,需要先转换成 px,后面再说。
-
webview.getWidth()
Return the width of your view.
这是 view 的方法,返回 view 的宽,高同理
-
没有获取 html 内容宽度的方法,想要获取该值的话需要用 js 去获取。
这几个值了解了实现起来就很简单了, 方法如下
-
-
public Bitmap snapshotView(WebView view){ // 获取屏幕密度,用于把 dp 转成 px float density = getResources().getDisplayMetrics().density; // 创建指定宽高的 bitmap 宽为 webview 的宽,高为 html 的高度(需要转换成 px,否则生成的图片不全) Bitmap temBitmap = Bitmap.createBitmap(view.getWidth(), (int) (view.getContentHeight() * density), Bitmap.Config.ARGB_4444); // 这里要记得把 bipmap 绘制出来,不然显示的图片是空白的 Canvas canvas = new Canvas(temBitmap); view.draw(canvas); return temBitmap; }
除此之外还要在 setContentView() 之前为 webview 设置一个属性
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.enableSlowWholeDocumentDraw(); }
-
-
只截取可视部分,也就是与 view 的大小一样的尺寸
@RequiresApi(api = Build.VERSION_CODES.KITKAT) public Bitmap snapshotView(WebView view){ //设置缓存 view.setDrawingCacheEnabled(true); // 如果手动调用了 buildDrawingCache(),而没有调用 setDrawingCacheEnabled(true),之后应该调用 destroyDrawingCache() 清除缓存 // 有关在兼容模式下自动缩放的注意事项:当不能自动缩放时,该方法会创建一个与 view 大小相同的 bitmap,因为这个 bitmap 会按照父容器的比例去绘制,屏幕上可能会显示缩放控件 // 为了避免这个缩放,应该通过设置为可以自动缩放,这样的话会生成一个与 view 不一样的尺寸的 bitmap,这也意味着你的应用必须能处理这个尺寸 // 当硬件加速开启的时候应该避免调用这个方法,如果不需要绘制缓存 bitmap 的话,开启会增加内存的消耗,并且会导致 view 在软件中呈现一次,因此会影响性能 view.buildDrawingCache(); /*1、从缓存中获取当前屏幕的图片,创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收 如果直接是控件调用buildDrawingCache *是该控件当前显示在屏幕上的部分就不用减去状态栏的高度了 */ // view.getDrawingCache().setHeight(view.getHeight()); Bitmap temBitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, 0, view.getWidth(), view.getHeight()); //禁用DrawingCahce否则会影响性能 ,而且不禁止会导致每次截图到保存的是缓存的位图 view.destroyDrawingCache(); view.setDrawingCacheEnabled(false); return temBitmap; }
-
获取 html 内容的宽度
mWebView.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT"); mWebView.loadUrl(url); mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(final WebView view, String url) { super.onPageFinished(view, url); // 调用 js 方法 mWebView.loadUrl("javascript:window.HTMLOUT.getContentWidth(document.getElementsByTagName('html')[0].scrollWidth);"); } });
class JavaScriptInterface { int webviewContentWidth; @JavascriptInterface public void getContentWidth(String value) { if (value != null) { // 获取到html 的宽度值 webviewContentWidth = Integer.parseInt(value); Log.e("MainActivity", "Result from javascript: " + webviewContentWidth); } } }