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
}