Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不首先渲染的情况下将android视图渲染到画布(即,不使用完整布局)_Java_Android_Canvas - Fatal编程技术网

Java 如何在不首先渲染的情况下将android视图渲染到画布(即,不使用完整布局)

Java 如何在不首先渲染的情况下将android视图渲染到画布(即,不使用完整布局),java,android,canvas,Java,Android,Canvas,我正在尝试使用view.draw(canvas canvas)将视图绘制到外部画布上。要使其工作,视图必须事先执行完整布局 但是,我调用View.draw(Canvas Canvas)的原因是,我可以从视图生成PdfDocument,同时利用现有的小部件,而不是自定义绘制代码中的所有内容。换句话说,在内存中而不是在屏幕上调用视图(及其子视图)的完整布局。。。如果这有意义的话 我希望创建一个具有固定高度和宽度的视图(不渲染),然后将视图转储到PdfDocument页面的画布上 能做到这一点吗?如果

我正在尝试使用
view.draw(canvas canvas)
将视图绘制到外部画布上。要使其工作,视图必须事先执行完整布局

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

我希望创建一个具有固定高度和宽度的视图(不渲染),然后将视图转储到PdfDocument页面的画布上

能做到这一点吗?如果可以,诀窍是什么


如果没有,有没有更好的方法?

与屏幕绘图相比,您需要按照@commonware的说法设置布局参数、测量和布局

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

注意:这种技术似乎不能很好地处理滚动的内容,因为您通常只能获得屏幕上显示的内容

在我的例子中,我在scrollview中有一个很大的TableLayout,所以我将TableLayout绘制到位图,而不是scrollview

我生成名为
view
TableLayout
,然后要保存到PNG,我执行以下操作(这可以很容易地适应pdf数据)

提取我使用的代码(因为我使用相同的代码来实际绘制屏幕,一旦它被布置好,我就可以通过Id找到我想要保存到PNG的内容)


int tableLayoutId=1;
浮动比例因子=0.5f;
TableLayout TableLayout=新的TableLayout(DetailedScoresActivity.this);
tableLayout.setId(tableLayoutId);
//更多用于填写TableLayout并将其作为“视图”返回的代码`
// .....
//然后需要完全绘制此视图,因为它尚未显示在gui中
view.setLayoutParams(新的TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_内容,
TabLayout.LayoutParams.WRAP_CONTENT);
view.measure(view.MeasureSpec.makeMeasureSpec(0,view.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED));
布局(0,0,view.getMeasuredWidth(),view.getMeasuredHeight());
TableLayout TableLayout=view.findViewById(tableLayoutId);
Canvas bitmapCanvas=新画布();
位图Bitmap=Bitmap.createBitmap(Math.round(tableLayout.getWidth()*scaleFactor)、Math.round(tableLayout.getHeight()*scaleFactor)、Bitmap.Config.ARGB_8888);
bitmapCanvas.setBitmap(位图);
scale(scaleFactor,scaleFactor);
tableLayout.draw(位图画布);

IIRC,在
视图上调用
measure()
layout()
。真棒,伙计。因为我的自定义视图没有父视图,也没有显示,所以我通过指定精确的维度并使用makeMeasureSpec使用
view.MeasureSpec.justice
使您的代码片段(与我的代码混合)正常工作。。。