2014-09-15 1 views
0

Drag and Drop 기능을 사용하는 응용 프로그램을 개발 중입니다. 단추를 OnClick 생성하고 있음. 코드가 제대로 작동하지만 dragrelativelayout 모서리에 button 때 단추가 layout 밖으로옵니다. 나는 그것이 layout 안에 머물길 원합니다.드래그 할 때마다 RelativeLayout을 벗어나는 드래그 가능한 버튼

당신이 button이라고 볼 수 있듯이

enter image description here

(이 예에서는 상단에) 버튼을 드래그 한 후 버튼을

1st

을 드래그하기 전에 언제든지 layout에서 나옵니다. draglayout의 끝/모서리를 향해서, layout에 그대로두고 싶습니다. 전체 디스플레이는 button입니다. 어떻게해야합니까?

미리 감사드립니다.

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> 
+0

[this] (http://stackoverflow.com/a/11615173/1777090) –

답변

0

나는 이러한 조건을 사용하여이 문제를 해결할 수 있었다 :

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

는 V가있다 보기 (Imag 내 경우에는 eView)이 코드는 onTouchListener의 MotionEvent.ACTION_UP에 기록됩니다.

관련 문제