android - 采取screenshort 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.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 的全貌,而不仅仅是一个可见的部分。那么我能用这段代码做什么呢?
解决方案
这是我复制的代码
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)
}
}
}
并将其保存到文件
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
}
但我想知道为什么不使用 setContentView(webView) 方法就不能将 WebView 转换为位图?
推荐阅读
- prolog - DCG prolog 返回多个变量答案
- c# - 如何检查集合和文档是否存在,如果不存在,则使用 .net 在 FireStore 中创建具有特定 ID 的集合和文档
- vue.js - 如何在 vue.js 中从循环外部获取 v-for 循环数据
- matlab - 在 Matlab 中使用 For-Loop 作为代码
- apache-camel - Camel异步调用获取响应
- android - 使用 RxJava 和 Mockito 创建 android 单元测试不起作用
- python - 如果 dict key[0][value] 中的行得到 key[1][value]
- java - 当值为整数时,将 Double 显示为字符串,忽略小数部分
- kotlin - Kotlin 中的延期任务是什么?
- php - Laravel 5.5 关系采摘在检索子关系时不起作用