gpt4 book ai didi

java - 无法向对象添加/删除位图

转载 作者:行者123 更新时间:2023-12-02 05:27:42 24 4
gpt4 key购买 nike

我有一个Object让我们称其为“A”,它有 ArrayList<B> 。对象 B 持有 Bitmap 。当我迭代我的ArrayList<B>时抢 Bitmaps来自每个 B Object只有一种类型。我已经做了一些测试,我肯定会放入不同的 Bitmaps ,但我的逻辑在某个地方有缺陷,我正在覆盖所有 Bitmaps最后Bitmap在我的ArrayList<B> .

Java

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] ...
为什么?我在哪里失去了逻辑?

最佳答案

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

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

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(...) 来避免复制绘图。

关于java - 无法向对象添加/删除位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25840629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com