주요 개념

다음 섹션에서는 드래그 앤 드롭 프로세스의 몇 가지 주요 개념을 설명합니다.

드래그 앤 드롭 프로세스

드래그 앤 드롭 프로세스에는 네 개의 단계 또는 상태가 있습니다. 종료, 중단, 종료되었음을 의미합니다

시작됨

사용자의 드래그 동작에 대한 응답으로 애플리케이션은 startDragAndDrop()는 시스템에 드래그 앤 드롭 작업을 시작하도록 지시합니다. 이 메서드의 인수는 다음을 제공합니다.

  • 드래그할 데이터입니다.
  • 드래그 섀도우를 그리는 콜백
  • 드래그된 데이터를 설명하는 메타데이터
  • 시스템은 드래그를 가져오기 위해 애플리케이션을 다시 호출하여 응답합니다. 있습니다. 그런 다음 기기에 드래그 섀도우를 표시합니다.
  • 다음으로 시스템은 작업 유형과 함께 드래그 이벤트를 전송합니다. 드래그 이벤트로 ACTION_DRAG_STARTED 현재 레이아웃에 있는 모든 View 객체의 리스너입니다. 받는사람 드래그 이벤트를 계속 수신(가능한 드롭) 이벤트: 드래그 이벤트 리스너가 true를 반환해야 합니다. 이 레지스터는 리스너를 시스템에 전달합니다. 등록된 리스너만 계속해서 드래그 이벤트를 수신합니다. 이 시점에서 리스너는 드롭 타겟 View 객체의 모양을 통해 뷰가 드롭 이벤트를 수락합니다.
  • 드래그 이벤트 리스너가 false를 반환하면 드래그를 수신하지 않습니다. 시스템에서 드래그 이벤트를 전송할 때까지 현재 작업에 대한 이벤트 (작업 유형 ACTION_DRAG_ENDED) 리스너는 false를 반환하여 시스템에 관심이 없다고 알립니다. 드래그 앤 드롭 작업에서 사용하고 드래그된 데이터를 허용하지 않으려고 합니다.
진행 중
사용자가 드래그를 계속합니다. 드래그 섀도우가 드래그하면 시스템은 하나 이상의 드래그 이벤트를 대상의 드래그 이벤트 리스너입니다. 리스너는 기본 레이어의 모양을 이벤트에 대한 응답으로 드롭 타겟 View를 반환합니다. 예를 들어 이벤트가 - 드래그 그림자가 드롭의 경계 상자에 진입함을 나타냅니다. 타겟 - 작업 유형 ACTION_DRAG_ENTERED 리스너는 View를 강조 표시하여 반응할 수 있습니다.
드롭됨
사용자가 드롭의 경계 상자 안에 드래그 섀도우를 놓습니다. 있습니다. 시스템이 드롭 타겟의 리스너에 작업이 포함된 드래그 이벤트를 보냅니다. ACTION_DROP을 입력합니다. 드래그 이벤트 객체에는 작업을 시작하는 startDragAndDrop() 호출을 호출합니다. 리스너는 리스너가 성공적으로 실행되면 시스템에 불리언 true를 반환해야 합니다. 누락된 데이터를 처리합니다 : 이 단계는 사용자가 리스너가 드래그 이벤트를 수신하도록 등록된 View의 경계 상자 (감소 타겟) 사용자가 다른 영역에 드래그 섀도우를 놓으면 ACTION_DROP 드래그 이벤트가 전송되지 않습니다.
종료됨

사용자가 드래그 섀도우를 놓은 후, 그리고 시스템에서

작업 유형이 ACTION_DROP인 드래그 이벤트(필요한 경우 시스템) 작업 유형이 ACTION_DRAG_ENDED인 드래그 이벤트를 전송하여 드래그 앤 드롭 작업이 끝났습니다. 이 작업은 사용자가 드래그 섀도우를 놓습니다. 이벤트는 대기 중인 모든 리스너에게 리스너가 드래그 이벤트를 수신하도록 등록하더라도 ACTION_DROP 이벤트를 사용합니다.

각 단계는 드래그 앤 드롭 작업.

드래그 이벤트

시스템은 드래그 이벤트를 DragEvent 객체 형태로 전송합니다. 드래그 앤 드롭에서 발생하는 상황을 설명하는 작업 유형을 포함합니다. 프로세스입니다 작업 유형에 따라 객체는 다른 데이터를 포함할 수도 있습니다.

드래그 이벤트 리스너는 DragEvent 객체를 수신합니다. 작업 유형을 가져오려면 리스너가 DragEvent.getAction()을 호출합니다. DragEvent 클래스에 상수로 정의된 6개의 가능한 값이 있습니다. 다음 표 1에 설명되어 있습니다.

표 1. DragEvent 작업 유형

