1

ビューに問題があります。独自のビュー (正方形) を作成しました。画面に配置した正方形を移動したいと考えています。メニューを使用すると、他の正方形を画面に配置できます。問題は、プログラムが開始されると、画面上に 1 つの正方形があり、それを移動できるということです。しかし、他の四角を置くときは、最後の四角だけを移動できます。どうすればこれを修正できますか?

public class Square extends View {
private float x, y, width, height;
private int screenW, screenH;
public boolean isInside = false;
public int id=0;

public Square(Context context, int aid, int asw, int ash, float aw, float ah) {
    super(context);
    id = aid;
    screenH = ash;
    screenW = asw;
    x = asw/2;
    y = ash/2;
    width = aw;
    height = ah;
}
protected void onDraw(Canvas canvas){       
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        canvas.drawLine(x, y, x+width, y, paint);
        canvas.drawLine(x, y, x, y+height, paint);
        canvas.drawLine(x+width, y+height, x+width, y, paint);
        canvas.drawLine(x+width, y+height, x, y+height, paint);
}
public void setPosition(float x, float y){      
    this.x = x-width/2;
    this.y = y-height/2;
    //invalidate();
}
public int contains(float ax, float ay){
    if(ax==x || (ax<(x+width) && ax > x) || ax==(x+width))
        if(ay==y || (ay<(y+height) && ay > y) || ay==(y+height))
            return id;
    return -1;      
}

}

public class SquareBuilder extends Activity {

private int width, height;
//private RelativeLayout layout;
private FrameLayout layout;
private int id=0;
private ArrayList<Square> squareList;
Square squareTouched;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_square_builder);
    Display display = null;
    display = getWindowManager().getDefaultDisplay();
    DisplayMetrics outMetrics = new DisplayMetrics();
    display.getMetrics(outMetrics);     
    width = outMetrics.widthPixels;
    height = outMetrics.heightPixels;
    Log.i("Display size", "Width: "+width+" Height: "+height);
    Log.i("Display size", "Width: "+width/2+" Height: "+height/2);
    //layout = new RelativeLayout(this);
    layout = new FrameLayout(this);
    squareList = new ArrayList<Square>();
    Square sqr = new Square(this, id++, (int) width, (int)height,50,50);
    sqr.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            Square sqr = (Square) v;
            switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
                if(sqr.contains(event.getX(),event.getY())>=0)
                    sqr.isInside = true;
                break;
            case MotionEvent.ACTION_MOVE:
                if(sqr.isInside)
                    sqr.setPosition(event.getX(),event.getY());
                break;
            case MotionEvent.ACTION_UP:
                sqr.isInside = false;
                break;
            }
            sqr.invalidate();
            //return super.onTouchEvent(event);     
            return true;
            //return false;
        }
    });
    squareTouched = null;
    squareList.add(sqr);
    layout.addView(sqr);
    setContentView(layout);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_square_builder, menu);
    return true;
}
public boolean onOptionsItemSelected(MenuItem item){
    switch(item.getItemId()){
        case R.id.menu_other:
            Square sqr = new Square(this, id++, (int) width, (int) height,50,50);
            sqr.setOnTouchListener(new View.OnTouchListener() {
                public boolean onTouch(View v, MotionEvent event) {
                    // TODO Auto-generated method stub
                    Square sqr = (Square) v;
                    switch(event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        if(sqr.contains(event.getX(),event.getY())>=0)
                            sqr.isInside = true;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if(sqr.isInside)
                            sqr.setPosition(event.getX(),event.getY());
                        break;
                    case MotionEvent.ACTION_UP:
                        sqr.isInside = false;
                        break;
                    }
                    sqr.invalidate();
                    //return super.onTouchEvent(event);     
                    return true;
                    //return false;
                }
            });
            squareList.add(sqr);
            layout.addView(sqr);
            setContentView(layout);
            break;
    }
    return super.onOptionsItemSelected(item);   
}

}

4

1 に答える 1

0

まず、新しい正方形の作成を SquareBuilder のメソッドにします。

private Square newSquare() { ...

次に、正方形を作成するための重複したコードを、この新しいメソッドの呼び出しに置き換えます。これにより、そのコードのコピーが 1 つしかないため、問題の解決が容易になります。

次に、各 case ステートメント内にログを追加して、どのイベントが実際にどこで発生しているかを確認します。

これも役立つかもしれません:複数のビュー OnTouch イベント タッチ イベントが正方形にない場合、イベントから false を返して、イベントを他のリスナーに伝播できるようにする必要があります。true を返すと、イベントが消費されます。

于 2012-09-14T22:52:54.217 に答える