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

Android 使用PixelCopy在DialogFragment中复制缩放视图,android,android-view,android-pixel-copy,Android,Android View,Android Pixel Copy,我有一个DialogFragment,它在onCreateDialog中创建了一个带有自定义视图的AlertDialog。自定义视图包括一个旋转进度条和一个提示以及一个大视图(大于屏幕尺寸),该视图通过scaleX和scaleY值安装在自定义内容中 我正在使用PixelCopyAPI将大视图复制到位图中。这很有效,但有一个相当恼人的警告: 我这样调用PixelCopy: val winloc = intArrayOf(0, 0) view.getLocationOnScreen(winloc)

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

我正在使用
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)
返回
(84,84)

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

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

关于如何获得此视图的正确边界,或者在何处可以找到此
112
值,以便正确抵消现有值,我已经没有什么想法了

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

关于屏幕截图的一些注释:

  • 绿色部分来自
    对话框!!。窗口!!。setBackgroundDrawable(ColorDrawable(0xff00ff00.toInt())
    这样我就可以勾勒出窗口边界。屏幕边缘和绿色矩形之间的透明/阴影位。。。这是空白还是空白
  • 带有红色(内容1)和蓝色(内容2)矩形的白色矩形是指向位图的部分
  • 内容中的红色和蓝色矩形是从相同数据生成的不同视图
  • 蓝色部分包含一些我怀疑必须单独提取的
    SurfaceView
    s
设备截图

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

到目前为止,解决方案是放弃
对话框Fragment
,使用常规的
片段。检查布局后,有两个
56
像素的填充,没有任何访问器来获取它们的值。我怀疑在私人装饰视图中的某个地方有一个bug,在计算窗口中视图的位置时,它没有考虑这些填充物。 我会把这个标记为答案,直到有更好的答案出现