0
public class MyActivity extends Activity implements View.OnTouchListener { 

    TextView _view; 
    ViewGroup _root; 
    private int _xDelta; 
    private int _yDelta; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     _root = (ViewGroup)findViewById(R.id.root); 

     _view = new TextView(this); 
     _view.setText("TextView!!!!!!!!"); 

     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 50); 
     layoutParams.leftMargin = 50; 
     layoutParams.topMargin = 50; 
     layoutParams.bottomMargin = -250; 
     layoutParams.rightMargin = -250; 
     _view.setLayoutParams(layoutParams); 

     _view.setOnTouchListener(this); 
     _root.addView(_view); 
    } 

    public boolean onTouch(View view, 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) view.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) view.getLayoutParams(); 
       layoutParams.leftMargin = X - _xDelta; 
       layoutParams.topMargin = Y - _yDelta; 
       layoutParams.rightMargin = -250; 
       layoutParams.bottomMargin = -250; 
       view.setLayoutParams(layoutParams); 
       break; 
     } 
     _root.invalidate(); 
     return true; 
    }} 

edittext와 imageview.It을 움직이는 데이 코드를 사용하고 있습니다. 잘 움직이고 있지만 상대 레이아웃 외에도 이동합니다. 레이아웃을 이동하는 데 제약이 따릅니다. 아무에게도 제안이 있습니까? 내가 구현하는 아래특정 상대 레이아웃에서만 edittext 또는 imageview를 이동하는 방법은 무엇입니까?

+0

은 절대 레이아웃을 사용해보십시오. – GrIsHu

+0

@ Grrsu, 절대 레이아웃을 시도했지만 여백을 설정하지 않았습니다. – immodi

+0

내 대답을 확인하십시오. – GrIsHu

답변

1

체크 아웃 드래그 & 드롭 기능 코드 :

DragAndDrop.java

public class DragAndDrop extends Activity 
    { 
private ImageView m_ivImage, m_ivImage1; 
private int m_counter = 0; 
float m_lastTouchX, m_lastTouchY, m_posX, m_posY, m_prevX, m_prevY, m_imgXB, m_imgYB, m_imgXC, m_imgYC, m_dx, m_dy; 
private LinearLayout m_llTop; 
private AbsoluteLayout m_alTop; 
private Button m_btnAddView, m_btnRemove; 
private Context m_context; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    m_context = this; 

    m_prevX = 0; 
    m_prevY = 0; 
    m_imgXB = 50; 
    m_imgYB = 100; 
    m_imgXC = 150; 
    m_imgYC = 100; 

    m_ivImage = (ImageView) findViewById(R.id.ivImage); 
    m_ivImage1 = (ImageView) findViewById(R.id.ivImage1); 
    m_llTop = (LinearLayout) findViewById(R.id.llTop); 
    m_alTop = (AbsoluteLayout) findViewById(R.id.alTop); 
    m_btnAddView = (Button) findViewById(R.id.btnAdd); 
    m_btnRemove = (Button) findViewById(R.id.btnRemove); 

    m_ivImage.setOnTouchListener(m_onTouchListener); 
    m_ivImage1.setOnTouchListener(m_onTouchListener); 
    m_btnAddView.setOnClickListener(m_onClickListener); 
    m_btnRemove.setOnClickListener(m_onClickListener); 

} 

/** 
* Common click listener for clickable controls 
*/ 
OnClickListener m_onClickListener = new OnClickListener(){ 

    @Override 
    public void onClick(View p_v) 
    { 
     switch (p_v.getId()) 
      { 
       case R.id.btnAdd: 
        addView(); 
        break; 
       case R.id.btnRemove: 
        removeView(); 
        break; 
       default: 
        break; 
      } 
    } 
}; 

