Android 动态按钮脱离相对位置

Android 动态按钮脱离相对位置,android,drag-and-drop,android-relativelayout,Android,Drag And Drop,Android Relativelayout,我正在开发一个应用程序,其中使用了拖放功能。 我正在生成按钮OnClick。代码运行正常,但当我将按钮拖动到relativelayout的角落时,按钮会退出布局。我希望它保持在布局的内部。 我正在分享我的代码和图片。从这张图片你可以清楚地了解我的问题 提前谢谢 MainActivity.java public class MainActivity extends Activity implements OnTouchListener { Button btnAddButton;

我正在开发一个应用程序,其中使用了
拖放功能。
我正在生成按钮
OnClick
。代码运行正常,但当我
按钮
拖动到
relativelayout
的角落时,按钮会退出
布局。我希望它保持在
布局的内部。
我正在分享我的代码和图片。从这张图片你可以清楚地了解我的问题

提前谢谢

MainActivity.java

public class MainActivity extends Activity implements OnTouchListener {
    Button btnAddButton;
    RelativeLayout rl1;
    int i = 1;
    private int _xDelta;
    private int _yDelta;
    ViewGroup _root;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnAddButton = (Button) findViewById(R.id.btnAdd);

        rl1 = (RelativeLayout) findViewById(R.id.relative_layout);
        _root = (ViewGroup)findViewById(R.id.relative_layout);
        btnAddButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                add(v);

            }
        });
    }
    public void add(View v) {
        Button btn = new Button(MainActivity.this);
        //btn.setId(i);
        RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

        int a=(int) (Math.random()*100);
       // Toast.makeText(MainActivity.this, String.valueOf(Math.random()*100), 1).show();//double a=Math.random();
        layoutParam.leftMargin = 30+a;

        if (i > 1) {

            layoutParam.addRule(RelativeLayout.BELOW, (i - 1));
        }

        btn.setText("Button" + i);
        rl1.addView(btn, layoutParam);
        btn.setOnTouchListener(this);
        i++;
    } 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    @Override
    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();
                    _xDelta = X - lParams.leftMargin;
                    _yDelta = 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 - _xDelta;
                    layoutParams.topMargin = Y - _yDelta;
                    layoutParams.rightMargin = -250;
                    layoutParams.bottomMargin = -250;
                    v.setLayoutParams(layoutParams);
                    break;
            }
            _root.invalidate();
        return true;
    }
}
活动\u main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linear_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <Button
        android:id="@+id/btnAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="AddButton"
        android:text="Button" />

    <RelativeLayout
        android:id="@+id/relative_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/btnAdd" >
    </RelativeLayout>

</RelativeLayout>


我不知道问题出在哪里,但我有一个类似的问题,就是只使用onTouchListener。我成功地使用了onDragListener。下面是一个例子:这是一个完全不同的代码伙伴。当我将按钮拖动到角落时,它会隐藏,我的要求是设置一些条件,使按钮不会隐藏,但使用onDragListener将为您提供更高效、更安全的方式来处理所需内容。这只是如何做到这一点的一个例子。是的,我知道,重写代码很难,但是使用OnDragListener会给你一个更满意的结果