Android View.getDrawingCache返回null,仅为null

请人尝试向我解释为什么

public void addView(View child) { child.setDrawingCacheEnabled(true); child.setWillNotCacheDrawing(false); child.setWillNotDraw(false); child.buildDrawingCache(); if(child.getDrawingCache() == null) { //TODO Make this work! Log.w("View", "View child's drawing cache is null"); } setImageBitmap(child.getDrawingCache()); //TODO MAKE THIS WORK!!! } 

总是logging绘图caching为空,并将位图设置为空?

在caching设置之前,我是否必须绘制视图?

谢谢!

我也有这个问题,并find了这个答案:

 v.setDrawingCacheEnabled(true); // this is the important code :) // Without it the view will have a dimension of 0,0 and the bitmap will be null v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); v.buildDrawingCache(true); Bitmap b = Bitmap.createBitmap(v.getDrawingCache()); v.setDrawingCacheEnabled(false); // clear drawing cache 

如果getDrawingCache总是returning null家伙:使用这个:

 public static Bitmap loadBitmapFromView(View v) { Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().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; } 

参考: https : //stackoverflow.com/a/6272951/371749

一个人得到零的基本原因是这个观点不是维度。 所有的尝试然后,使用view.getWidth(),view.getLayoutParams()。宽度等,包括view.getDrawingCache()和view.buildDrawingCache(),都是没用的。 所以,你首先需要为视图设置尺寸,例如:

 view.layout(0, 0, width, height); 

(你已经按照你的喜好设置了“宽度”和“高度”,或者使用WindowManager等获得了它们)

我用这个来代替。

 myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Bitmap bitmap = Bitmap.createBitmap(myView.getDrawingCache()); } }); 

如果你想捕捉的视图真的显示在屏幕上,但它返回null。 这意味着你在Windowpipe理器生成它之前捕捉到视图。 有些布局非常复杂。 如果布局包含嵌套布局layout_weight..etc,则会导致多次重新布局以获得完全大小。 最好的解决scheme是等到窗口经理完成工作,然后获得屏幕截图。 尝试把getDrawingCache()放在处理程序中。

@ cV2和@ nininho的答案都适合我。

其他原因之一,我发现困难的方式是,我有的视图生成的宽度和高度为0的视图( 即想象有一个空string文本的TextView )。 在这种情况下,getDrawingCache将返回null,所以只要确保检查。 希望能帮助那里的一些人。

我正在尝试基于视图dynamic创buildn个图像。

  LayoutInflater infalter=(LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View addview=infalter.inflate(R.layout.barcode_image_list_row_item, null); final ImageView imv=(ImageView) addview.findViewById(R.id.imageView1); final TextView tv=(TextView) addview.findViewById(R.id.textView1); try { final Bitmap bitmap = encodeAsBitmap(""+value, BarcodeFormat.CODE_128, 600, 300); if(bitmap !=null){ // TODO Auto-generated method stub imv.setImageBitmap(bitmap); tv.setText(value); addview.setDrawingCacheEnabled(true); // this is the important code :) // Without it the view will have a dimension of 0,0 and the bitmap will be null addview.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); addview.layout(0, 0, addview.getMeasuredWidth(), addview.getMeasuredHeight()); addview.buildDrawingCache(true); Bitmap b = Bitmap.createBitmap(addview.getDrawingCache()); addview.setDrawingCacheEnabled(false); // clear drawing cache // saving the bitmap savebarcode(b,value); }else{ } } catch (WriterException e) { e.printStackTrace(); } 

我认为这个代码会帮助别人..

错误可能是因为您的View太大而不适合绘制caching

我从我的日志中解释了我的“View.getDrawingCache返回null”的问题:

 W/View: View too large to fit into drawing cache, needs 19324704 bytes, only 16384000 available 

Android文档也表示 : Android设备可以为单个应用程序提供低至16MB的内存。 这就是为什么你不能加载大的位图。

工作最好的4me

  Bitmap bitmap = Bitmap.createBitmap( screen.getMeasuredWidth(), screen.getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); screen.layout(0, 0, screen.getMeasuredWidth(), screen.getMeasuredHeight()); screen.draw(canvas);