【问题标题】:Android 2.1 View's getDrawingCache() method always returns nullAndroid 2.1 View 的 getDrawingCache() 方法总是返回 null
【发布时间】:2010-05-12 08:41:06
【问题描述】:

我正在使用 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 时的行为是否相同?

【问题讨论】:

标签: android caching null view drawing


【解决方案1】:
Bitmap screenshot;
view.setDrawingCacheEnabled(true);
screenshot = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);

您需要Bitmap.createBitmap(view.getDrawingCache());,因为getDrawingCache() 从中接收引用的位图被回收。

【讨论】:

  • 对我不起作用!说:在 Bitmap.createBitmap() 处源为空
【解决方案2】:

使用

onLayout(x, y, width, height);

例如:

onLayout(0, 0, 100, 100);

在调用 getDrawingCache 之前

【讨论】:

  • 也不起作用:LinearLayout 类型的 onLayout(boolean, int, int, int, int) 方法不可见
  • 它只是:layout.layout(0, 0, wt, ht);
  • 它很奇怪,但对我有用..(它只绘制父视图而不是子视图)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我知道这不能回答你的问题,但是....

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 我知道,setDrawingCacheEnabled 和 buildDrawingChache 是多余的。 setDrawingCacheEnabled 强制按需构建绘图缓存,并且 buildDrawingChache 在不设置启用标志的情况下创建缓存。但它对我不起作用 - 既不设置标志,也不使用显式调用 buildDrawingChache 而不设置标志。
      【解决方案6】:

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

      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 ...

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-16
          • 2014-05-01
          • 2019-03-21
          • 1970-01-01
          • 2016-07-10
          • 2016-02-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多