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