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