视图的屏幕截图与视图的大小不同?
Posted
技术标签:
【中文标题】视图的屏幕截图与视图的大小不同?【英文标题】:Screenshot of a View is not has the same size as the view? 【发布时间】:2020-07-22 08:57:15 【问题描述】:所以,我试图模糊我的ContraintLayout
我采取的方法是什么
-
截取根视图的屏幕截图。
在根视图中添加
ImageView
,布局参数为MATCH_PARENT
和MATCH_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:如何保存视图的屏幕截图以及该视图下方的所有视图?