安卓2.1中,View的getDrawingCache()方法总是返回null。

13
我正在使用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:在实际代码中,我想将getDrawingCache()应用于像RelativeLayout这样的ViewGroup。当使用ViewGroup时行为是否相同?


我在2.1中遇到了同样的问题,而2.2可以正确保存位图。 - Paulina D.
这应该可以工作 - https://dev59.com/3GbWa4cB1Zd3GeqPVUw8 - Ron
7个回答

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

你需要使用Bitmap.createBitmap(view.getDrawingCache());,因为从getDrawingCache()获取的位图会被回收掉。


4
对我没用!提示:在Bitmap.createBitmap()处源为空。 - Tobias

5

使用

onLayout(x, y, width, height);

例如:

onLayout(0, 0, 100, 100);

在调用getDrawingCache之前


1
仍然无法工作:LinearLayout 类型的 onLayout(boolean, int, int, int, int) 方法不可见。 - Tobias
3
仅翻译文本内容:它只是:layout.layout(0, 0, wt, ht); - Tobias
这很奇怪,但对我有效..(它只绘制父视图而不是其子视图) - dharmendra

2

不要在onCreate中做这些事情!你可以在View.onClickListener或其他地方完成。


2

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

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

为什么需要这样做?在我看来,Canvas类存在一个疏漏。Canvas类没有提供任何读取画布内容或获取其背后位图的方法。因此,如果你需要从位图中读取数据,例如获取视图内容的图像转储,我不知道有什么其他方法可以实现,除了上述方法。

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


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


0

根据我在过去几天的文档阅读中了解,你只需要调用setDrawingCacheEnabled或buildDrawingChache()中的一个,而不是同时调用两者。


我知道,setDrawingCacheEnabled和buildDrawingChache是多余的。setDrawingCacheEnabled强制按需构建绘图缓存,而buildDrawingChache在不设置启用标志的情况下创建缓存。但对我来说这并不起作用 - 无论是仅设置标志还是使用显式调用buildDrawingChache而不设置标志。 - Impression

0

检查一下你的视图是否超出了屏幕大小。我发现这个问题并调整了我的视图尺寸,现在它可以正常工作 =) Android 获取完整视图为位图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接