可拖动按钮走出RelativeLayout的,每当拖累拖动、按钮、RelativeLayout

由网友(不解風情)分享简介:我正在开发中,我使用拖放功能的应用程序。在此我生成按钮的OnClick .The code工作正常,但是当我拖的按钮来的角落 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);
                    }
 
怎么避免RelativeLayout中的内容被挤出屏幕

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

阅读全文

相关推荐

最新文章