Android 以安卓为例

Android 以安卓为例,android,webview,Android,Webview,我只是创建了一个简单的网络视图并截图,但结果并不令人满意。下面是我编写的一个简单代码: val webView = WebView(context) var content = this.getContent() // this.getContent() is demo html string webView.loadDataWithBaseURL(null, content, "text/HTML", "UTF-8", null); webView.we

我只是创建了一个简单的网络视图并截图,但结果并不令人满意。下面是我编写的一个简单代码:

val webView = WebView(context)
var content = this.getContent() // this.getContent() is demo html string
webView.loadDataWithBaseURL(null, content, "text/HTML", "UTF-8", null);
webView.webViewClient = object : WebViewClient() {
    override fun onPageFinished(view: WebView, url: String) {
        super.onPageFinished(view, url)
        SystemClock.sleep(1000)
    var data = webView.toBitmap()
    var path = applicationContext.getExternalFilesDir(null).toString() + "/sample.jpg"
    var file = File(path)
    file.writeBitmap(data, Bitmap.CompressFormat.JPEG, 100)
    print("\n absolutePath ${file.path}")

    }
}
///延伸

fun View.toBitmap(): Bitmap {
    this.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    print("\n measuredWidth: ${this.measuredWidth}, measuredHeight: ${this.measuredHeight}")
    val bitmap = Bitmap.createBitmap(this.measuredWidth, this.measuredHeight, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(bitmap)
    this.draw(canvas)
    return bitmap
}

fun Bitmap.toByteArray(): ByteArrayOutputStream {
    val stream = ByteArrayOutputStream()
    this.compress(Bitmap.CompressFormat.JPEG, 100, stream)
    return stream
}

fun File.writeBitmap(bitmap: Bitmap, format: Bitmap.CompressFormat, quality: Int) {
    try {
        var fout = FileOutputStream(this.path)
        bitmap.compress(format, quality, fout)
        fout.flush()
        fout.close()
    } catch (e: Exception) {
        e.printStackTrace();

    }
}


我想拍摄我的网络视图的整个图片,而不仅仅是一个可见的部分。那么我能用这段代码做什么呢?

也许这可以回答你的问题

您正在更改webview的测量尺寸,应该完成绘制循环(测量/布局/绘制)

同时告诉webview不要优化内存使用

尝试在测量之后和绘制之前布局视图

fun View.toBitmap(): Bitmap {

    this.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    print("\n measuredWidth: ${this.measuredWidth}, measuredHeight: ${this.measuredHeight}")
    val bitmap = Bitmap.createBitmap(this.measuredWidth, this.measuredHeight, Bitmap.Config.ARGB_8888)

    this.layout(0, 0, this.measuredWidth, this.measuredHeight)

    // For webView
    (this as? WebView)?.enableSlowWholeDocumentDraw()

    val canvas = Canvas(bitmap)
    this.draw(canvas)
    return bitmap
}

事实上,我从来没有在WebView上测试过这个,但它在我测试过的所有东西上都能正常工作

fun loadWebView() {
        var content = this.getContent()
        var webView = WebView(this)
        webView.loadDataWithBaseURL(null, content, "text/HTML", "UTF-8", null)
        webView.setInitialScale(1)
        webView.settings.javaScriptEnabled = true
        webView.settings.useWideViewPort = true
        webView.settings.javaScriptCanOpenWindowsAutomatically = true
        webView.settings.loadWithOverviewMode = true

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            print("\n=======> enabled scrolled <=========")
            WebView.enableSlowWholeDocumentDraw()
        }
        setContentView(webView)
        print("\n ///////////////// webview setted /////////////////")

        webView.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                Handler().postDelayed( {
                    print("OS Version: ${android.os.Build.VERSION.SDK_INT}")
                    print("\n ================ webview completed ==============")
                    var result = saveWebView(webView)
                    print("result $result")
                }, 1000)

            }
        }
    }
这是我得到的结果。


但我想知道为什么我不能在不使用方法setContentView(WebView)的情况下将WebView转换为位图?

这是否回答了您的问题?来自Ref:它说这是一个公共静态方法,所以我测试了它,它不起作用。你有任何片段吗,这样我就可以知道了。我想链接的问题可能有一些信息,正如我说的,我从来没有在WebView上做过这样的事情好吧,我知道了。那么,您有什么建议将html内容捕获到位图中吗?
fun saveWebView(webView: WebView): Boolean {
        var data = webView.toBitmap()
        var path = this.applicationContext.getExternalFilesDir(null).toString() + "/sample.jpg"
        var file = File(path)
        file.writeBitmap(data, Bitmap.CompressFormat.JPEG, 100)
        return true
    }