2012-09-14 4 views
1

조회수에 문제가 있습니다. 나는 내 자신의 View (Square)를 만들었고 나는 스크린 위에 놓았던 사각형을 움직이고 싶다. 메뉴를 사용하면 다른 사각형을 화면에 표시 할 수 있습니다. 문제는 프로그램이 시작될 때 화면에 사각형이 하나 있고 움직일 수 있다는 것입니다. 하지만 다른 사각형을 넣으면 마지막으로 옮길 수 있습니다. 이 문제를 어떻게 해결할 수 있습니까?Android에서 여러 개의보기를 이동하는 방법은 무엇입니까?

private Square newSquare() { ... 

그런 다음 생성을위한 중복 코드를 대체 :

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의 방법이 될 수 있도록 이 새 메서드를 호출하는 사각형 이렇게하면 코드의 복사본이 하나만 있기 때문에 문제를 쉽게 해결할 수 있습니다.

그런 다음 각 사례 문안에 일부 이벤트를 기록하여 어떤 이벤트가 실제로 실행되는지 확인할 수 있습니다.

도울 수 있습니다. Multiple Views OnTouch Events 터치 이벤트가 사각형에 없을 때 이벤트에서 false를 반환해야 이벤트를 다른 수신기로 전파 할 수 있습니다. 사실을 되 돌리면 이벤트가 소모됩니다.

관련 문제