작업 유형 의미
ACTION_DRAG_STARTED 애플리케이션은 startDragAndDrop()를 호출하고 드래그 섀도우를 만듭니다. 리스너가 드래그 이벤트를 계속 수신하려는 경우 이 작업을 수행하려면 부울 true를 있습니다.
ACTION_DRAG_ENTERED 드래그 섀도우는 드래그 이벤트 리스너의 View 리스너가 리스너의 첫 번째 이벤트 드래그 섀도우가 경계 상자에 진입하면 수신됩니다.
ACTION_DRAG_LOCATION 이후에 ACTION_DRAG_ENTERED 이벤트에서 드래그 섀도우가 그대로 유지됨 드래그 이벤트 리스너의 경계 상자 내에서 View입니다.
ACTION_DRAG_EXITED ACTION_DRAG_ENTERED 및 1개 이상의 팔로우 중 ACTION_DRAG_LOCATION 이벤트가 발생하면 드래그 섀도우가 움직입니다. 드래그 이벤트 리스너의 경계 상자 밖을 View입니다.
ACTION_DROP 드래그 섀도우는 드래그 이벤트 리스너의 View 이 작업 유형은 View(으)로 전송됩니다. 리스너가 부울 값을 반환하는 경우에만 객체의 리스너 다음에 대한 응답: true ACTION_DRAG_STARTED 드래그 이벤트 이 작업 유형은 사용자가 View 위에 드래그 섀도우를 놓으면 전송됩니다. 누구의 리스너가 등록되지 않았거나 사용자가 드래그를 놓는 경우 현재 레이아웃의 일부가 아닌 항목 위에 그림자가 집니다.

다음과 같은 경우 리스너는 불리언 true를 반환합니다. 드롭이 성공적으로 처리됩니다. 그렇지 않으면 false

ACTION_DRAG_ENDED 시스템에서 드래그 앤 드롭 작업을 종료합니다. 이 작업 유형 ACTION_DROP 이벤트 전에 발생해야 하는 것은 아닙니다. 만약 시스템은 ACTION_DROP를 전송하여 ACTION_DRAG_ENDED 작업 유형이 다음을 의미하지 않습니다. 드롭에 성공했습니다. 리스너는 getResult(), 표 2와 같이 ACTION_DROP에 대한 응답으로 반환됩니다. 만약 ACTION_DROP 이벤트가 전송되지 않은 경우 getResult()false을 반환합니다.

DragEvent 객체에는 애플리케이션이 사용하는 데이터와 메타데이터도 포함되어 있습니다. startDragAndDrop() 호출에서 시스템에 제공합니다. 데이터의 일부는 표 2에 요약된 특정 작업 유형에만 유효합니다. 자세히 알아보기 관련 데이터에 대한 자세한 내용은 A 드래그 앤 드롭 작업을 지원합니다.

표 2. 작업 유형별 유효한 DragEvent 데이터

getAction()
getClipDescription()
getLocalState()
getX()
getY()
getClipData()
getResult()
ACTION_DRAG_STARTED ✓ ✓        
ACTION_DRAG_ENTERED ✓ ✓        
ACTION_DRAG_LOCATION ✓ ✓ ✓ ✓    
ACTION_DRAG_EXITED ✓ ✓        
ACTION_DROP ✓ ✓ ✓ ✓ ✓  
ACTION_DRAG_ENDED   ✓       ✓

DragEvent 메서드 getAction() describeContents()님, writeToParcel()님, 안녕하세요. 그리고 항상 toString()를 사용하세요 유효한 데이터를 반환합니다.

메서드가 특정 작업 유형에 유효한 데이터를 포함하지 않으면 다음을 반환합니다. 결과 유형에 따라 null 또는 0입니다.

드래그 섀도우

드래그 앤 드롭 작업 중에 시스템은 사용자가 드래그 데이터 이동 작업에서 이 이미지는 드래그되고 있는 데이터를 나타냅니다. 다른 작업의 경우 이미지는 드래그 작업의 특정 측면을 나타냅니다.

이 이미지를 드래그 섀도우라고 합니다. API는 개발자가 선언한 메서드를 사용하여 a View.DragShadowBuilder 객체를 지정합니다. 드래그 앤 드롭을 시작할 때 시스템에 빌더를 전달합니다. startDragAndDrop()를 사용하여 수행됩니다. 이에 대한 대응의 일환으로 startDragAndDrop(): 시스템은 View.DragShadowBuilder: 드래그 섀도우를 가져옵니다.

View.DragShadowBuilder 클래스에는 다음과 같은 두 가지 생성자가 있습니다.

View.DragShadowBuilder(View)

이 생성자는 애플리케이션의 모든 View 객체를 허용합니다. 생성자는 View 객체를 View.DragShadowBuilder 객체에 저장하므로 콜백은 이 객체에 액세스하여 드래그 섀도우를 생성할 수 있습니다. 뷰가 꼭 사용자가 드래그 작업을 시작하기 위해 선택하는 View입니다.

