1

Java オブジェクトへの参照に問題があるようです。これは、おそらく C での長年のプログラミングの結果です。次のコードは、キャンバス内で「WordPart」のオブジェクトを移動できるようにするためのものです。最初のオブジェクトを選択すると、期待どおりに動きます。最初のオブジェクトを離して 2 番目のオブジェクトを選択すると、最初のオブジェクトと 2 番目のオブジェクトの両方の位置が同じになります。(コンパイルに必要なコードを削除しましたが、質問には関係ありません。)私が知る限り、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");
}
}
}
4

1 に答える 1

3

これが問題だと思います:

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

残念ながら、型にはまらない名前のコードはありませんが、NewPositionおそらく、のフィールドの値を設定しますWordParts。2つの別々WordPartsのオブジェクト内の2つのフィールドの値を同じものを参照するように設定したPoint場合、後でその中の値を次のように変更すると、次のPointようになります。

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

そうです、これらの変更WordParts両方とも同じオブジェクトを参照しているため、両方のオブジェクトを介して表示されます。

Javaを初めて使用する場合は、単純なコンソールアプリを使用して言語の基本を学ぶことを強くお勧めします。オブジェクト、参照とプリミティブ、継承、コアコレクション、IOなどについて学び、UIとモバイルのトリッキーな環境で作業を開始します

于 2012-10-09T13:38:19.783 に答える