2012-09-14 33 views
1

我有一些意見的問題。我創建了我自己的視圖(Square),我想移動我放在屏幕上的任何方塊。通過菜單,我可以將其他方塊放在屏幕上。事情是,當節目開始時,我在屏幕上有一個正方形,我可以移動它。但是當我把其他廣場,我可以移動最後一個。我怎樣才能解決這個問題?如何在Android中移動多個視圖?

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); 
} 

}

回答

0

第一件事,使一個新的正方形的創建是SquareBuilder的方法:

private Square newSquare() { ... 

,然後更換重複的代碼創建一個帶有這種新方法的電話的廣場。這將使您的問題更容易解決,因爲您只會擁有該代碼的一個副本。

然後,也許在每個case語句中添加一些日誌記錄,以查看哪些事件真正在哪裏觸發。

這也可能有幫助:Multiple Views OnTouch Events當觸摸事件不在廣場上時,您需要從事件中返回false,以便事件可以傳播給其他聽衆。返回真實消耗事件。

相關問題