5

我正在尝试对 LinearLayout 的内容进行屏幕截图。布局包含一个可以具有可变高度/宽度的滚动视图。当布局不太大时,此代码可以正常工作(即,您无需滚动太多屏幕即可查看所有内容):

View v1 = (LinearLayout)theLayout;

v1.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);

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

logcat有错误:

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

如何正确截取此布局的屏幕截图?还有另一种不使用太多内存的方法吗?

4

2 回答 2

13

以下是最终让我完整捕获大型屏幕外视图的方法:

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;
}

它类似于这里的答案,除了我使用视图的宽度/高度来创建位图

于 2013-05-11T19:36:29.523 回答
1

由于最初的问题是关于 ScrollView 我只是想为任何在获得完整高度时遇到问题的人添加以下内容。要获取 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 只是获取屏幕高度,而不是 ScrollView 的完整高度。

于 2014-04-06T23:03:31.190 回答