无法添加/删除位图到对象

时间:2014-09-15 03:58:06

标签: java android bitmap

我有一个Object,可以将其称为“A”,其中包含ArrayList<B>。对象B包含Bitmap。当我遍历我的ArrayList<B>以从每个B Bitmaps抓取Object时,只有一种类型。我已经完成了一些测试,我肯定会使用不同的Bitmaps,但在某些地方,我的逻辑存在缺陷,并且我用Bitmaps中的最后Bitmap覆盖了所有ArrayList<B> }。

爪哇

private A createObject() {
    A a = new A(); // create object A
    ArrayList<B> bList = new ArrayList<B>(); //create array list which will hold B objects
    RelativeLayout rel = (RelativeLayout)findViewById(R.id.rel);
    LinearLayout lin = new LinearLayout(this);
    lin.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    a.setName(UUID.randomUUID().toString());

    for (LinkedHashMap.Entry<String, ArrayList<Circle>> entry : mCordHashMap.entrySet()) {
        ArrayList<Circle> coords = new ArrayList<Circle>();
        B b = new B(); //create new B object
        coords = entry.getValue();
        Path path = new Path();
        String key = entry.getKey();
        String surfaceName = getSurfaceFromKey(key);

        b.setName(surfaceName);

        for (Circle c : coords) {
            if (c == coords.get(0)) {
                path.moveTo(c.getmX(), c.getmY());
            } else {
                path.lineTo(c.getmX(), c.getmY());
            }
        }

        path.close();
        mCanvas.drawPath(path, mPaint);
        mImageView.invalidate();

        b.setRegion(mBitmap); // add bitmap to B
        bList.add(b); // add B to list
    }

    a.setBList(bList); // add the list of B objects to object A here
    ArrayList<B> testList = a.getBList();

    for (B b : testList) {
        Bitmap bmp = b.getRegion().createScaledBitmap(b.getRegion(), 100, 100, false);
        ImageView iv = new ImageView(this);
        iv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        iv.setImageBitmap(bmp);
        lin.addView(iv);
    }
    rel.addView(lin);

    return a;
}

现在所有这些都有效,但并非如预期的那样。我得到ImageViews,其中每个都有相同 Bitmap

所以看起来像这样

[a] [a] [a] [a]

然而,进入的Bitmaps是不同的。例如,如果我改变我添加视图的位置,结果就是所希望的。

第二个例子

private A createObject() {
    A a = new A(); // create object A
    ArrayList<B> bList = new ArrayList<B>(); //create array list which will hold B objects
    RelativeLayout rel = (RelativeLayout)findViewById(R.id.rel);
    LinearLayout lin = new LinearLayout(this);
    lin.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    a.setName(UUID.randomUUID().toString());

    for (LinkedHashMap.Entry<String, ArrayList<Circle>> entry : mCordHashMap.entrySet()) {
        ArrayList<Circle> coords = new ArrayList<Circle>();
        B b = new B(); //create new B object
        coords = entry.getValue();
        Path path = new Path();
        String key = entry.getKey();
        String surfaceName = getSurfaceFromKey(key);

        b.setName(surfaceName);

        for (Circle c : coords) {
            if (c == coords.get(0)) {
                path.moveTo(c.getmX(), c.getmY());
            } else {
                path.lineTo(c.getmX(), c.getmY());
            }
        }

        path.close();
        mCanvas.drawPath(path, mPaint);
        mImageView.invalidate();

        // DIFFERENCE   
        Bitmap bmp = mBitmap.createScaledBitmap(mBitmap, 100, 100, false);
        ImageView iv = new ImageView(this);
        iv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        iv.setImageBitmap(bmp);
        lin.addView(iv);

        b.setRegion(mBitmap); // add bitmap to B
        bList.add(b); // add B to list
    }
    rel.addView(lin);

    a.setBList(bList); // add the list of B objects to object A here    

    return a;
    }

此代码根据需要显示ImagevViews内有唯一Bitmaps的内容,如此

[a] [b] [c] ...

为什么呢?我在哪里失去了逻辑?

1 个答案:

答案 0 :(得分:2)

您可能使用相同的Bitmap副本,这是错误的。请记住,通过向列表添加位图,您不需要创建副本,而是放置实际的位图。并且你多次放置相同的位图!

正确的解决方案是每次都使用新的Bitmap。这是一个提示

List<Bitmap> list = new ArrayList<Bitmap>();

for (...) {
    Bitmap bmp = Bitmap.createBitmap(width, height, Config.ARGB_8888);
    Canvas canv = new Canvas(bmp);

    /* Draw on canvas */

    list.add(bmp);
}

或者,您可以使用bmp.copy(...)来避免复制绘图。