/** 
* Touch listener for view 
*/ 
OnTouchListener m_onTouchListener = new OnTouchListener(){ 

    @Override 
    public boolean onTouch(View p_v, MotionEvent p_event) 
    { 
     switch (p_event.getAction()) 
      { 
       case MotionEvent.ACTION_DOWN: 
       { 
        m_lastTouchX = p_event.getX(); 
        m_lastTouchY = p_event.getY(); 
        break; 
       } 
       case MotionEvent.ACTION_UP: 
       { 
        break; 
       } 

       case MotionEvent.ACTION_MOVE: 
       { 
        m_dx = p_event.getX() - m_lastTouchX; 
        m_dy = p_event.getY() - m_lastTouchY; 

        m_posX = m_prevX + m_dx; 
        m_posY = m_prevY + m_dy; 

        if (m_posX > 0 && m_posY > 0 && (m_posX + p_v.getWidth()) < m_alTop.getWidth() && (m_posY + p_v.getHeight()) < m_alTop.getHeight()) 
        { 
         p_v.setLayoutParams(new AbsoluteLayout.LayoutParams(p_v.getMeasuredWidth(), p_v.getMeasuredHeight(), (int) m_posX, (int) m_posY)); 

         m_prevX = m_posX; 
         m_prevY = m_posY; 

        } 

        break; 

       } 

      } 
     return true; 
    } 
}; 

/** 
* Add view dynamically for drag and drop 
*/ 
private void addView() 
{ 
    ImageView m_img = new ImageView(m_context); 
    if (m_counter < 5) 
    { 
      m_img.setBackgroundResource(R.drawable.ic_launcher); 
      m_alTop.addView(m_tv, new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, ((int) m_imgXB), ((int) m_imgYB))); 
      m_alTop.addView(m_img, new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, ((int) m_imgXB), ((int) m_imgYB))); 

     m_counter++; 
     if (m_counter == 5) 
      m_btnAddView.setEnabled(false); 
    } 

    m_img.setOnTouchListener(m_onTouchListener); 
    m_tv.setOnTouchListener(m_onTouchListener); 
} 

public void removeView() 
{ 
    m_counter = 0; 
    m_alTop.removeAllViews(); 
    m_alTop.invalidate(); 
    m_btnAddView.setEnabled(true); 
} 

레이아웃 파일

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/llTop" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <AbsoluteLayout 
     android:id="@+id/alTop" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_margin="10dp" 
     android:layout_weight=".70" 
     > 

     <ImageView 
      android:id="@+id/ivImage" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:src="@drawable/ic_menu_share" 
      android:visibility="gone" /> 

     <ImageView 
      android:id="@+id/ivImage1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:layout_marginTop="10dp" 
      android:layout_x="193dp" 
      android:layout_y="29dp" 
      android:src="@drawable/ic_launcher" /> 
    </AbsoluteLayout> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_gravity="center" 
     android:layout_weight=".30" > 

     <Button 
      android:id="@+id/btnAdd" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:text="@string/addview" /> 

     <Button 
      android:id="@+id/btnRemove" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:text="@string/removeview" 
      android:visibility="visible" /> 
    </LinearLayout> 

</LinearLayout> 
+0

답장을 보내 주셔서 감사합니다하지만 그것은 나를 위해 작동하지 않습니다. 내가 절대 레이아웃을 사용하는 경우, 그보기는 움직이지 않습니다. 정적입니다. 나는 조건의 경우에 정의한 것처럼 동작보기에서 레이아웃의 현재 높이와 너비 만 필요합니다. 가능한가요? – immodi

+0

예, 정의한대로 레이아웃의 현재 높이와 너비를 가져 와서 코드에서 제한 할 수 있습니다. 보기의 터치 리스너를 놓친 경우 이동했을 수 있습니다. – GrIsHu

+0

아니요. LinearLayout에서만 제한 할 수 있습니다. 두 번째 문제는 최신 edittext 또는 imageview를 움직일 때 가장 오래된 edittext 또는 imageview.i를 추가했을 때입니다. Google +에서 추가했습니다. 이에 대한 해결책은 무엇입니까? – immodi