1b10b48f62d3cac684424e4181d4e8ec61f227e95Scott Mainpage.title=Drag and Drop
233baa5ad7d8cdcc89ce4fbc3bc8cd537d5f5d639Joe Fernandezpage.tags=clipdata,dragevent,onlongclicklistener
3dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin@jd:body
42a1b706ec11e53689a2f86cc8e558e74591b462aScott Main
5dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<div id="qv-wrapper">
6dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <div id="qv">
7dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <h2>Quickview</h2>
8dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <ul>
9dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <li>
10dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    Allow users to move data within your Activity layout using graphical gestures.
11dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                </li>
12dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <li>
13dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    Supports operations besides data movement.
14dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                </li>
15dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <li>
16dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    Only works within a single application.
17dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                </li>
18dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <li>
19dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    Requires API 11.
20dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                </li>
21dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </ul>
22dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <h2>In this document</h2>
23dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <ol>
24dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
25dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <a href="#AboutDragging">Overview</a>
26dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <ol>
27dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
28dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#DragDropLifecycle">The drag/drop process</a>
29dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
30dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
31dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#AboutDragListeners">The drag event listener and callback method</a>
32dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
33dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
34dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#AboutDragEvent">Drag events</a>
35dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
36dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
37dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#AboutDragShadowBuilder">
38dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        The drag shadow</a>
39dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
40dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                </ol>
41dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
42dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
43dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <a href="#DesignDragOperation">Designing a Drag and Drop Operation</a>
44dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <ol>
45dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
46dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#StartDrag">Starting a drag</a>
47dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
48dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
49dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#HandleStart">Responding to a drag start</a>
50dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
51dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
52dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#HandleDuring">Handling events during the drag</a>
53dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
54dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
55dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#HandleDrop">Responding to a drop</a>
56dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
57dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
58dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#HandleEnd">Responding to a drag end</a>
59dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
60dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    <li>
61dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        <a href="#RespondEventSample">Responding to drag events: an example</a>
62dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    </li>
63dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                </ol>
64dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
65dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </ol>
66dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <h2>Key classes</h2>
67dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <ol>
68dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
69dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.view.View View}
70dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
71dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
72dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.view.View.OnLongClickListener OnLongClickListener}
73dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
74dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
75dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.view.View.OnDragListener OnDragListener}
76dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
77dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
78dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.view.DragEvent DragEvent}
79dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
80dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
81dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.view.View.DragShadowBuilder DragShadowBuilder}
82dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
83dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
84dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.content.ClipData ClipData}
85dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
86dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
87dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.content.ClipDescription ClipDescription}
88dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
89dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </ol>
90dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <h2>Related Samples</h2>
91dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <ol>
92dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
9364c757481050855fbf5557ef14bebd696b9adac0Scott Main                <a href="{@docRoot}resources/samples/HoneycombGallery/index.html">
9464c757481050855fbf5557ef14bebd696b9adac0Scott Main                Honeycomb Gallery</a>.
95dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
96dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
97dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/DragAndDropDemo.html">
98dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe MalinDragAndDropDemo.java</a> and
99dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/DraggableDot.html">
100dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe MalinDraggableDot.java</a> in <a href="{@docRoot}resources/samples/ApiDemos/index.html">Api Demos</a>.
101dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
102dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </ol>
103dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <h2>See also</h2>
104dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <ol>
105dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
106dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <a href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a>
107dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
108dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <li>
109b10b48f62d3cac684424e4181d4e8ec61f227e95Scott Main                <a href="{@docRoot}guide/topics/ui/ui-events.html">Input Events</a>
110dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </li>
111dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </ol>
112dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </div>
113dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</div>
114dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
115dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    With the Android drag/drop framework, you can allow your users to move data
116dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    from one View to another View in the current layout using a graphical drag and drop gesture.
117dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The framework includes a drag event class, drag listeners, and helper methods and classes.
118dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
119dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
120dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Although the framework is primarily designed for data movement, you can use
121dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    it for other UI actions. For example, you could create an app that mixes colors when the user
122dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    drags a color icon over another icon. The rest of this topic, however, describes the
123dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    framework in terms of data movement.
124dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
125dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h2 id="AboutDragging">Overview</h2>
126dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
127dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    A drag and drop operation starts when the user makes some gesture that you recognize as a
128dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    signal to start dragging data. In response, your application tells the system that the drag is
129dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    starting. The system calls back to your application to get a representation of the data
130dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    being dragged. As the user's finger moves this representation (a &quot;drag shadow&quot;)
131dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    over the current layout, the system sends drag events to the drag event listener objects and
132dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    drag event callback methods associated with the {@link android.view.View} objects in the layout.
133dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Once the user releases the drag shadow, the system ends the drag operation.
134dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
135dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
136dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    You create a drag event listener object (&quot;listeners&quot;) from a class that implements
137dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View.OnDragListener}. You set the drag event listener object for a View
138dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    with the View object's
139dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View#setOnDragListener(View.OnDragListener) setOnDragListener()} method.
140dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Each View object also has a {@link android.view.View#onDragEvent(DragEvent) onDragEvent()}
141dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    callback method. Both of these are described in more detail in the section
142dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <a href="#AboutDragListeners">The drag event listener and callback method</a>.
143dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
144dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p class="note">
145dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <strong>Note</strong>: For the sake of simplicity, the following sections refer to the routine
146dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    that receives drag events as the &quot;drag event listener&quot;, even though it may actually
147dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    be a callback method.
148dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
149dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
150dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    When you start a drag, you include both the data you are moving and metadata describing this
151dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    data as part of the call to the system. During the drag, the system sends drag events to the
152dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    drag event listeners or callback methods of each View in the layout. The listeners or callback
153dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    methods can use the metadata to decide if they want to accept the data when it is dropped.
154dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    If the user drops the data over a View object, and that View object's listener or callback
155dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    method has previously told the system that it wants to accept the drop, then the system sends
156dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    the data to the listener or callback method in a drag event.
157dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
158dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
159dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Your application tells the system to start a drag by calling the
160dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()}
161dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    method. This tells the system to start sending drag events. The method also sends the data that
162dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    you are dragging.
163dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
164dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
165dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    You can call
166dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()}
167dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    for any attached View in the current layout. The system only uses the View object to get access
168dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    to global settings in your layout.
169dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
170dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
171dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Once your application calls
172dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()},
173dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    the rest of the process uses events that the system sends to the View objects in your current
174dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    layout.
175dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
176dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="DragDropLifecycle">The drag/drop process</h3>
177dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
178dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    There are basically four steps or states in the drag and drop process:
179dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
180dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<dl>
181dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dt>
182dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <em>Started</em>
183dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dt>
184dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dd>
185dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        In response to the user's gesture to begin a drag, your application calls
186dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()}
187dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        to tell the system to start a drag. The arguments
188dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()}
189dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        provide the data to be dragged, metadata for this data, and a callback for drawing the
190dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        drag shadow.
191dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <p>
192dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            The system first responds by calling back to your application to get a drag shadow. It
193dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            then displays the drag shadow on the device.
194dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </p>
195dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <p>
196dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            Next, the system sends a drag event with action type
197dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#ACTION_DRAG_STARTED} to the drag event listeners for
198dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            all the View objects in the current layout. To continue to receive drag events,
199dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            including a possible drop event, a drag event listener must return <code>true</code>.
200dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            This registers the listener with the system. Only registered listeners continue to
201dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            receive drag events. At this point, listeners can also change the appearance of their
202dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            View object to show that the listener can accept a drop event.
203dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </p>
204dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <p>
205dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            If the drag event listener returns <code>false</code>, then it will not receive drag
206dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            events for the current operation until the system sends a drag event with action type
207dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#ACTION_DRAG_ENDED}. By sending <code>false</code>, the
208dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            listener tells the system that it is not interested in the drag operation and
209dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            does not want to accept the dragged data.
210dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </p>
211dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dd>
212dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dt>
213dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <em>Continuing</em>
214dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dt>
215dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dd>
216dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The user continues the drag. As the drag shadow intersects the bounding box of a View
217dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        object, the system sends one or more drag events to the View object's drag event
218dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        listener (if it is registered to receive events). The listener may choose to
219dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        alter its View object's appearance in response to the event. For example, if the event
220dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        indicates that the drag shadow has entered the bounding box of the View
221dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        (action type {@link android.view.DragEvent#ACTION_DRAG_ENTERED}), the listener
222dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        can react by highlighting its View.
223dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dd>
224dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dt>
225dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <em>Dropped</em>
226dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dt>
227dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dd>
228dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The user releases the drag shadow within the bounding box of a View that can accept the
229dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        data. The system sends the View object's listener a drag event with action type
230dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DROP}. The drag event contains the data that was
231dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        passed to the system in the call to
232dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()}
233dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        that started the operation. The listener is expected to return boolean <code>true</code> to
234dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        the system if code for accepting the drop succeeds.
235dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <p>
236dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            Note that this step only occurs if the user drops the drag shadow within the bounding
237dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            box of a View whose listener is registered to receive drag events. If the user releases
238dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            the drag shadow in any other situation, no {@link android.view.DragEvent#ACTION_DROP}
239dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            drag event is sent.
240dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </p>
241dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dd>
242dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dt>
243dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <em>Ended</em>
244dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dt>
245dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dd>
246dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        After the user releases the drag shadow, and after the system sends out (if necessary)
247dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        a drag event with action type {@link android.view.DragEvent#ACTION_DROP}, the system sends
248dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        out a drag event with action type {@link android.view.DragEvent#ACTION_DRAG_ENDED} to
249dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        indicate that the drag operation is over. This is done regardless of where the user released
250dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        the drag shadow. The event is sent to every listener that is registered to receive drag
251dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        events, even if the listener received the {@link android.view.DragEvent#ACTION_DROP} event.
252dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dd>
253dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</dl>
254dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
255dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Each of these four steps is described in more detail in the section
256dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <a href="#DesignDragOperation">Designing a Drag and Drop Operation</a>.
257dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
258dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="AboutDragListeners">The drag event listener and callback method</h3>
259dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
260dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    A View receives drag events with either a drag event listener that implements
261dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View.OnDragListener} or with its
262dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View#onDragEvent(DragEvent)} callback method.
263dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    When the system calls the method or listener, it passes to them
264dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    a {@link android.view.DragEvent} object.
265dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
266dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
267dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    You will probably want to use the listener in most cases. When you design UIs, you usually
268dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    don't subclass View classes, but using the callback method forces you to do this in order to
269dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    override the method. In comparison, you can implement one listener class and then use it with
270dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    several different View objects. You can also implement it as an anonymous inline class. To
271dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    set the listener for a View object, call
272dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin{@link android.view.View#setOnDragListener(android.view.View.OnDragListener) setOnDragListener()}.
273dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
274dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
275dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    You can have both a listener and a callback method for View object. If this occurs,
276dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    the system first calls the listener. The system doesn't call the callback method unless the
277dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    listener returns <code>false</code>.
278dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
279dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
280dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The combination of the {@link android.view.View#onDragEvent(DragEvent)} method and
281dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View.OnDragListener} is analogous to the combination
282dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    of the {@link android.view.View#onTouchEvent(MotionEvent) onTouchEvent()} and
283dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View.OnTouchListener} used with touch events.
284dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
285dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="AboutDragEvent">Drag events</h3>
286dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
287dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The system sends out a drag event in the form of a {@link android.view.DragEvent} object. The
288dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    object contains an action type that tells the listener what is happening in the drag/drop
289dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    process. The object contains other data, depending on the action type.
290dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
291dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
292dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    To get the action type, a listener calls {@link android.view.DragEvent#getAction()}. There
293dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    are six possible values, defined by constants in the {@link android.view.DragEvent} class. These
29413033ea52714d48d754c6bc8fccb18514c645a47Scott Main    are listed in <a href="#table1">table 1</a>.
295dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
296dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
297dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The {@link android.view.DragEvent} object also contains the data that your application provided
298dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    to the system in the call to
299dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()}.
300dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Some of the data is valid only for certain action types. The data that is valid for each action
30113033ea52714d48d754c6bc8fccb18514c645a47Scott Main    type is summarized in <a href="#table2">table 2</a>. It is also described in detail with
302dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    the event for which it is valid in the section
303dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <a href="#DesignDragOperation">Designing a Drag and Drop Operation</a>.
304dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
305dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p class="table-caption" id="table1">
306dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin  <strong>Table 1.</strong> DragEvent action types
307dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
308dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<table>
309dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
310dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <th scope="col">getAction() value</th>
311dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <th scope="col">Meaning</th>
312dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
313dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
314dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_STARTED}</td>
315dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>
316dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            A View object's drag event listener receives this event action type just after the
317dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            application calls
318dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin{@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()} and
319dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            gets a drag shadow.
320dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </td>
321dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
322dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
323dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_ENTERED}</td>
324dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>
325dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            A View object's drag event listener receives this event action type when the drag shadow
326dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            has just entered the bounding box of the View. This is the first event action type the
327dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            listener receives when the drag shadow enters the bounding box. If the listener wants to
328dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            continue receiving drag events for this operation, it must return boolean
329dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <code>true</code> to the system.
330dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </td>
331dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
332dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
333dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_LOCATION}</td>
334dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>
335dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            A View object's drag event listener receives this event action type after it receives a
336dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#ACTION_DRAG_ENTERED} event while the drag shadow is
337dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            still within the bounding box of the View.
338dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </td>
339dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
340dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
341dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_EXITED}</td>
342dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>
343dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            A View object's drag event listener receives this event action type after it receives a
344dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#ACTION_DRAG_ENTERED} and at least one
345dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#ACTION_DRAG_LOCATION} event, and after the user has moved
346dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            the drag shadow outside the bounding box of the View.
347dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </td>
348dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
349dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
350dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DROP}</td>
351dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>
352dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            A View object's drag event listener receives this event action type when the user
353dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            releases the drag shadow over the View object. This action type is only sent to a View
354dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            object's listener if the listener returned boolean <code>true</code> in response to the
355dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#ACTION_DRAG_STARTED} drag event. This action type is not
356dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            sent if the user releases the drag shadow on a View whose listener is not registered,
357dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            or if the user releases the drag shadow on anything that is not part of the current
358dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            layout.
359dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <p>
360dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                The listener is expected to return boolean <code>true</code> if it successfully
361dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                processes the drop. Otherwise, it should return <code>false</code>.
362dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </p>
363dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </td>
364dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
365dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
366dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_ENDED}</td>
367dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>
368dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            A View object's drag event listener receives this event action type
369dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            when the system is ending the drag operation. This action type is not necessarily
370dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            preceded by an {@link android.view.DragEvent#ACTION_DROP} event. If the system sent
371dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            a {@link android.view.DragEvent#ACTION_DROP}, receiving the
372dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#ACTION_DRAG_ENDED} action type does not imply that the
373dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            drop operation succeeded. The listener must call
374dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#getResult()} to get the value that was
375dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            returned in response to {@link android.view.DragEvent#ACTION_DROP}. If an
376dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#ACTION_DROP} event was not sent, then
377dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#getResult()} returns <code>false</code>.
378dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </td>
379dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
380dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</table>
381dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p class="table-caption" id="table2">
382dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin  <strong>Table 2.</strong> Valid DragEvent data by action type</p>
383dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<table>
384dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
385dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <th scope="col">{@link android.view.DragEvent#getAction()} value</th>
386dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <th scope="col">{@link android.view.DragEvent#getClipDescription()} value</th>
387dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <th scope="col">{@link android.view.DragEvent#getLocalState()} value</th>
388dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <th scope="col">{@link android.view.DragEvent#getX()} value</th>
389dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <th scope="col">{@link android.view.DragEvent#getY()} value</th>
390dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <th scope="col">{@link android.view.DragEvent#getClipData()} value</th>
391dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <th scope="col">{@link android.view.DragEvent#getResult()} value</th>
392dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
393dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
394dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_STARTED}</td>
395dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
396dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
397dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
398dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
399dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
400dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
401dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
402dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
403dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_ENTERED}</td>
404dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
405dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
406dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
407dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
408dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
409dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
410dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
411dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
412dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_LOCATION}</td>
413dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
414dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
415dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
416dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
417dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
418dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
419dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
420dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
421dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_EXITED}</td>
422dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
423dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
424dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
425dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
426dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
427dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
428dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
429dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
430dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DROP}</td>
431dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
432dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
433dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
434dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
435dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
436dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
437dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
438dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <tr>
439dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td>{@link android.view.DragEvent#ACTION_DRAG_ENDED}</td>
440dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
441dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
442dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
443dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
444dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">&nbsp;</td>
445dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <td style="text-align: center;">X</td>
446dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </tr>
447dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</table>
448dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
449dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The {@link android.view.DragEvent#getAction()},
450dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.DragEvent#describeContents()},
451dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.DragEvent#writeToParcel(Parcel,int) writeToParcel()}, and
452dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.DragEvent#toString()} methods always return valid data.
453dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
454dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
455dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    If a method does not contain valid data for a particular action type, it returns either
456dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <code>null</code> or 0, depending on its result type.
457dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
458dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="AboutDragShadowBuilder">
459dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The drag shadow
460dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</h3>
461dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
462dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    During a drag and drop operation, the system displays a image that the user drags.
463dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    For data movement, this image represents the data being dragged. For other operations, the
464dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    image represents some aspect of the drag operation.
465dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
466dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
467dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The image is called a drag shadow. You create it with methods you declare for a
468dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View.DragShadowBuilder} object, and then pass it to the system when you
469dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    start a drag using
470dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()}.
471dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    As part of its response to
472dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()},
473dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    the system invokes the callback methods you've defined in
474dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.View.DragShadowBuilder} to obtain a drag shadow.
475dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
476dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
477dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The {@link android.view.View.DragShadowBuilder} class has two constructors:
478dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
479dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dl>
480dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dt>{@link android.view.View.DragShadowBuilder#View.DragShadowBuilder(View)}</dt>
481dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dd>
482dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        This constructor accepts any of your application's
483dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.View} objects. The constructor stores the View object
484dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        in the {@link android.view.View.DragShadowBuilder} object, so during
485dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        the callback you can access it as you construct your drag shadow.
486dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        It doesn't have to be associated with the View (if any) that the user
487dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        selected to start the drag operation.
488dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <p>
489dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            If you use this constructor, you don't have to extend
490dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.View.DragShadowBuilder} or override its methods. By default,
491dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            you will get a drag shadow that has the same appearance as the View you pass as an
492dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            argument, centered under the location where the user is touching the screen.
493dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </p>
494dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dd>
495dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dt>{@link android.view.View.DragShadowBuilder#View.DragShadowBuilder()}</dt>
496dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dd>
497dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        If you use this constructor, no View object is available in the
498dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.View.DragShadowBuilder} object (the field is set to <code>null</code>).
499dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        If you use this constructor, and you don't extend
500dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.View.DragShadowBuilder} or override its methods,
501dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        you will get an invisible drag shadow.
502dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The system does <em>not</em> give an error.
503dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dd>
504dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</dl>
505dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
506dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The {@link android.view.View.DragShadowBuilder} class has two methods:
507dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
508dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<dl>
509dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dt>
510dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin{@link android.view.View.DragShadowBuilder#onProvideShadowMetrics(Point,Point) onProvideShadowMetrics()}
511dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dt>
512dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dd>
513dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The system calls this method immediately after you call
514dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin{@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()}. Use it
515dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        to send to the system the dimensions and touch point of the drag shadow. The method has two
516dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        arguments:
517dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <dl>
518dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <dt><em>dimensions</em></dt>
519dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <dd>
520dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                A {@link android.graphics.Point} object. The drag shadow width goes in
521dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.graphics.Point#x} and its height goes in
522dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.graphics.Point#y}.
523dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </dd>
524dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <dt><em>touch_point</em></dt>
525dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <dd>
526dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                A {@link android.graphics.Point} object. The touch point is the location within the
527dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                drag shadow that should be under the user's finger during the drag. Its X
528dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                position goes in {@link android.graphics.Point#x} and its Y position goes in
529dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                {@link android.graphics.Point#y}
530dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            </dd>
531dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </dl>
532dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dd>
533dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dt>
534dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin       {@link android.view.View.DragShadowBuilder#onDrawShadow(Canvas) onDrawShadow()}
535dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dt>
536dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <dd>
537dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        Immediately after the call to
538dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin{@link android.view.View.DragShadowBuilder#onProvideShadowMetrics(Point,Point) onProvideShadowMetrics()}
539dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        the system calls
540dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.View.DragShadowBuilder#onDrawShadow(Canvas) onDrawShadow()} to get the
541dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        drag shadow itself. The method has a single argument, a {@link android.graphics.Canvas}
542dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        object that the system constructs from the parameters you provide in
543dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin{@link android.view.View.DragShadowBuilder#onProvideShadowMetrics(Point,Point) onProvideShadowMetrics()}
544dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        Use it to draw the drag shadow in the provided {@link android.graphics.Canvas} object.
545dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </dd>
546dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</dl>
547dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
548dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    To improve performance, you should keep the size of the drag shadow small. For a single item,
549dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    you may want to use a icon. For a multiple selection, you may want to use icons in a stack
550dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    rather than full images spread out over the screen.
551dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
552dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h2 id="DesignDragOperation">Designing a Drag and Drop Operation</h2>
553dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
554dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    This section shows step-by-step how to start a drag, how to respond to events during
555dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    the drag, how respond to a drop event, and how to end the drag and drop operation.
556dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
557dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="StartDrag">Starting a drag</h3>
558dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
559dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The user starts a drag with a drag gesture, usually a long press, on a View object.
560dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    In response, you should do the following:
561dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
562dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<ol>
563dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin     <li>
564dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        As necessary, create a {@link android.content.ClipData} and
565dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.content.ClipData.Item} for the data being moved. As part of the
566dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        ClipData object, supply metadata that is stored in a {@link android.content.ClipDescription}
567dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        object within the ClipData. For a drag and drop operation that does not represent data
568dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        movement, you may want to use <code>null</code> instead of an actual object.
569dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <p>
570dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            For example, this code snippet shows how to respond to a long press on a ImageView
571dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            by creating a ClipData object that contains the tag or label of an
572dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            ImageView. Following this snippet, the next snippet shows how to override the methods in
573dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.View.DragShadowBuilder}:
574dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </p>
575dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<pre>
576dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin// Create a string for the ImageView label
577dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malinprivate static final String IMAGEVIEW_TAG = &quot;icon bitmap&quot;
578dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
579dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin// Creates a new ImageView
580dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe MalinImageView imageView = new ImageView(this);
581dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
582dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin// Sets the bitmap for the ImageView from an icon bit map (defined elsewhere)
583dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe MalinimageView.setImageBitmap(mIconBitmap);
584dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
585dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin// Sets the tag
586dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe MalinimageView.setTag(IMAGEVIEW_TAG);
587dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
588dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    ...
589dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
590dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin// Sets a long click listener for the ImageView using an anonymous listener object that
591dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin// implements the OnLongClickListener interface
592dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe MalinimageView.setOnLongClickListener(new View.OnLongClickListener() {
593dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
594dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // Defines the one method for the interface, which is called when the View is long-clicked
595dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    public boolean onLongClick(View v) {
596dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
597dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // Create a new ClipData.
598dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // This is done in two steps to provide clarity. The convenience method
599dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // ClipData.newPlainText() can create a plain text ClipData in one step.
600dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
601dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // Create a new ClipData.Item from the ImageView object's tag
602dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    ClipData.Item item = new ClipData.Item(v.getTag());
603dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
604dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // Create a new ClipData using the tag as a label, the plain text MIME type, and
605dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // the already-created item. This will create a new ClipDescription object within the
606dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // ClipData, and set its MIME type entry to &quot;text/plain&quot;
607dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    ClipData dragData = new ClipData(v.getTag(),ClipData.MIMETYPE_TEXT_PLAIN,item);
608dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
609dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // Instantiates the drag shadow builder.
61067970e8aa0ab1a8eb537e5fbbe09f87d8d7edde8Joe Malin    View.DragShadowBuilder myShadow = new MyDragShadowBuilder(imageView);
611dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
612dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // Starts the drag
613dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
614dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            v.startDrag(dragData,  // the data to be dragged
615dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        myShadow,  // the drag shadow builder
616dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        null,      // no need to use local data
617dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                        0          // flags (not currently used, set to 0)
618dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            );
619dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
620dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    }
621dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin}
622dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</pre>
623dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
624dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
625dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The following code snippet defines {@code myDragShadowBuilder}
626dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        It creates a drag shadow for dragging a TextView as a small gray rectangle:
627dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<pre>
628dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    private static class MyDragShadowBuilder extends View.DragShadowBuilder {
629dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
630dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // The drag shadow image, defined as a drawable thing
631dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    private static Drawable shadow;
632dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
633dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        // Defines the constructor for myDragShadowBuilder
634dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        public MyDragShadowBuilder(View v) {
635dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
636dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Stores the View parameter passed to myDragShadowBuilder.
637dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            super(v);
638dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
639dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Creates a draggable image that will fill the Canvas provided by the system.
640dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            shadow = new ColorDrawable(Color.LTGRAY);
641dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        }
642dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
643dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        // Defines a callback that sends the drag shadow dimensions and touch point back to the
644dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        // system.
645dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        &#64;Override
646dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        public void onProvideShadowMetrics (Point size, Point touch)
647dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Defines local variables
648dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            private int width, height;
649dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
650dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Sets the width of the shadow to half the width of the original View
651dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            width = getView().getWidth() / 2;
652dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
653dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Sets the height of the shadow to half the height of the original View
654dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            height = getView().getHeight() / 2;
655dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
656dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // The drag shadow is a ColorDrawable. This sets its dimensions to be the same as the
657dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Canvas that the system will provide. As a result, the drag shadow will fill the
658dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Canvas.
659dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            shadow.setBounds(0, 0, width, height);
660dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
661dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Sets the size parameter's width and height values. These get back to the system
662dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // through the size parameter.
663dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            size.set(width, height);
664dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
665dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Sets the touch point's position to be in the middle of the drag shadow
666dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            touch.set(width / 2, height / 2);
667dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        }
668dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
669dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        // Defines a callback that draws the drag shadow in a Canvas that the system constructs
670dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        // from the dimensions passed in onProvideShadowMetrics().
671dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        &#64;Override
672dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        public void onDrawShadow(Canvas canvas) {
673dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
674dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            // Draws the ColorDrawable in the Canvas passed in from the system.
675dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            shadow.draw(canvas);
676dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        }
677dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    }
678dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</pre>
679dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <p class="note">
680dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            <strong>Note:</strong> Remember that you don't have to extend
681dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.View.DragShadowBuilder}. The constructor
682dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.View.DragShadowBuilder#View.DragShadowBuilder(View)} creates a
683dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            default drag shadow that's the same size as the View argument passed to it, with the
684dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            touch point centered in the drag shadow.
685dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </p>
686dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
687dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</ol>
688dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="HandleStart">Responding to a drag start</h3>
689dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
690dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    During the drag operation, the system dispatches drag events to the drag event listeners
691dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    of the View objects in the current layout. The listeners should react
692dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    by calling {@link android.view.DragEvent#getAction()} to get the action type.
693dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    At the start of a drag, this methods returns {@link android.view.DragEvent#ACTION_DRAG_STARTED}.
694dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
695dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
696dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    In response to an event with the action type {@link android.view.DragEvent#ACTION_DRAG_STARTED},
697dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    a listener should do the following:
698dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
699dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<ol>
700dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
701dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        Call {@link android.view.DragEvent#getClipDescription()} to get the
702dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.content.ClipDescription}. Use the MIME type methods in
703dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.content.ClipDescription} to see if the listener can accept the data being
704dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        dragged.
705dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <p>
706dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            If the drag and drop operation does not represent data movement, this may not be
707dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            necessary.
708dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </p>
709dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
710dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
711dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        If the listener can accept a drop, it should return <code>true</code>. This tells
712dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        the system to continue to send drag events to the listener.
713dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        If it can't accept a drop, it should return <code>false</code>, and the system
714dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        will stop sending drag events until it sends out
715dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_ENDED}.
716dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
717dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</ol>
718dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
719dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Note that for an {@link android.view.DragEvent#ACTION_DRAG_STARTED} event, these
720dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    the following {@link android.view.DragEvent} methods are not valid:
721dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.DragEvent#getClipData()}, {@link android.view.DragEvent#getX()},
722dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.DragEvent#getY()}, and {@link android.view.DragEvent#getResult()}.
723dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
724dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="HandleDuring">Handling events during the drag</h3>
725dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
726dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    During the drag, listeners that returned <code>true</code> in response to
727dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    the {@link android.view.DragEvent#ACTION_DRAG_STARTED} drag event continue to receive drag
728dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    events. The types of drag events a listener receives during the drag depend on the location of
729dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    the drag shadow and the visibility of the listener's View.
730dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
731dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
732dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    During the drag, listeners primarily use drag events to decide if they should change the
733dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    appearance of their View.
734dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
735dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
736dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    During the drag, {@link android.view.DragEvent#getAction()} returns one of three
737dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    values:
738dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
739dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<ul>
740dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
741dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_ENTERED}:
742dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The listener receives this when the touch point
743dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        (the point on the screen underneath the user's finger) has entered the bounding box of the
744dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        listener's View.
745dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
746dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
747dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_LOCATION}: Once the listener receives an
748dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_ENTERED} event, and before it receives an
749dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        A{@link android.view.DragEvent#ACTION_DRAG_EXITED} event, it receives a new
750dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_LOCATION} event every time the touch point moves.
751dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The {@link android.view.DragEvent#getX()} and {@link android.view.DragEvent#getY()} methods
75276dfc02135abae5337b48fe99a1b8c0a7d95e33akmccormick        return the X and Y coordinates of the touch point.
753dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
754dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
755dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_EXITED}:  This event is sent to a listener that
756dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        previously received {@link android.view.DragEvent#ACTION_DRAG_ENTERED}, after
757dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        the drag shadow is no longer within the bounding box of the listener's View.
758dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
759dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</ul>
760dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
761dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The listener does not need to react to any of these action types. If the listener returns a
762dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    value to the system, it is ignored. Here are some guidelines for responding to each of
763dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    these action types:
764dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
765dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<ul>
766dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
767dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        In response to {@link android.view.DragEvent#ACTION_DRAG_ENTERED} or
768dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_LOCATION}, the listener can change the appearance
769dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        of the View to indicate that it is about to receive a drop.
770dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
771dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
772dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        An event with the action type {@link android.view.DragEvent#ACTION_DRAG_LOCATION} contains
773dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        valid data for {@link android.view.DragEvent#getX()} and
774dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#getY()}, corresponding to the location of the touch point.
775dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The listener may want to use this information to alter the appearance of that part of the
776dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        View that is at the touch point. The listener can also use this information
777dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        to determine the exact position where the user is going to drop the drag shadow.
778dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
779dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
780dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        In response to {@link android.view.DragEvent#ACTION_DRAG_EXITED}, the listener should reset
781dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        any appearance changes it applied in response to
782dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_ENTERED} or
783dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_LOCATION}. This indicates to the user that
784dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        the View is no longer an imminent drop target.
785dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
786dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</ul>
787dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="HandleDrop">Responding to a drop</h3>
788dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
789dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    When the user releases the drag shadow on a View in the application, and that View previously
790dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    reported that it could accept the content being dragged, the system dispatches a drag event
791dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    to that View with the action type {@link android.view.DragEvent#ACTION_DROP}. The listener
792dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    should do the following:
793dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
794dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<ol>
795dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
796dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        Call {@link android.view.DragEvent#getClipData()} to get the
797dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.content.ClipData} object that was originally supplied in the call
798dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        to
799dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin{@link android.view.View#startDrag(ClipData, View.DragShadowBuilder, Object, int) startDrag()}
800dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        and store it. If the drag and drop operation does not represent data movement,
801dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        this may not be necessary.
802dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
803dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
804dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        Return boolean <code>true</code> to indicate that the drop was processed successfully, or
805dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        boolean <code>false</code> if it was not. The returned value becomes the value returned by
806dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#getResult()} for an
807dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DRAG_ENDED} event.
808dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        <p>
809dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            Note that if the system does not send out an {@link android.view.DragEvent#ACTION_DROP}
810dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            event, the value of {@link android.view.DragEvent#getResult()} for an
811dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            {@link android.view.DragEvent#ACTION_DRAG_ENDED} event is <code>false</code>.
812dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        </p>
813dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
814dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</ol>
815dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
816dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    For an {@link android.view.DragEvent#ACTION_DROP} event,
817dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.DragEvent#getX()} and {@link android.view.DragEvent#getY()}
818dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    return the X and Y position of the drag point at the moment of the drop, using the coordinate
819dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    system of the View that received the drop.
820dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
821dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
822dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    The system does allow the user to release the drag shadow on a View whose listener is not
823dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    receiving drag events. It will also allow the user to release the drag shadow
824dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    on empty regions of the application's UI, or on areas outside of your application.
825dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    In all of these cases, the system does not send an event with action type
826dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.DragEvent#ACTION_DROP}, although it does send out an
827dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.DragEvent#ACTION_DRAG_ENDED} event.
828dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
829dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="HandleEnd">Responding to a drag end</h3>
830dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
831dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Immediately after the user releases the drag shadow, the system sends a
832dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    drag event to all of the drag event listeners in your application, with an action type of
833dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    {@link android.view.DragEvent#ACTION_DRAG_ENDED}. This indicates that the drag operation is
834dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    over.
835dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
836dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
837dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    Each listener should do the following:
838dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
839dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<ol>
840dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
841dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        If listener changed its View object's appearance during the operation, it should reset the
842dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        View to its default appearance. This is a visual indication to the user that the operation
843dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        is over.
844dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
845dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
846dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The listener can optionally call {@link android.view.DragEvent#getResult()} to find out more
847dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        about the operation. If a listener returned <code>true</code> in response to an event of
848dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        action type {@link android.view.DragEvent#ACTION_DROP}, then
849dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#getResult()} will return boolean <code>true</code>. In all
850dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        other cases, {@link android.view.DragEvent#getResult()} returns boolean <code>false</code>,
851dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        including any case in which the system did not send out a
852dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        {@link android.view.DragEvent#ACTION_DROP} event.
853dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
854dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    <li>
855dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        The listener should return boolean <code>true</code> to the system.
856dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    </li>
857dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</ol>
858dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
859dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
860dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<h3 id="RespondEventSample">Responding to drag events: an example</h3>
861dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<p>
862dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    All drag events are initially received by your drag event method or listener. The following
863dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    code snippet is a simple example of reacting to drag events in a listener:
864dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin</p>
865dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin<pre>
866dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin// Creates a new drag event listener
867dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe MalinmDragListen = new myDragEventListener();
868dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
869dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe MalinView imageView = new ImageView(this);
870dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
871dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin// Sets the drag event listener for the View
872dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe MalinimageView.setOnDragListener(mDragListen);
873dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
874dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin...
875dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
876130e1294e8aead233911e7895cedb63af5752519Taeho Kimprotected class myDragEventListener implements View.OnDragListener {
877dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
878dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // This is the method that the system calls when it dispatches a drag event to the
879dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    // listener.
880dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin    public boolean onDrag(View v, DragEvent event) {
881dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
882dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        // Defines a variable to store the action type for the incoming event
883dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        final int action = event.getAction();
884dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
885dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        // Handles each of the expected events
886dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin        switch(action) {
887dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
888dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin            case DragEvent.ACTION_DRAG_STARTED:
889dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
890dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                // Determines if this View can accept the dragged data
891dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
892dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
893dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    // As an example of what your application might do,
894dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    // applies a blue color tint to the View to indicate that it can accept
895dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    // data.
896dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    v.setColorFilter(Color.BLUE);
897dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
898dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    // Invalidate the view to force a redraw in the new tint
899dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    v.invalidate();
900dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
901dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                    // returns true to indicate that the View can accept the dragged data.
90267ab4bae1d7ef0534e43638d5158e9f6066ea495Taeho Kim                    return true;
903dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
904130e1294e8aead233911e7895cedb63af5752519Taeho Kim                }
905dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
906130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Returns false. During the current drag and drop operation, this View will
907130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // not receive events again until ACTION_DRAG_ENDED is sent.
90867ab4bae1d7ef0534e43638d5158e9f6066ea495Taeho Kim                return false;
909dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
910130e1294e8aead233911e7895cedb63af5752519Taeho Kim            case DragEvent.ACTION_DRAG_ENTERED:
911dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
912dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                // Applies a green tint to the View. Return true; the return value is ignored.
913dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
914dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                v.setColorFilter(Color.GREEN);
915dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
916dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                // Invalidate the view to force a redraw in the new tint
917dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                v.invalidate();
918dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
91967ab4bae1d7ef0534e43638d5158e9f6066ea495Taeho Kim                return true;
920dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
921130e1294e8aead233911e7895cedb63af5752519Taeho Kim            case DragEvent.ACTION_DRAG_LOCATION:
922dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
923dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                // Ignore the event
92467ab4bae1d7ef0534e43638d5158e9f6066ea495Taeho Kim                return true;
925dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
926130e1294e8aead233911e7895cedb63af5752519Taeho Kim            case DragEvent.ACTION_DRAG_EXITED:
927dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
928130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Re-sets the color tint to blue. Returns true; the return value is ignored.
929130e1294e8aead233911e7895cedb63af5752519Taeho Kim                v.setColorFilter(Color.BLUE);
930dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
931130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Invalidate the view to force a redraw in the new tint
932130e1294e8aead233911e7895cedb63af5752519Taeho Kim                v.invalidate();
933dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
93467ab4bae1d7ef0534e43638d5158e9f6066ea495Taeho Kim                return true;
935dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
936130e1294e8aead233911e7895cedb63af5752519Taeho Kim            case DragEvent.ACTION_DROP:
937dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
938130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Gets the item containing the dragged data
939130e1294e8aead233911e7895cedb63af5752519Taeho Kim                ClipData.Item item = event.getClipData().getItemAt(0);
940dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
941130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Gets the text data from the item.
942130e1294e8aead233911e7895cedb63af5752519Taeho Kim                dragData = item.getText();
943dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
944130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Displays a message containing the dragged data.
945130e1294e8aead233911e7895cedb63af5752519Taeho Kim                Toast.makeText(this, "Dragged data is " + dragData, Toast.LENGTH_LONG);
946dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
947130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Turns off any color tints
948130e1294e8aead233911e7895cedb63af5752519Taeho Kim                v.clearColorFilter();
949dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
950130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Invalidates the view to force a redraw
951130e1294e8aead233911e7895cedb63af5752519Taeho Kim                v.invalidate();
952dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
953130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Returns true. DragEvent.getResult() will return true.
95467ab4bae1d7ef0534e43638d5158e9f6066ea495Taeho Kim                return true;
955dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
956130e1294e8aead233911e7895cedb63af5752519Taeho Kim            case DragEvent.ACTION_DRAG_ENDED:
957dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
958130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Turns off any color tinting
959130e1294e8aead233911e7895cedb63af5752519Taeho Kim                v.clearColorFilter();
960dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
961130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Invalidates the view to force a redraw
962130e1294e8aead233911e7895cedb63af5752519Taeho Kim                v.invalidate();
963dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
964130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // Does a getResult(), and displays what happened.
965130e1294e8aead233911e7895cedb63af5752519Taeho Kim                if (event.getResult()) {
966130e1294e8aead233911e7895cedb63af5752519Taeho Kim                    Toast.makeText(this, "The drop was handled.", Toast.LENGTH_LONG);
967dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
968130e1294e8aead233911e7895cedb63af5752519Taeho Kim                } else {
969130e1294e8aead233911e7895cedb63af5752519Taeho Kim                    Toast.makeText(this, "The drop didn't work.", Toast.LENGTH_LONG);
970dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
971130e1294e8aead233911e7895cedb63af5752519Taeho Kim                }
972dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
973130e1294e8aead233911e7895cedb63af5752519Taeho Kim                // returns true; the value is ignored.
97467ab4bae1d7ef0534e43638d5158e9f6066ea495Taeho Kim                return true;
975dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin
976130e1294e8aead233911e7895cedb63af5752519Taeho Kim            // An unknown action type was received.
977130e1294e8aead233911e7895cedb63af5752519Taeho Kim            default:
978130e1294e8aead233911e7895cedb63af5752519Taeho Kim                Log.e("DragDrop Example","Unknown action type received by OnDragListener.");
979dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin                break;
980130e1294e8aead233911e7895cedb63af5752519Taeho Kim        }
981130e1294e8aead233911e7895cedb63af5752519Taeho Kim        
98267ab4bae1d7ef0534e43638d5158e9f6066ea495Taeho Kim        return false;
983130e1294e8aead233911e7895cedb63af5752519Taeho Kim    }
984dd05f1812ee86bc8c6176c9dbd30aae8fe0db8b8Joe Malin};
98576dfc02135abae5337b48fe99a1b8c0a7d95e33akmccormick</pre>
986