Android 调用getDrawingCache()时视图太大,无法放入图形缓存

Android 调用getDrawingCache()时视图太大,无法放入图形缓存,android,android-view,Android,Android View,我正在尝试拍摄线性布局内容的屏幕截图。布局包含一个高度/宽度可变的滚动视图。当布局不太大时,此代码可以正常工作(即,不需要在屏幕外滚动太多即可查看所有内容): 但是,如果我试图捕获的LinearLayout很大,则应用程序会在v1.getDrawingCache()上出现空指针而崩溃 logcat中有一个错误: 05-11 13:16:20.999:W/视图(17218):视图太大,无法放入图纸中 缓存,需要4784400字节,只有3932160可用 我怎样才能正确地截图这个布局?有没有另一种不

我正在尝试拍摄线性布局内容的屏幕截图。布局包含一个高度/宽度可变的滚动视图。当布局不太大时,此代码可以正常工作(即,不需要在屏幕外滚动太多即可查看所有内容):

但是,如果我试图捕获的LinearLayout很大,则应用程序会在v1.getDrawingCache()上出现空指针而崩溃

logcat中有一个错误:

05-11 13:16:20.999:W/视图(17218):视图太大,无法放入图纸中 缓存,需要4784400字节,只有3932160可用


我怎样才能正确地截图这个布局?有没有另一种不占用太多内存的方法呢?

以下是我最终能够捕获整个屏幕外大视图的方法:

public static Bitmap loadBitmapFromView(View v) 
{
    Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);

    Canvas c = new Canvas(b);
    v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
    v.draw(c);
    return b;
}

这与答案类似,只是我使用视图的宽度/高度来创建位图

,因为最初的问题是关于滚动视图,我只是想为在获取完整高度时遇到问题的任何人添加以下内容。要获取ScrollView的高度,v.getHeight不起作用,您需要使用:

v.getChildAt(0).getHeight()
因此,完整的问题是:

ScrollView scrollView = (ScrollView) result.findViewById(R.id.ScrlView);

loadBitmapFromView(scrollView);

public static Bitmap loadBitmapFromView(View v) 
{
int height = v.getChildAt(0).getHeight()
int width = v.getWidth()
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}

只需使用v.getHeight即可获得屏幕高度,而不是滚动视图的完整高度。

。kameltreiberI在这里尝试了接受的答案,但是生成的输出有一些问题。这里的答案对我来说是有效的:为了确保它在所有情况下都有效,您还应该在layout()之前调用measure()。只需补充一点,这也适用于完全不可见的视图(可见性==不可见),这就是我的情况。如果我想更改生成位图的尺寸,该怎么办?
ScrollView scrollView = (ScrollView) result.findViewById(R.id.ScrlView);

loadBitmapFromView(scrollView);

public static Bitmap loadBitmapFromView(View v) 
{
int height = v.getChildAt(0).getHeight()
int width = v.getWidth()
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}