Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 2.1视图';s getDrawingCache()方法始终返回null_Android_Caching_Null_View_Drawing - Fatal编程技术网

Android 2.1视图';s getDrawingCache()方法始终返回null

Android 2.1视图';s getDrawingCache()方法始终返回null,android,caching,null,view,drawing,Android,Caching,Null,View,Drawing,我使用的是Android 2.1,存在以下问题: 使用方法View.getDrawingCache()总是返回null。getDrawingCache()应返回位图,这是视图内容的表示形式 示例代码: public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final View view =

我使用的是Android 2.1,存在以下问题: 使用方法View.getDrawingCache()总是返回null。getDrawingCache()应返回位图,这是视图内容的表示形式

示例代码:

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.setWillNotDraw(boolean)
View.setWillNotCacheDrawing(boolean)
),但没有任何效果

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


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

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

使用

onLayout(x, y, width, height);
例如:

onLayout(0, 0, 100, 100);
在调用getDrawingCache之前

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

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

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

也有同样的问题,最后这部分对我来说是可行的:

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…

如果视图不大于屏幕大小,请检查。我发现了这一点,并切换了视图的维度,因此,现在它可以工作了=)
我知道这不能回答你的问题,但是

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

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


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

我知道,setDrawingCacheEnabled和buildDrawingChache是多余的。setDrawingCacheEnabled强制按需生成图形缓存,buildDrawingChache创建缓存而不设置启用标志。但是它对我不起作用-既不只是设置标志,也不使用显式调用buildDrawingChache而不设置标志。对我不起作用!说明:源在位图处为空。createBitmap()也不起作用:LinearLayout类型中的方法onLayout(boolean,int,int,int,int)不可见,它只是:layout.layout(0,0,wt,ht);这很奇怪,但对我来说是可行的。(它只绘制了父视图而不是子视图)我在2.1中遇到了同样的问题,2.2正确保存了位图。这应该是可行的-