我试图用Timer在规则的间隔内捕捉多个屏幕截图。但是,添加到ArrayList中的图像都是最后的图像。所以我在名单上看到了类似的图片。
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
System.out.println("executing timer "+index);
View rootView = findViewById(R.id.relative_inside);
rootView.setDrawingCacheEnabled(true);
rootView.buildDrawingCache();
Bitmap drawingCache = rootView.getDrawingCache();
list.add(drawingCache);
System.out.println("image added to list "+index);
index++;
}
});
}
};我用以下代码调用计时器:-
timer.schedule(timerTask, 0, 80);但是,在从列表中提取图像时,我得到了类似的图像。有人能指出我的错误吗?
发布于 2014-08-20 10:54:32
这是因为getDrawingCache()返回相同的Bitmap实例,只是使用更新的像素数据。因此,当缓存位图更改时,所有已添加的列表项都将被更新。
每次读取缓存并添加到列表中时,都必须创建Bitmap的新实例。
例如:
Bitmap drawingCache = Bitmap.createBitmap(rootView.getDrawingCache());
list.add(drawingCache);请注意,位图占用了大量内存,获得OutOfMemoryError非常容易。
此外,您还可以移动此部分:
View rootView = findViewById(R.id.relative_inside);
rootView.setDrawingCacheEnabled(true);
rootView.buildDrawingCache();到TimerTask创建阶段,例如内部构造函数。然后可以通过实例变量引用您的视图。浏览视图层次结构很费时。
发布于 2014-08-20 10:54:25
我认为getDrawingCache()返回的位图总是一样的,只要您不回收位图,或者不调用setDrawingCacheEnabled(false);或destroyDrawingCache()。
https://stackoverflow.com/questions/25402599
复制相似问题