본문 바로가기
안드로이드 자바

[Java][Android] DragEventListener를 사용해 드래그 앤 드롭 구현하기

by teamnova 2024. 12. 26.
728x90

안녕하세요

이번에는 DragEvenetListener 를 사용해서 간단한 드래그 앤 드롭 기능을 구현해보도록 하겠습니다.

이 방법은 개별 View 간 데이터를 이동하거나, UI 요소 재배치를 구현할 때 사용할 수 있습니다.

 

우선 전체 코드입니다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  android:gravity="center"
  android:padding="16dp">

  <TextView
    android:id="@+id/tvDragSource"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="아이템"
    android:padding="16dp"
    android:background="#FFC107"
    android:textColor="#FFFFFF"
    android:gravity="center"
    android:layout_marginBottom="16dp" />

  <TextView
    android:id="@+id/tvDropTarget"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="이곳에 놔주세요"
    android:padding="16dp"
    android:background="#03A9F4"
    android:textColor="#FFFFFF"
    android:gravity="center" />
</LinearLayout>

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView tvDragSource = findViewById(R.id.tvDragSource);
    TextView tvDropTarget = findViewById(R.id.tvDropTarget);

    // 드래그 시작: OnLongClickListener 설정
    tvDragSource.setOnLongClickListener(v -> {
      ClipData.Item item = new ClipData.Item(tvDragSource.getText());
      ClipData dragData = new ClipData(tvDragSource.getText(),
          new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN},
          item);

      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(tvDragSource);
      v.startDragAndDrop(dragData, shadowBuilder, null, 0);
      return true;
    });

    // 드래그 대상: OnDragListener 설정
    tvDropTarget.setOnDragListener((v, event) -> {
      switch (event.getAction()) {
        case DragEvent.ACTION_DRAG_STARTED:
          if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
            v.setBackgroundColor(0xFF4CAF50); // 드래그 시작 시 색상 변경
            return true;
          }
          return false;

        case DragEvent.ACTION_DRAG_ENTERED:
          v.setBackgroundColor(0xFFFFC107); // 드롭 영역 진입 시 색상 변경
          return true;

        case DragEvent.ACTION_DRAG_EXITED:
          v.setBackgroundColor(0xFF03A9F4); // 드롭 영역에서 벗어났을 때 원래 색상 복구
          return true;

        case DragEvent.ACTION_DROP:
          Toast.makeText(this, "드롭 성공!", Toast.LENGTH_SHORT).show();
          return true;

        case DragEvent.ACTION_DRAG_ENDED:
          v.setBackgroundColor(0xFF03A9F4); // 드래그 종료 시 색상 복구
          return true;

        default:
          return false;
      }
    });
  }
}

 

 

 

이곳에 사용된 기능을 살펴보겠습니다.

 

- 드래그 시작 : 아이템을 길게 누르면 드래그가 시작됩니다.

- 드롭 영역 진입 : 아이템 드롭 영역에 진입하면 색상이 변경됩니다.
- 드롭 성공 : 드래그한 아이템이 드롭되면 토스트 메시지를 표시합니다.

- 드래그 종료 : 드래그 작업이 끝나면 색상을 원래대로 복구합니다.

 

시연 영상입니다.