gpt4 book ai didi

java - 如何将 Android View 渲染到 Canvas 而不先渲染它(即没有完整布局)

转载 作者:行者123 更新时间:2023-12-02 08:54:19 26 4
gpt4 key购买 nike

我正在尝试使用 View.draw( Canvas canvas ) 将 View 绘制到外部 Canvas 上。为此, View 必须事先执行完整的布局。

但是,我调用 View.draw( Canvas canvas ) 的原因是,我可以从 View 生成 PdfDocument,同时利用现有小部件,而不是在代码中自定义绘制所有内容。换句话说,在内存中而不是在屏幕上调用 View (及其 subview )的完整布局......如果这有意义的话。

我希望创建一个具有固定高度和宽度的 View (不渲染它),然后将 View 转储到 PdfDocument 页面的 Canvas 。

这可以做到吗?如果可以的话,有什么技巧?

如果不行,有更好的办法吗?

最佳答案

与绘制到屏幕相比,您需要设置布局参数、测量和布局,如 @CommonsWare 所说。

在我的应用程序中,我绘制一个 View 以保存为 PNG 并打印,但您也可以将位图保存为 PDF 文档。

请注意,此技术似乎不适用于滚动的内容,因为您通常只能获得屏幕上显示的内容。

就我而言, ScrollView 中有一个很大的 TableLayout,因此我将 TableLayout 绘制到位图而不是 ScrollView 。

我生成名为 viewTableLayout,然后将其保存为 PNG,我执行以下操作(这可以轻松适应 pdf 文档)

我使用的代码摘录(因为我使用相同的代码在布局后实际绘制到屏幕上,所以我通过 Id 找到了我想要保存到 PNG 的内容)


int tableLayoutId = 1;
float scaleFactor = 0.5f;

TableLayout tableLayout = new TableLayout(DetailedScoresActivity.this);
tableLayout.setId(tableLayoutId);

// More code to fill out the TableLayout

// .....

// Then Need to full draw this view as it has not been shown in the gui
tableLayout.setLayoutParams(new TableLayout.LayoutParams(TabLayout.LayoutParams.WRAP_CONTENT,
TabLayout.LayoutParams.WRAP_CONTENT));
tableLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
tableLayout.layout(0, 0, tableLayout.getMeasuredWidth(), tableLayout.getMeasuredHeight());

Canvas bitmapCanvas = new Canvas();
Bitmap bitmap = Bitmap.createBitmap(Math.round(tableLayout.getWidth() * scaleFactor), Math.round(tableLayout.getHeight() * scaleFactor), Bitmap.Config.ARGB_8888);

bitmapCanvas.setBitmap(bitmap);
bitmapCanvas.scale(scaleFactor, scaleFactor);
tableLayout.draw(bitmapCanvas);

关于java - 如何将 Android View 渲染到 Canvas 而不先渲染它(即没有完整布局),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60582424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com