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;
}
});
}
}
이곳에 사용된 기능을 살펴보겠습니다.
- 드래그 시작 : 아이템을 길게 누르면 드래그가 시작됩니다.
- 드롭 영역 진입 : 아이템 드롭 영역에 진입하면 색상이 변경됩니다.
- 드롭 성공 : 드래그한 아이템이 드롭되면 토스트 메시지를 표시합니다.
- 드래그 종료 : 드래그 작업이 끝나면 색상을 원래대로 복구합니다.
시연 영상입니다.
'안드로이드 자바' 카테고리의 다른 글
[Java][Android] ZoomLayout 활용하여 이미지 확대/축소하기 (0) | 2024.12.31 |
---|---|
[Java][Android] VelocityTracker을 사용한 드래그 속도에 따른 동작 변화 (2) | 2024.12.30 |
[Java][Android] TransitionManager로 뷰 크기와 투명도 애니메이션 구현하기 (0) | 2024.12.24 |
[JAVA][Android] TouchDelegate로 터치 영역 확장하기 (0) | 2024.12.22 |
[Android][JAVA] TextView와 DynamicTextView 비교: 텍스트 레이아웃 처리의 차이점 (2) | 2024.12.19 |