android移动视图包含RelativeLayout

时间:2012-11-24 13:26:43

标签: android view relativelayout


我想创建一个类似拼字游戏的简单棋盘游戏。我已经创建了一个包含RelativeLayout的XML文件,其中包含我的所有字段。现在我想要实现的是让这块板可以移动 - 这样用户就可以放大,缩小和移动屏幕。为了实现这一目标,我使用了HERE中的提示。我用自己简单的BoardView替换了TextView:

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...

1 个答案:

答案 0 :(得分: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();