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