视图的屏幕截图与视图的大小不同?

Posted

技术标签:

【中文标题】视图的屏幕截图与视图的大小不同?【英文标题】:Screenshot of a View is not has the same size as the view? 【发布时间】:2020-07-22 08:57:15 【问题描述】:

所以,我试图模糊我的ContraintLayout 我采取的方法是什么

    截取根视图的屏幕截图。 在根视图中添加ImageView,布局参数为MATCH_PARENTMATCH_PARENT。 模糊该屏幕截图 将屏幕截图位图设置为此ImageView

但它没有按预期工作。任何帮助将不胜感激。

这是我正在使用的一些相关代码。

override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val imageView = ImageView(this)
        val param = ConstraintLayout.LayoutParams(
            ConstraintLayout.LayoutParams.MATCH_PARENT,
            ConstraintLayout.LayoutParams.MATCH_PARENT
        )
        imageView.layoutParams = param
        val bit = convertViewToBitmap(root)
        val blurred = blur(bit,25F)
        imageView.setImageBitmap(blurred)
        root.addView(imageView)
    

获取视图的屏幕截图

private fun convertViewToBitmap(view: View): Bitmap 
        val spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
        view.measure(spec, spec)
        view.layout(0, 0, view.measuredWidth, view.measuredHeight)
        val b = Bitmap.createBitmap(view.measuredWidth, view.measuredHeight,
            Bitmap.Config.ARGB_8888)
        val c = Canvas(b)
        //c.translate((-view.scrollX).toFloat(), (-view.scrollY).toFloat())
        view.draw(c)
        return b
    

模糊该屏幕截图

 var times = 0

    fun blur(bitmap: Bitmap, radius: Float): Bitmap? 
        val renderScript = RenderScript.create(this)
        val blurredBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true)
        val input: Allocation = Allocation.createFromBitmap(
            renderScript,
            blurredBitmap,
            Allocation.MipmapControl.MIPMAP_FULL,
            Allocation.USAGE_SHARED
        )
        val output: Allocation = Allocation.createTyped(renderScript, input.type)
        // Load up an instance of the specific script that we want to use.
        ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)).apply 
            setInput(input)
            setRadius(radius)
            forEach(output)
        
        output.copyTo(blurredBitmap)
        if (times < 5) 
            times += 1
            blur(blurredBitmap, radius)
        
        return blurredBitmap
    

这是 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:background="@android:color/white"
    android:layout_
    android:layout_
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_
        android:layout_
        android:text="Hello World!"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.20" />

</androidx.constraintlayout.widget.ConstraintLayout>

这是结果

【问题讨论】:

究竟是什么问题,截取屏幕截图,模糊它,或将其位图设置为 ImageView? @afhamu 检查更新。 所以您希望模糊视图与原始视图大小相同? @afhamu 是的,我希望你好世界变得模糊。这只是一个示例,在该根视图中会有很多视图。 【参考方案1】:

而不是截取视图并将其模糊。试试这个:

    使用BlueMaskFilter模糊TextView

     float radius = yourTextView.getTextSize() / 3; 
     BlurMaskFilter filter = new BlurMaskFilter(radius, BlurMaskFilter.Blur.NORMAL);
     yourTextView.getPaint().setMaskFilter(filter);
    

    将模糊的TextView 转换为BitMap 并将其设置为ImageView 位图

【讨论】:

问题是我以文本视图为例。它可能有多个视图。

以上是关于视图的屏幕截图与视图的大小不同?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何保存视图的屏幕截图以及该视图下方的所有视图?

共享 SwiftUI 视图的屏幕截图导致崩溃

使用我的应用程序当前视图的 ShareActionProvider 共享屏幕截图

根布局的屏幕截图,即滚动视图

整个屏幕的 Swift iOS 屏幕截图,包括拆分视图

如何捕获当前视图屏幕截图并在代码中重用? (iPhone SDK)