可拖动按钮走出RelativeLayout的,每当拖累 [英] Draggable Button getting out of RelativeLayout whenever dragged

查看:234
本文介绍了可拖动按钮走出RelativeLayout的,每当拖累的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发中,我使用拖放功能的应用程序。 在此我生成按钮的OnClick .The code工作正常,但是当我按钮来的角落 RelativeLayout的,按键失控的布局 。我希望它留在布局内

之前拖动按钮

拖动按钮(上角在这个例子中)后

正如你可以看到按钮是失控的布局每当我布局,我希望它留在布局年底/角落它完好,显示全按钮。我该怎么办呢?

在此先感谢!

MainActivity.java

 公共类MainActivity扩展活动实现OnTouchListener {
    按钮btnAddButton;
    RelativeLayout的RL1;
    INT I = 1;
    私人诠释_xDelta;
    私人诠释_yDelta;
    ViewGroup中_root;
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        btnAddButton =(按钮)findViewById(R.id.btnAdd);

        RL1 =(RelativeLayout的)findViewById(R.id.relative_layout);
        _root =(ViewGroup中)findViewById(R.id.relative_layout);
        btnAddButton.setOnClickListener(新OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                加(V);

            }
        });
    }
    公共无效添加(视图v){
        按钮BTN =新按钮(MainActivity.this);
        //btn.setId(i);
        RelativeLayout.LayoutParams layoutParam =新RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

        INT一个=(int)的(的Math.random()* 100);
       // Toast.makeText(MainActivity.this,将String.valueOf(的Math.random()* 100),1).show(); //双重一个=的Math.random();
        layoutParam.leftMargin = 30 + A;

        如果(ⅰ→1){

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

        btn.setText(按钮+ I);
        rl1.addView(BTN,layoutParam);
        btn.setOnTouchListener(本);
        我++;
    }
    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }
    @覆盖
    公共布尔onTouch(视图V,MotionEvent事件){
         最终诠释X =(INT)event.getRawX();
            最终诠释Y =(INT)event.getRawY();
            开关(event.getAction()及MotionEvent.ACTION_MASK){
                案例MotionEvent.ACTION_DOWN:
                    RelativeLayout.LayoutParams lParams =(RelativeLayout.LayoutParams)v.getLayoutParams();
                    _xDelta = X  -  lParams.leftMargin;
                    _yDelta = Y  -  lParams.topMargin;
                    打破;
                案例MotionEvent.ACTION_UP:
                    打破;
                案例MotionEvent.ACTION_POINTER_DOWN:
                    打破;
                案例MotionEvent.ACTION_POINTER_UP:
                    打破;
                案例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);
                    打破;
            }
            _root.invalidate();
        返回true;
    }
}
 

activity_main.xml

 < RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID / linear_layout
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT>

    <按钮
        机器人:ID =@ + ID / btnAdd
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:的onClick =Add按钮
        机器人:文本=按钮/>

    < RelativeLayout的
        机器人:ID =@ + ID / relative_layout
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_alignParentBottom =真
        机器人:layout_alignParentRight =真
        机器人:layout_alignParentTop =真
        机器人:layout_toRightOf =@ + ID / btnAdd>
    < / RelativeLayout的>

< / RelativeLayout的>
 

解决方案

我可以利用这些条件来解决这样的:

  IF((v.getY()< lay.getY())){

            v.setX(XVAL);
            v.setY(利用yval);
        }否则如果(v.getX()&其中; lay.getX()){

            v.setX(XVAL);
            v.setY(利用yval);
        }否则如果(v.getX()+ v.getWidth()> lay.getX()+ lay.getWidth()){

            v.setX(XVAL);
            v.setY(利用yval);
        }否则如果(v.getY()+ v.getHeight()> lay.getY()+ lay.getHeight()){

            v.setX(XVAL);
            v.setY(利用yval);
        } 其他 {
            的for(int i = 0; I< = viewIdList.size() -  1;我++){
                如果(v.getId()!= viewIdList.get(ⅰ).getId()){

                    视图V3 = viewIdList.get(ⅰ);
                    矩形Rect1的=新的矩形(v.getLeft(),v.getTop()
                            v.getRight(),v.getBottom());
                    v.getHitRect(Rect1的);
                    矩形RECT2 =新的矩形(v3.getLeft(),v3.getTop()
                            v3.getRight(),v3.getBottom());
                    v3.getHitRect(RECT2);
                    如果(Rect.intersects(Rect1的,RECT2)){

                        的System.out.println(重叠);
                        v.setX(XVAL);
                        v.setY(利用yval);
                    }
 

其中v是(在我的情况的ImageView)认为,这code是写在 MotionEvent.ACTION_UP onTouchListener的。

I am developing an application in which I am using Drag and Drop functionality. In that I am generating buttons OnClick.The code is working fine but when I drag the button to the corners of the relativelayout,button gets out of the layout. I want it to stay inside of the layout.

Before Dragging the button

After Dragging the button (on top corner in this example)

As you can see that the button is getting out of the layout whenever I drag it towards the end/corner of the layout, I want it to stay in the layout intact, display full button. How can I do that?

Thanks in advance.!

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

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

解决方案

I was able to tackle this by using these conditions:

        if ((v.getY() < lay.getY())) {

            v.setX(xVal);
            v.setY(yVal);
        } else if (v.getX() < lay.getX()) {

            v.setX(xVal);
            v.setY(yVal);
        } else if (v.getX() + v.getWidth() > lay.getX() + lay.getWidth()) {

            v.setX(xVal);
            v.setY(yVal);
        } else if (v.getY() + v.getHeight() > lay.getY() + lay.getHeight()) {

            v.setX(xVal);
            v.setY(yVal);
        } else {
            for (int i = 0; i <= viewIdList.size() - 1; i++) {
                if (v.getId() != viewIdList.get(i).getId()) {

                    View v3 = viewIdList.get(i);
                    Rect rect1 = new Rect(v.getLeft(), v.getTop(),
                            v.getRight(), v.getBottom());
                    v.getHitRect(rect1);
                    Rect rect2 = new Rect(v3.getLeft(), v3.getTop(),
                            v3.getRight(), v3.getBottom());
                    v3.getHitRect(rect2);
                    if (Rect.intersects(rect1, rect2)) {

                        System.out.println("overlap");
                        v.setX(xVal);
                        v.setY(yVal);
                    }

where v is the view (ImageView in my case) and this code is written in MotionEvent.ACTION_UP of onTouchListener.

这篇关于可拖动按钮走出RelativeLayout的,每当拖累的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