gpt4 book ai didi

java - 更改对对象的引用会导致先前的对象数据被覆盖

转载 作者:行者123 更新时间:2023-11-29 05:54:13 30 4
gpt4 key购买 nike

我似乎对 java 对象的引用有问题,这可能是多年使用 C 编程的结果。下面的代码应该使我能够在 Canvas 上移动“WordPart”的对象。当我选择第一个对象时,它会按预期移动。当我释放第一个对象并选择第二个时,第一个和第二个对象的位置变得相同。 (我删除了编译所需的代码,但与问题无关。)据我所知,activeImage 引用似乎同时指向 wordPartList 中的两个对象。请帮我找出我的误会。

...
public class ONG2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new SurfaceView2(this));
}

public class SurfaceView2 extends SurfaceView implements SurfaceHolder.Callback {

ArrayList<WordParts> wordPartList;
WordParts activeImage;
Point activePosition;
String TAG = "SurfaceView2";
public SurfaceView2(Context context) {
super(context);
wordPartList = NewPartList(context);
this.getHolder().addCallback(this);
setFocusable(true);
activeImage = null;
activePosition = new Point();
}
/**
*
* @return list of word parts
*/
private ArrayList<WordParts> NewPartList(Context context) {
ArrayList<WordParts> newParts = new ArrayList<WordParts>();
newParts.add(new WordParts(context, new Point(400, 100), "foo"));
newParts.add(new WordParts(context, new Point(200, 100), "bar");
return newParts;
}
@Override
protected void onDraw(Canvas canvas) {
Log.d(TAG, "inside onDraw");
canvas.drawColor(Color.BLACK);
if (activeImage != null) {
activeImage.NewPosition(activePosition);
}
draw(canvas, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), new Point(100, 300));
draw(canvas, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), new Point(200, 300));
draw(canvas, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), new Point(300, 300));
for (WordParts wp : wordPartList) {
Point center = wp.getCenter();
Log.d(TAG, String.format("Word part %s at x=%d, y=%d", wp.mWordPartString, center.x, center.y));
draw(canvas, wp.getBitMap(), center);
}

}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG, String.format("inside on touch, event is %s", event.toString()));
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
// if within wordPart, set as active
for (WordParts wp : wordPartList) {
if (wp.isInside(event)) {
activeImage = wp;
Log.d(TAG, String.format("Touch down inside word part %s", wp.mWordPartString));
break; // end iteration
}
}

break;
case MotionEvent.ACTION_UP:
for (WordParts wp : wordPartList) {
if (activeImage == wp){
wp.endTouch();
Log.d(TAG, String.format("Released word part %s", wp.mWordPartString));
}
}
activeImage = null;
break;

default:
break;
}
activePosition.x = (int) event.getX();
activePosition.y = (int) event.getY();
if (activeImage != null)
this.postInvalidate(); // force call to onDraw
return true;
}

/**
* Draw the bitmap centered at specified point
* @param canvas - target of drawing
* @param bm - bitmap to draw
* @param centerPt
*/
public void draw(Canvas canvas, Bitmap bm, Point centerPt) {
canvas.drawBitmap( bm,
centerPt.x - (bm.getWidth() / 2),
centerPt.y - (bm.getHeight() / 2), null);
Log.d(TAG, String.format("canvas %s, bm %s, point %s", canvas.toString(), bm.toString(), centerPt.toString()));
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height)
{

}
public void surfaceCreated(SurfaceHolder holder) {
Log.d("surface", "Surface created");
setWillNotDraw(false);
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d("surface", "Surface destroyed");
}
}
}

最佳答案

怀疑这是问题所在:

if (activeImage != null) {
activeImage.NewPosition(activePosition);
}

不幸的是,我们没有非常规命名的 NewPosition 的代码,但大概它设置了 WordParts 中字段的值。如果您将两个单独的 WordParts 对象中的两个字段的值设置为引用相同的 Point,那么稍后当您更改该 Point 中的值时> 像这样:

activePosition.x = (int) event.getX();
activePosition.y = (int) event.getY();

然后是的,这些更改通过两个 WordParts 对象可见,因为它们都引用同一个对象。

如果您是 Java 新手,我强烈建议您通过简单的控制台应用程序学习该语言的基础知识。了解对象、引用和基元、继承、核心集合和 IO 等,然后开始在更棘手的 UI 和移动环境中工作。

关于java - 更改对对象的引用会导致先前的对象数据被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12801079/

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