我有一个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] ...
为什么呢?我在哪里失去了逻辑?
答案 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(...)来避免复制绘图。