2014-01-24 2 views
4

다른 ImageView 또는 레이아웃 내부의 ImageView를 간단하게 드래그 앤 드롭 할 수 있습니다. 여기에 내가Android ImageView를 다른 ImageView (또는 레이아웃)로 드래그 앤 드롭

This is what I want to accomplish

에게 내가이 일을 알고있는 유일한 방법을 수행 할 작업의 사진은 하나의 "보낸 사람"이 선형 레이아웃을 가진 통해 그리고 "TO"및 제 2 레이아웃 배경에 할당 회색 문자의 이미지. 원래 장소

은 여기가 onTouch와 onDrag가 작동하고 이동할 때 감지 얻을 관리했습니다

public class MainActivity extends Activity implements OnTouchListener, 
    OnDragListener { 

private static final String LOGCAT = null; 

/* 
* Here are the links I've been using 
* http://www.techrepublic.com/blog/software-engineer/try-androids-useful-drag-and-drop-api/ 
* http://codingjunkie.net/android-drag-and-drop-part-2/ 
* http://javapapers.com/android/android-drag-and-drop/ 
*/ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    findViewById(R.id.letter_a).setOnTouchListener(this);  // My yellow letter a image 
    findViewById(R.id.top_container).setOnDragListener(this); // My 1st linear layout 
    findViewById(R.id.bottom_container).setOnDragListener(this); // My 2nd linear layout with "grayed a" image 
} 

@Override 
public boolean onTouch(View view, MotionEvent motionEvent) { 
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
     DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
     view.startDrag(null, shadowBuilder, view, 0); 
     view.setVisibility(View.INVISIBLE); 
     return true; 
    } else { 
     return false; 
    } 
} 

@Override 
    public boolean onDrag(View layoutview, DragEvent dragevent) { 

     int action = dragevent.getAction(); 
     View view = (View) dragevent.getLocalState(); 

     switch (action) { 
     case DragEvent.ACTION_DRAG_STARTED: 
     break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
     break; 
     case DragEvent.ACTION_DRAG_EXITED: 
     break; 
     case DragEvent.ACTION_DROP: 
      ViewGroup owner = (ViewGroup) view.getParent(); 
      owner.removeView(view); 
      LinearLayout container = (LinearLayout) layoutview; 
      container.addView(view); 
      view.setVisibility(View.VISIBLE); 
      break; 
     case DragEvent.ACTION_DRAG_ENDED: 
      Log.d(LOGCAT, "Drag ended"); 
      if (dropEventNotHandled(dragevent)){ 
       view.setVisibility(View.VISIBLE); 
      } 
      break; 
     default: 
      break; 
     } 
     return true; 
    } 

private boolean dropEventNotHandled(DragEvent dragEvent) { 
    return !dragEvent.getResult(); 
} 
} 

내 코드지만, 그것은 그것을 다시 끌 수 없습니다 그래서 내가 제자리에 고정 할의 .

대단히 감사합니다!

답변

2

bottom_container에 머물러 있어야하는 경우 리스너를 등록 해제하면됩니다 (예 : 이렇게 :

case DragEvent.ACTION_DROP: 
      ViewGroup owner = (ViewGroup) view.getParent(); 
      owner.removeView(view); 
      LinearLayout container = (LinearLayout) layoutview; 
      container.addView(view); 
      view.setVisibility(View.VISIBLE); 
      if(container.getId()==R.id.bottom_container){ 
       view.setOnTouchListener(null); 
       owner.setOnDragListener(null); 
      } 
    break; 
+0

브릴리언트! 많은 감사합니다. –