【问题标题】:Taking screenshot of Webview (AndroidView) in Jetpack Compose在 Jetpack Compose 中截取 Webview (AndroidView)
【发布时间】:2021-09-30 08:32:15
【问题描述】:

我打算用可组合物替换我项目中的所有片段。剩下的唯一片段是带有WebView 的片段。每当用户单击报告按钮时,我都需要一种方法来获取它的屏幕截图

    
Box(Modifier.fillMaxSize()) {

    Button(
        onClick = this@ViewerFragment::onReportClick,
    )

    AndroidView(factory = { context ->
        MyWebView(context).apply {
            loadDataWithBaseURL(htmlString)
                
            addJavascriptInterface(JavaScriptInterface(), "JsIf")
        }
    }
    )
}

以前;我曾经将webviewview binding 传递给用于捕获屏幕截图的实用程序函数。

fun onReportClick() {
    val screenshot = ImageUtil(requireContext()).getScreenshot(binding.myWvViewer)
    .
    .
}

文档建议“在 AndroidView viewBlock 中构造视图是最佳实践。不要持有或记住 AndroidView 之外的直接视图引用。” 那么最好的方法是什么?

【问题讨论】:

    标签: android kotlin android-view android-jetpack-compose


    【解决方案1】:

    查看this answer,了解如何截取任何撰写视图的屏幕截图。

    如果您需要截取完整网页视图(包括不可见部分)的屏幕截图,恐怕这是您必须存储在 remember 变量中并将其传递给您的处理程序的例外情况:

    var webView by remember { mutableStateOf<WebView?>(null) }
    AndroidView(
        factory = { context ->
            WebView(context).apply {
                // ...
                webView = this
            }
        },
    )
    Button(onClick = {
        onReportClick(webView!!)
    }) {
        Text("Capture")
    }
    

    【讨论】:

    • 感谢您的回答。我目前正在使用似乎工作正常的第二种方法;但是这种方法是否有任何警告,例如内存泄漏的可能性?
    • @Shreyash.K remember 值绑定到视图,当它消失时应该释放。一般来说,它应该可以工作,除非你从包含AndroidView 的视图中移动这个remember,就像将它存储在视图模型中肯定是个坏主意。您应该对其进行测试以确保,如果您发现视图未发布,则可能是一个错误,在这种情况下您应该报告它。 was an issue 根本没有发布AndroidView,不确定最新版本中是否包含修复,所以先在没有remember 的情况下进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2022-10-25
    • 2022-01-07
    相关资源
    最近更新 更多