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,在计算窗口中视图的位置时,它没有考虑这些填充物。
我会把这个标记为答案,直到有更好的答案出现