使用 PixelCopy 在 DialogFragment 中复制缩放视图
Using PixelCopy to copy a scaled View within a DialogFragment
我有一个 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)
returns的x和y坐标(84, 84)
当我检查生成的位图时,PixelCopy
捕获了大量的帧、填充、阴影和实际视图内容(右下角缺少一点)。实际内容缺失的部分与我在图像左上角得到的框架、填充和阴影的数量完全相同。
在尝试了我能想到的任何其他方法以获得我要保存的内容的 正确 边界后,我开始向坐标添加 运行dom 值(上面的 offset
值)。在 Nexus 6P 上,112
的偏移是完美的。现在我不能无缘无故地把 112
扔进去,因为 1. 这是一个神奇的数字 2. 它只能在一台设备上工作。
我 运行 不知道如何获得此视图的正确边界或在哪里可以找到此 112
值,以便我可以正确地抵消我所拥有的。
由于该应用尚未发布,我无法包含实际的屏幕截图,但这里有一些经过编辑的屏幕截图(忽略黑条)。
关于截图的一些说明:
- 绿色部分来自
dialog!!.window!!.setBackgroundDrawable(ColorDrawable(0xff00ff00.toInt()))
,因此我可以勾勒出 window 范围。屏幕边缘和绿色矩形之间的 transparent/shadow 位...这是边距还是填充?
- 带有红色(内容 1)和蓝色(内容 2)矩形的白色矩形是进入位图的部分
- 内容中的红色和蓝色矩形是从同一数据生成的不同视图。
- 蓝色部分包含一些
SurfaceView
,我怀疑我必须单独提取它们。
设备截图
捕获的位图(没有 112
幻数偏移)
目前的解决方案是放弃 DialogFragment
并使用常规 Fragment
。检查布局后,有两个 56
像素的填充,没有任何访问器来获取它们的值。我怀疑在 window 中计算视图的位置时,私有装饰视图中某处存在一个错误,该错误不考虑这些填充。
在出现更好的答案之前,我会将其标记为答案。
我有一个 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)
returns的x和y坐标(84, 84)
当我检查生成的位图时,PixelCopy
捕获了大量的帧、填充、阴影和实际视图内容(右下角缺少一点)。实际内容缺失的部分与我在图像左上角得到的框架、填充和阴影的数量完全相同。
在尝试了我能想到的任何其他方法以获得我要保存的内容的 正确 边界后,我开始向坐标添加 运行dom 值(上面的 offset
值)。在 Nexus 6P 上,112
的偏移是完美的。现在我不能无缘无故地把 112
扔进去,因为 1. 这是一个神奇的数字 2. 它只能在一台设备上工作。
我 运行 不知道如何获得此视图的正确边界或在哪里可以找到此 112
值,以便我可以正确地抵消我所拥有的。
由于该应用尚未发布,我无法包含实际的屏幕截图,但这里有一些经过编辑的屏幕截图(忽略黑条)。
关于截图的一些说明:
- 绿色部分来自
dialog!!.window!!.setBackgroundDrawable(ColorDrawable(0xff00ff00.toInt()))
,因此我可以勾勒出 window 范围。屏幕边缘和绿色矩形之间的 transparent/shadow 位...这是边距还是填充? - 带有红色(内容 1)和蓝色(内容 2)矩形的白色矩形是进入位图的部分
- 内容中的红色和蓝色矩形是从同一数据生成的不同视图。
- 蓝色部分包含一些
SurfaceView
,我怀疑我必须单独提取它们。
设备截图
捕获的位图(没有 112
幻数偏移)
目前的解决方案是放弃 DialogFragment
并使用常规 Fragment
。检查布局后,有两个 56
像素的填充,没有任何访问器来获取它们的值。我怀疑在 window 中计算视图的位置时,私有装饰视图中某处存在一个错误,该错误不考虑这些填充。
在出现更好的答案之前,我会将其标记为答案。