2012-10-09 71 views
1

我似乎有一個引用java對象的問題,可能是因爲在C編程幾年。下面的代碼應該使我能夠移動「 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"); 
} 
} 
} 

回答

3

嫌疑這就是問題所在:

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和移動的棘手環境中工作。