我想在我的应用程序中创建一个完整的listview的位图(这反过来将被转换为。png文件)。但是当我从listview子视图中获得位图时,我得到一个
java.lang.IllegalArgumentException: bitmap size exceeds 32bits
是否有可能重写此行为?或者以一种不会被抛出的方式执行?
我问的原因是我想在我的网站上有这个列表的图片,截图将是一个非常繁琐的过程(列表中有400多个项目,一次有6个在屏幕上可见)
根据请求,这里是我正在运行的代码来创建位图atm:
public static Bitmap getWholeListViewItemsToBitmap() {
ListView listview = getListView();
ListAdapter adapter = listview.getAdapter();
int itemscount = adapter.getCount();
int allitemsheight = 0;
List<Bitmap> bmps = new ArrayList<Bitmap>();
for (int i = 0; i < itemscount; i++) {
View childView = adapter.getView(i, null, listview);
childView.measure(MeasureSpec.makeMeasureSpec(listview.getWidth(), MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());
childView.setDrawingCacheEnabled(true);
childView.buildDrawingCache();
bmps.add(childView.getDrawingCache());
allitemsheight+=childView.getMeasuredHeight();
}
Bitmap bigbitmap = Bitmap.createBitmap(listview.getMeasuredWidth(), allitemsheight, Bitmap.Config.ARGB_8888);
Canvas bigcanvas = new Canvas(bigbitmap);
Paint paint = new Paint();
int iHeight = 0;
for (int i = 0; i < bmps.size(); i++) {
Bitmap bmp = bmps.get(i);
bigcanvas.drawBitmap(bmp, 0, iHeight, paint);
iHeight+=bmp.getHeight();
bmp.recycle();
bmp=null;
}
return bigbitmap;
}
这里是抛出的异常(请注意,这是我得到的,Android Studio不为我工作,我所能保存的是一半的堆栈跟踪)
E/AndroidRuntime(375): FATAL EXCEPTION: main
E/AndroidRuntime(375): java.lang.IllegalArgumentException: bitmap size exceeds 32bits
E/AndroidRuntime(375): at android.graphics.Bitmap.nativeCreate(Native Method)
E/AndroidRuntime(375): at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
E/AndroidRuntime(375): at android.view.View.buildDrawingCache(View.java:6577)
非常确定硬件加速视图有48位颜色,因此禁用ListView项的硬件加速应该可以修复绘图缓存。我不会在未来的版本中依赖于绘图缓存。