# DragStartHelper

Artifact: [androidx.core:core](https://developer.android.com/jetpack/androidx/releases/core) [View Source](https://cs.android.com/search?q=file:androidx/core/view/DragStartHelper.java+class:androidx.core.view.DragStartHelper) Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

*** ** * ** ***


```
public class DragStartHelper
```

<br />

*** ** * ** ***

DragStartHelper is a utility class for implementing drag and drop support.

It detects gestures commonly used to start drag (long click for any input source, click and drag for mouse).

It also keeps track of the screen location where the drag started, and helps determining the hot spot position for a drag shadow.

Implement `https://developer.android.com/reference/androidx/core/view/DragStartHelper.OnDragStartListener` to start the drag operation:

```
DragStartHelper.OnDragStartListener listener = new DragStartHelper.OnDragStartListener {
    protected void onDragStart(View view, DragStartHelper helper) {
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view) {
            public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
                super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);
                helper.getTouchPosition(shadowTouchPoint);
            }
        };
        view.startDrag(mClipData, shadowBuilder, mLocalState, mDragFlags);
    }
};
mDragStartHelper = new DragStartHelper(mDraggableView, listener);
```
Once created, DragStartHelper can be attached to a view (this will replace existing long click and touch listeners):

```
mDragStartHelper.attach();
```
It may also be used in combination with existing listeners:

```
public boolean onTouch(View view, MotionEvent event) {
    if (mDragStartHelper.onTouch(view, event)) {
        return true;
    }
    return handleTouchEvent(view, event);
}
public boolean onLongClick(View view) {
    if (mDragStartHelper.onLongClick(view)) {
        return true;
    }
    return handleLongClickEvent(view);
}
```

## Summary

| ### Nested types |
|---|
| `public interface https://developer.android.com/reference/androidx/core/view/DragStartHelper.OnDragStartListener` Interface definition for a callback to be invoked when a drag start gesture is detected. |

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/core/view/DragStartHelper#DragStartHelper(android.view.View,androidx.core.view.DragStartHelper.OnDragStartListener)( @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/view/View.html view, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/core/view/DragStartHelper.OnDragStartListener listener )` Create a DragStartHelper associated with the specified view. |

| ### Public methods |
|---|---|
| `void` | `@https://developer.android.com/reference/androidx/annotation/UiThread https://developer.android.com/reference/androidx/core/view/DragStartHelper#attach()()` Attach the helper to the view. |
| `void` | `@https://developer.android.com/reference/androidx/annotation/UiThread https://developer.android.com/reference/androidx/core/view/DragStartHelper#detach()()` Detach the helper from the view. |
| `void` | `https://developer.android.com/reference/androidx/core/view/DragStartHelper#getTouchPosition(android.graphics.Point)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/graphics/Point.html point)` Compute the position of the touch event that started the drag operation. |
| `boolean` | `https://developer.android.com/reference/androidx/core/view/DragStartHelper#onLongClick(android.view.View)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/view/View.html v)` Handle a long click event. |
| `boolean` | `https://developer.android.com/reference/androidx/core/view/DragStartHelper#onTouch(android.view.View,android.view.MotionEvent)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/view/View.html v, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/view/MotionEvent.html event)` Handle a touch event. |

## Public constructors

### DragStartHelper

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public DragStartHelper(
    @NonNull View view,
    @NonNull DragStartHelper.OnDragStartListener listener
)
```

Create a DragStartHelper associated with the specified view. The newly created helper is not initially attached to the view, `https://developer.android.com/reference/androidx/core/view/DragStartHelper#attach()` must be called explicitly.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/view/View.html view` | A View |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/core/view/DragStartHelper.OnDragStartListener listener` | listener for the drag events. |

## Public methods

### attach

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
@UiThread
public void attach()
```

Attach the helper to the view.

This will replace previously existing touch and long click listeners. This method must be called from the UI thread.

### detach

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
@UiThread
public void detach()
```

Detach the helper from the view.

This will reset touch and long click listeners to `null`. This method must be called from the UI thread.

### getTouchPosition

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public void getTouchPosition(@NonNull Point point)
```

Compute the position of the touch event that started the drag operation.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/graphics/Point.html point` | The position of the touch event that started the drag operation. |

### onLongClick

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public boolean onLongClick(@NonNull View v)
```

Handle a long click event.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/view/View.html v` | The view that was clicked and held. |

| Returns |
|---|---|
| `boolean` | true if the callback consumed the long click, false otherwise. |

### onTouch

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/core#1.1.0)

```
public boolean onTouch(@NonNull View v, @NonNull MotionEvent event)
```

Handle a touch event.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/view/View.html v` | The view the touch event has been dispatched to. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/view/MotionEvent.html event` | The MotionEvent object containing full information about the event. |

| Returns |
|---|---|
| `boolean` | True if the listener has consumed the event, false otherwise. |