99

任何人都可以尝试向我解释为什么

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

总是记录绘图缓存为空,并将位图设置为空?

在设置缓存之前我是否必须实际绘制视图?

谢谢!

4

10 回答 10

245

我也遇到了这个问题并找到了这个答案:

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
于 2011-01-06T17:58:12.997 回答
61

如果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

于 2012-08-13T15:25:15.357 回答
6

一个得到空值的基本原因是视图没有被提及。然后所有尝试,使用 view.getWidth()、view.getLayoutParams().width 等,包括 view.getDrawingCache() 和 view.buildDrawingCache(),都是无用的。因此,您首先需要为视图设置尺寸,例如:

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

(您已经根据需要设置了“宽度”和“高度”或使用 WindowManager 等获取它们)

于 2016-03-13T10:21:40.403 回答
4

我用这个代替。

myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Bitmap bitmap = Bitmap.createBitmap(myView.getDrawingCache());
        }
    });
于 2015-06-02T10:47:15.313 回答
3

最好的工作 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);
于 2016-08-21T12:11:40.437 回答
2

如果您想要捕获的视图确实显示在屏幕上,但它返回 null。这意味着您在窗口管理器生成视图之前捕获它。有些布局非常复杂。如果布局包括嵌套布局,layout_weight..etc,它会导致多次重新布局以获得准确的大小。最好的解决方案是等到窗口管理器完成工作然后获取屏幕截图。尝试将 getDrawingCache() 放入处理程序中。

于 2013-05-15T21:42:21.987 回答
1

@cV2 和@nininho 的答案都对我有用。

我发现困难的另一个原因是我所拥有的视图正在生成一个宽度和高度为 0 的视图(即想象有一个带有空字符串的字符串文本的 TextView)。在这种情况下,getDrawingCache 将返回 null,因此请务必检查一下。希望对外面的一些人有所帮助。

于 2015-06-27T07:46:46.617 回答
1

我正在尝试根据视图动态创建 n 个图像。

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);
    }
} catch (WriterException e) {
    e.printStackTrace();
}

我认为这段代码会帮助某人..

于 2016-04-01T07:39:47.873 回答
1

该错误可能是因为您的View 太大而无法放入绘图缓存中。

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

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

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

于 2016-04-13T11:02:00.420 回答
-1

这是获取位图的简单有效的方法

public void addView(View v) {
        v.setDrawingCacheEnabled(true);
        v.buildDrawingCache();

        Bitmap bitmap = v.getDrawingCache();

        if(bitmap == null) {
            // bitmap is null
            // do whatever you want
        } else {
            setImageBitmap(bitmap);
        }
        v.setDrawingCacheEnabled(false);
        v.destroyDrawingCache();
    }
于 2017-12-04T07:51:44.610 回答