在画布上绘制片段视图

Posted

技术标签:

【中文标题】在画布上绘制片段视图【英文标题】:Draw a fragments view on a canvas 【发布时间】:2020-04-18 12:20:59 【问题描述】:

我正在尝试将片段的视图绘制到画布上以将其导出为图像。 我尝试按照以下问题进行操作:android: Draw a view on canvas 并设法在画布上绘制了一个膨胀的视图,但是当我尝试在其上绘制片段视图时,它会弄乱布局。

这是我的片段宿主:

<FrameLayout
        android:layout_
        android:layout_
        android:visibility="invisible"
        tools:ignore="PxUsage"
        android:id="@+id/fragment_host"/>

这就是我在画布上绘制的方式

supportFragmentManager.beginTransaction()
        .replace(R.id.fragment_host, MyTrackViewerFragment().apply 
            onCreateControls = 

                bitmap = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888)
                val canvas = Canvas(bitmap)

                it.apply 
                    layoutParams = LinearLayout.LayoutParams(1000, 1000)
                    measure(measuredWidth, measuredHeight)
                    layout(0, 0, 1000, 1000)
                    draw(canvas)
                

                findViewById<ImageView>(R.id.preview).setImageBitmap(bitmap)
                ImageView.ScaleType.CENTER_CROP
                supportFragmentManager.beginTransaction().remove(this).commit()
            
        )
        .commit()

这是结果(黑色方块是预览图像视图):

fragment宿主中的fragment在调用measure和layout方法后也能正确绘制。

不同的片段给出类似的结果(正方形是预览图像视图):

我错过了什么?

编辑:似乎layout(0, 0, 1000, 1000) 弄乱了布局,但我找不到原因

【问题讨论】:

【参考方案1】:

发现问题出在RelativeLayoutmatch_parentwrap_content 的使用上。看起来它没有正确布局,因此视图在 Fragment 中看起来有些正确,但在手动测量时却不正确。

通过将 RelativeLayout 包装在 LinearLayout 中并为未对齐的元素提供固定大小(px 或 dp),它终于奏效了!

【讨论】:

【参考方案2】:

也许这些视图是硬件加速的。尝试改用PixelCopy。

【讨论】:

以上是关于在画布上绘制片段视图的主要内容,如果未能解决你的问题,请参考以下文章

调度触摸事件到画布上绘制的视图

在画布上绘制视图被拖动的任何位置

如何在Android屏幕上识别视图移动?

将图片绘制到视图的画布上啥都不做

在画布上绘制位图已缩放

Android视图不响应绘制