首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArrayList<Bitmap>返回相同的位图

ArrayList<Bitmap>返回相同的位图
EN

Stack Overflow用户
提问于 2014-08-20 10:38:07
回答 2查看 483关注 0票数 0

我试图用Timer在规则的间隔内捕捉多个屏幕截图。但是,添加到ArrayList中的图像都是最后的图像。所以我在名单上看到了类似的图片。

代码语言:javascript
复制
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++;
            }
        }); 
    }
};

我用以下代码调用计时器:-

代码语言:javascript
复制
timer.schedule(timerTask, 0, 80);

但是,在从列表中提取图像时,我得到了类似的图像。有人能指出我的错误吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-20 10:54:32

这是因为getDrawingCache()返回相同的Bitmap实例,只是使用更新的像素数据。因此,当缓存位图更改时,所有已添加的列表项都将被更新。

每次读取缓存并添加到列表中时,都必须创建Bitmap的新实例。

例如:

代码语言:javascript
复制
Bitmap drawingCache = Bitmap.createBitmap(rootView.getDrawingCache());
list.add(drawingCache);

请注意,位图占用了大量内存,获得OutOfMemoryError非常容易。

此外,您还可以移动此部分:

代码语言:javascript
复制
View rootView = findViewById(R.id.relative_inside);
rootView.setDrawingCacheEnabled(true);
rootView.buildDrawingCache();

到TimerTask创建阶段,例如内部构造函数。然后可以通过实例变量引用您的视图。浏览视图层次结构很费时。

票数 0
EN

Stack Overflow用户

发布于 2014-08-20 10:54:25

我认为getDrawingCache()返回的位图总是一样的,只要您不回收位图,或者不调用setDrawingCacheEnabled(false);destroyDrawingCache()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25402599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档