Android 2.1 View的getDrawingCache()方法始终返回null

时间:2010-05-12 08:41:06

标签: android caching null view drawing

我正在使用Android 2.1并遇到以下问题: 使用View.getDrawingCache()方法始终返回null。 getDrawingCache()应该返回一个Bitmap,它是View内容的表示。

示例代码:

public void onCreate(final Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  final View view = findViewById(R.id.ImageView01);
  view.setDrawingCacheEnabled(true);
  view.buildDrawingCache();
  final Bitmap bmp = view.getDrawingCache();
  System.out.println(bmp);

}

我已经尝试过不同的方法来配置View对象以生成绘图缓存(例如View.setWillNotDraw(boolean)View.setWillNotCacheDrawing(boolean)),但没有任何效果。

什么是正确的方式,或者我做错了什么?

PS:在实际代码中,我想在像RelativeLayout这样的ViewGroup上应用getDrawingCache()。使用ViewGroup时行为是否相同?

7 个答案:

答案 0 :(得分:17)

Bitmap screenshot;
view.setDrawingCacheEnabled(true);
screenshot = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);

您需要Bitmap.createBitmap(view.getDrawingCache());作为getDrawingCache()收到引用的位图才能被回收。

答案 1 :(得分:5)

使用

onLayout(x, y, width, height);

代表:

onLayout(0, 0, 100, 100);

在调用getDrawingCache之前

答案 2 :(得分:2)

永远不要在onCreate上做这些事情! 您可以在View.onClickListener或其他位置执行此操作。

答案 3 :(得分:2)

我知道这并没有回答你的问题,但是......

对于阅读此内容的其他开发人员而言,如果您真正想要做的是访问自定义视图的内容,则从ImageView派生自定义视图。然后创建一个您要控制/绘制/读取的画布和位图,并使用setImageBitmap()将您的位图设置为视图对象。从那里开始,你可以忽略在onDraw(canvas)方法中传递给你的画布,而只是绘制到你的本地画布/位图。

你为什么需要这个?在我看来,Canvas课程有一个疏忽。 Canvas类使您无法读取画布内容,也无法获取其背后的位图。因此,如果您需要从位图中读取,例如获取视图内容的图像转储,除了上述方法之外,我无法知道这样做。

这对于此线程中最初描述的RelativeView问题不起作用,但这可能是新Android开发人员感兴趣的。

答案 4 :(得分:0)

据我阅读文档中的最后几天,您应该只调用setDrawingCacheEnabled或buildDrawingChache(),但不能同时调用两者。

答案 5 :(得分:0)

有同样的问题,最后这部分对我有用:

view.layout(0, 0, 1000, 100);
Bitmap b = view.getDrawingCache();
try {
    b.compress(CompressFormat.JPEG, 95,
    new FileOutputStream( Environment.getExternalStorageDirectory()                                                            + "/folder/name.jpg"));
catch (FileNotFoundException e) {
    Log.e(LOGTAG, "error:" + e.getMessage());
    }

唯一的问题是,我无法获得我的观点的全部尺寸。 view.getwidth返回null ...

答案 6 :(得分:0)

检查您的视图是否不大于屏幕尺寸。我找到了这个并切换了我的视图的尺寸,现在它工作=)  Android get full View as Bitmap