使用 PixelCopy 在 DialogFragment 中复制缩放视图

Using PixelCopy to copy a scaled View within a DialogFragment

我有一个 DialogFragment,它在 onCreateDialog 中创建了一个带有自定义视图的 AlertDialog。自定义视图包括旋转进度条和提示以及通过 scaleXscaleY 值适合自定义内容的大视图(大于屏幕尺寸)。

我正在使用 PixelCopy API 仅将大视图复制到位图中。这很好用,但有一个相当烦人的警告:

我这样称呼PixelCopy

val winloc = intArrayOf(0, 0)
view.getLocationOnScreen(winloc)

val offset = 0
val left = winloc[0] + offset
val top = winloc[1] + offset
val rect = Rect(left, top, left + view.measuredWidth, top + view.measuredHeight)
PixelCopy.request(getDialog().getWindow(), rect, bitmap, listener, view.handler)

view.getLocationOnScreen(winloc)returns的x和y坐标(84, 84)

当我检查生成的位图时,PixelCopy 捕获了大量的帧、填充、阴影和实际视图内容(右下角缺少一点)。实际内容缺失的部分与我在图像左上角得到的框架、填充和阴影的数量完全相同。

在尝试了我能想到的任何其他方法以获得我要保存的内容的 正确 边界后,我开始向坐标添加 运行dom 值(上面的 offset 值)。在 Nexus 6P 上,112 的偏移是完美的。现在我不能无缘无故地把 112 扔进去,因为 1. 这是一个神奇的数字 2. 它只能在一台设备上工作。

我 运行 不知道如何获得此视图的正确边界或在哪里可以找到此 112 值,以便我可以正确地抵消我所拥有的。

由于该应用尚未发布,我无法包含实际的屏幕截图,但这里有一些经过编辑的屏幕截图(忽略黑条)。

关于截图的一些说明:

设备截图

捕获的位图(没有 112 幻数偏移)

目前的解决方案是放弃 DialogFragment 并使用常规 Fragment。检查布局后,有两个 56 像素的填充,没有任何访问器来获取它们的值。我怀疑在 window 中计算视图的位置时,私有装饰视图中某处存在一个错误,该错误不考虑这些填充。 在出现更好的答案之前,我会将其标记为答案。