2012-11-24 7 views
1


간단한 보드 게임과 같은 단순한 스크래블을 만들고 싶습니다. 내 보드의 모든 필드를 포함하는 RelativeLayout을 사용하여 XML 파일을 이미 만들었습니다. 이제 내가하고자하는 것은이 보드를 움직일 수있게하는 것입니다 - 그래서 사용자는 그것을 확대하고, 축소하고 화면 위로 움직일 수 있습니다. 이 문제를 해결하기 위해 나는 HERE에서 팁을 사용했습니다. TextView를 내 간단한 BoardView로 대체했습니다.android moving RelativeLayout가 포함 된보기

public class BoardView extends View { 

     public BoardView(Context context) { 
      super(context); 
      setContentView(R.layout.board); 
     } 

    } 

불행히도 내 보드는 움직이지 않습니다. 도와주세요. 어쩌면 당신은 이런 종류의 게임에 완전히 다른 접근법을 가지고 있습니까? 나는 그것에 대해 듣고 싶다.

내 BoardActivity 코드 :

public class BoardActivity extends Activity implements OnTouchListener { 

private int deltaX_; 
private int deltaY_; 

private ViewGroup root_; 
private BoardView view_; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_board); 

    root_ = (ViewGroup) findViewById(R.id.rootBoard); 

    view_ = new BoardView(this); 

    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(540, 540); 
    layoutParams.leftMargin = 50; 
    layoutParams.topMargin = 50; 
    layoutParams.bottomMargin = -2500; 
    layoutParams.rightMargin = -2500; 
    view_.setLayoutParams(layoutParams); 

    view_.setOnTouchListener(this); 
    root_.addView(view_); 
} 

public boolean onTouch(View v, MotionEvent event) { 

     final int X = (int) event.getRawX(); 
     final int Y = (int) event.getRawY(); 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); 
      deltaX_ = X - lParams.leftMargin; 
      deltaY_ = Y - lParams.topMargin; 
      break; 
     case MotionEvent.ACTION_UP: 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      break; 
     case MotionEvent.ACTION_POINTER_UP: 
      break; 
     case MotionEvent.ACTION_MOVE: 
      RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); 
      layoutParams.leftMargin = X - deltaX_; 
      layoutParams.topMargin = Y - deltaY_; 
      layoutParams.rightMargin = -2500; 
      layoutParams.bottomMargin = -2500; 
      view_.setLayoutParams(layoutParams); 
      break; 
     } 
     return true; 
    } 
} 

내 board.xml 레이아웃이 THIS에 비슷한입니다 :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <ImageView 
    android:background="@drawable/special_square" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/square_a1" /> 
    <ImageView 
    android:layout_toRightOf="@id/square_a1" 
    android:background="@drawable/normal" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/square_a2" /> 
    ...and so on... 
+0

은 * 모든 * 귀하의 BoardView 코드인가? – Simon

+0

이 단계에서 - 예. 나는 그것을 보여주고 움직 이기만을 바랄뿐입니다. 그런 다음 다른 행동에 집중할 것입니다. – karex

+0

layoutParams를 설정 한 후 view_.invalidate()를 시도하십시오. – Simon

답변

1
case MotionEvent.ACTION_MOVE: 
     RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); 
     layoutParams.leftMargin = X - deltaX_; 
     layoutParams.topMargin = Y - deltaY_; 
     layoutParams.rightMargin = -2500; 
     layoutParams.bottomMargin = -2500; 
     //no needs to setLayout again: view_.setLayoutParams(layoutParams); 

     //requestLayout is required 
     view_.requestLayout();