首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将所有webview内容转换为位图?

如何将所有webview内容转换为位图?
EN

Stack Overflow用户
提问于 2019-05-20 00:32:29
回答 3查看 805关注 0票数 1

我的应用程序生成大的文本字符串,我希望能够允许用户将它们输出为图像,如果他们选择。

我使用webview来显示字符串,因为它允许嵌入锚点,处理长字符串中的新行,并以一种非常整洁简单的方式显示所有内容。

在此之前,我只是简单地将webview转换为位图。这很有效,但现在不再起作用了。我愿意用其他方法来实现我的目标(我是一个免费应用程序的业余爱好开发者,所以如果我错过了一些明显的东西,我很抱歉)

旧的代码保存了网页视图的完整内容,包括屏幕外的内容。新的代码(尽管在相同的代码上是一样的)。问题似乎是webview的高度没有正确报告(如果我加上高度,它就会工作,但由于我不知道字符串的大小,我不能总是预测高度*见下文)

我尝试过PixelShot库,结果也出现了同样的问题。我尝试添加到网页视图的高度时,计算bitmap...this的高度显示了进展,但这并不是一个好的解决办法,因为我们不知道文本块的高度。(字体高度x间隔

听起来不错,但有些句子很长,因此高度会被截断)我试着使用旧的方法,但有些代码被折旧了,我试着在滚动视图中封装webview

代码语言:javascript
复制
    fun displayResults(input:String){

        var visabilityBackground = PreferenceManager.getDefaultSharedPreferences(context).getBoolean("webPageVis",false)
        if (visabilityBackground) {generator_webview.setBackgroundColor(Color.WHITE) }else{generator_webview.setBackgroundColor(Color.TRANSPARENT)}
        generator_webview.loadUrl("about:blank")
        generator_webview.settings.javaScriptEnabled
        generator_webview.loadUrl("about:blank")
        var output=input
            .replace("/n","<br>")
        lastweb=input
            .replace("/n",System.lineSeparator()) // not working....arghhh todo fix later or threaten ide with deletion
        generator_webview.loadData(output,"text/html", "UTF-8")
        Log.d("height","height : "+generator_webview.height)
        Log.d("height","height measured : "+generator_webview.measuredHeight)
        Log.d("height","height content: "+generator_webview.contentHeight)
        Log.d("height","height scroll: "+generator_webview.scrollView().height)
        Log.d("height","height min: "+generator_webview.minimumHeight)
        Log.d("height","height s: "+generator_scrollview.height)
        Log.d("height","height s measured: "+generator_scrollview.measuredHeight)
        Log.d("height","height s min: "+generator_scrollview.minimumHeight)
    }

高度记录的结果总是如下所示:

代码语言:javascript
复制
height: height : 2116
height: height measured : 2116
height: height content: 605
height: height scroll: 0
height: height min: 0
height: height s: 2116
height: height s measured: 2116
height: height s min: 0

这与生成的内容是一行内容还是2页/屏幕内容无关。

(网页视图目前在滚动视图中,因为我读到它可以修复issue....it没有)

生成位图的代码当前为:

代码语言:javascript
复制
    fun screenshot (webView:WebView):Bitmap?{

        try {
            val bitmap = Bitmap.createBitmap(webView.width, webView.height, Bitmap.Config.ARGB_8888)
            val canvas = Canvas(bitmap)
            canvas.drawColor(-0x1)
            webView.draw(canvas)
            return bitmap
        }
        catch (e: Exception) {
            e.printStackTrace()
        }
        return null
    }

这在其他地方调用,传递webview id webView.measuredHeight .contentHeight。

使用以下命令创建with视图:

代码语言:javascript
复制
     <ScrollView
            android:id="@+id/generator_scrollview"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:fillViewport="true"

    app:layout_constraintTop_toBottomOf="@+id/generator_adView" 
   app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="16dp" 
   app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintEnd_toEndOf="parent"

   app:layout_constraintBottom_toTopOf="@id/generator_button_generate"
            android:layout_marginEnd="16dp">
    <WebView

            android:id="@+id/generator_webview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawingCacheQuality="high"
            android:saveEnabled="true">
    </WebView>
    </ScrollView>

我也尝试过在滚动视图中不切分(将其高度和宽度设置为0dp,因为它根据新的指导方针扩展以适应space...as )

预期的结果是一个位图,它包含视图的完整内容,包括屏幕之外的内容。这是一个100%的问题,高度没有得到正确的报告(我使用WebView.enableSlowWholeDocumentDraw(),所以完整的视图是渲染的(如我所示,当我添加了高度,并能够保存一个更高的图像位图与更多的内容shown...It正在渲染的位图只是没有得到正确的高度。

我已经做了3天了,就是想不通。

EN

回答 3

Stack Overflow用户

发布于 2021-10-10 12:15:49

代码语言:javascript
复制
val bitmap = Bitmap.createBitmap(webView.width,webView.height,Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
webView.draw(canvas)
bitmap // Use Your Bitmap Here
票数 1
EN

Stack Overflow用户

发布于 2020-12-12 14:59:38

我们有一个类似的问题,解决方案是将webview放在你问题中提到的ScrollView中,也许在下面的layout_height中有一些不同的东西。

下面是解决我们问题的视图XML:

代码语言:javascript
复制
    <ScrollView android:layout_width="match_parent" android:layout_height="match_parent">
        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:padding="5dp">
            <WebView
                    android:id="@+id/webView"
                    android:layout_gravity="center"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
            </WebView>
       </LinearLayout>
    </ScrollView>
票数 0
EN

Stack Overflow用户

发布于 2019-05-20 01:10:47

实际上,我在side.....seems上的相关链接中找到了一种解决方案,它更像是一种变通的工作,而不是解决方案,但它确实有效,所以我很高兴

代码语言:javascript
复制
fun screenshot (webView:WebView):Bitmap?{
webView.measure(View.MeasureSpec.makeMeasureSpec(
    View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
webView.layout(0, 0, webView.measuredWidth, webView.measuredHeight)

try {
    val bitmap = Bitmap.createBitmap(webView.width, webView.measuredHeight, 
Bitmap.Config.ARGB_8888)
    val canvas = Canvas(bitmap)
    canvas.drawColor(-0x1)
    webView.draw(canvas)
    return bitmap
}
catch (e: Exception) {
    e.printStackTrace()
}
return null
}

这是来自how to get whole content of Web View to generate PDF file in android?

这个改变意味着代码现在可以工作了。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56209840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档