이 생성자를 사용하면 View.DragShadowBuilder를 확장하거나 빌더의 메서드를 재정의할 필요가 없습니다. 기본적으로 드래그 앤 드롭 인터페이스를 통해 인수로 전달하는 View와 모양이 동일한 그림자 사용자가 화면을 터치하는 위치 아래 중앙에 배치되도록 합니다.

View.DragShadowBuilder()

이 생성자를 사용하면 View 객체를 View.DragShadowBuilder 객체. 필드는 null로 설정됩니다. 연장해야 함 View.DragShadowBuilder를 열고 메서드를 재정의하지 않으면 다음과 같은 결과가 발생합니다. 드래그 섀도우가 보이지 않습니다. 시스템에서 오류가 발생하지 않습니다.

View.DragShadowBuilder 클래스에는 함께 드래그를 만드는 두 가지 메서드가 있습니다. 그림자:

onProvideShadowMetrics()

애플리케이션이 startDragAndDrop()을 호출한 직후 시스템은 이 메서드를 호출합니다. 메서드를 사용하여 드래그 섀도우의 크기와 터치 포인트를 시스템에 전송합니다. 이 메서드에는 다음과 같은 두 개의 매개변수가 있습니다.

outShadowSize: Point 객체를 지정합니다. 드래그 섀도우 너비는 x, 높이는 y

outShadowTouchPoint: Point 객체입니다. 터치 포인트는 드래그 섀도우 내에서 사용자의 손가락 아래에 있어야 합니다. X 위치는 x에 해당하고 Y 위치는 y에 해당합니다.

onDrawShadow()

onProvideShadowMetrics() 호출 직후, 시스템은 onDrawShadow()를 호출하여 드래그 섀도우를 만듭니다. 이 메서드에는 단일 인수, Canvas 객체 시스템은 사용자가 onProvideShadowMetrics()입니다. 이 메서드는 지정된 위치에 드래그 섀도우를 그립니다. Canvas

성능을 향상하려면 드래그 섀도우의 크기를 작게 유지합니다. 단일 아이콘을 사용하는 것이 좋습니다. 여러 항목을 선택하는 경우 화면 전체에 걸쳐 전체 이미지를 표시하기보다는 스택 형태로 아이콘을 사용합니다.

드래그 이벤트 리스너 및 콜백 메서드

View는 다음을 구현하는 드래그 이벤트 리스너와 함께 드래그 이벤트를 수신합니다. View.OnDragListener를 호출하거나 뷰의 onDragEvent() 콜백 메서드를 사용하여 호출할 수 있습니다. 날짜 시스템이 메서드나 리스너를 호출할 때 DragEvent 인수.

대부분의 경우 콜백 메서드보다 리스너를 사용하는 것이 더 좋습니다. UI를 설계할 때 일반적으로는 View 클래스의 서브클래스를 만들지 않지만, 콜백 메서드를 사용하면 서브클래스를 만들어 메서드를 재정의해야 합니다. 이와 달리 리스너는 하나의 리스너 클래스를 구현하여 여러 다른 View 객체에 사용할 수 있습니다. 익명 인라인 클래스로 구현할 수도 있습니다. 람다 표현식을 사용해야 합니다. View 객체의 리스너를 설정하려면 다음을 호출합니다. setOnDragListener()입니다.

또는 onDragEvent()의 기본 구현을 변경할 수 있습니다. 할 수 있습니다. 설정 OnReceiveContentListener 예를 들자면 자세한 내용은 setOnReceiveContentListener() 그러면 onDragEvent() 메서드가 기본적으로 다음을 실행합니다.

  • startDragAndDrop() 호출에 대한 응답으로 true를 반환합니다.
  • 통화수 performReceiveContent() 드래그 앤 드롭 데이터가 뷰에 드롭되는 경우 데이터는 메서드를 ContentInfo 객체로 전달합니다. 이 메서드는 OnReceiveContentListener를 호출합니다.

  • 드래그 앤 드롭 데이터가 뷰에 드롭되고 OnReceiveContentListener는 콘텐츠를 사용합니다.

OnReceiveContentListener를 정의하여 맞춤 데이터를 처리하세요. 있습니다. API 수준 24까지의 하위 호환성을 위해 OnReceiveContentListener

View 객체의 드래그 이벤트 리스너와 콜백 메서드를 다음과 같이 보유할 수 있습니다. 시스템에서 리스너를 먼저 호출합니다. 시스템은 콜백 메서드를 호출합니다.false

onDragEvent() 메서드와 View.OnDragListener의 조합은 다음과 같습니다. 인코더-디코더 아키텍처를 onTouchEvent()View.OnTouchListener 사용됩니다.