-
Notifications
You must be signed in to change notification settings - Fork 80
/
Copy pathDragController.java
126 lines (98 loc) · 3.16 KB
/
DragController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package su.levenetc.android.draggableview;
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by Eugene Levenetc.
*/
public class DragController<T extends ViewGroup & DragController.IDragViewGroup> {
private View selectedView;
private PointF downEventPoint = new PointF();
private DraggableView draggableView;
private VelocityTracker velocityTracker = VelocityTracker.obtain();
private T viewGroup;
public DragController(T viewGroup) {
this.viewGroup = viewGroup;
}
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
final float x = event.getX();
final float y = event.getY();
final boolean isInDragSession = draggableView != null;
if (action == MotionEvent.ACTION_DOWN && !isInDragSession) {
selectedView = viewGroup.onDownEvent((int) x, (int) y);
if (selectedView != null) {
downEventPoint.set(x, y);
addDraggable();
return true;
}
} else if (isInDragSession && action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
velocityTracker.clear();
viewGroup.onDragEnd();
return true;
} else if (isInDragSession && action == MotionEvent.ACTION_MOVE) {
draggableView.onMoveAction(event);
return true;
}
return false;
}
private void addDraggable() {
viewGroup.onDragStart();
selectedView.buildDrawingCache();
Bitmap bitmap = Bitmap.createBitmap(selectedView.getDrawingCache());
float selectedViewX = selectedView.getX();
float selectedViewY = selectedView.getY();
downEventPoint.set(downEventPoint.x - selectedViewX, downEventPoint.y - selectedViewY);
draggableView = viewGroup.createDraggableView(
bitmap,
velocityTracker,
new PointF(selectedViewX, selectedViewY),
downEventPoint
);
viewGroup.getContainerForDraggableView().addView(draggableView);
}
public void finishDrag() {
viewGroup.getContainerForDraggableView().removeView(draggableView);
draggableView = null;
selectedView = null;
}
public DraggableView getDraggableView() {
return draggableView;
}
public interface IDragViewGroup {
/**
* Should be returned view which can be dragged
* or null if there is no such view
*/
View onDownEvent(int x, int y);
/**
* @return ViewGroup where draggable view will be added
*/
ViewGroup getContainerForDraggableView();
/**
* Calls after draggable view was created.
* Some animations could be started.
* Also selected view should be hided.
*/
void onDragStart();
/**
* Calls after ACTION_UP or ACTION_CANCEL event.
* E.g. user finished dragging.
* Last position of draggable could be received with {@link IDragViewGroup#onMoveEvent}
* <p/>
* !!!
* Finally must be called {@link DragController#finishDrag()}
* !!!
*/
void onDragEnd();
void onMoveEvent(float x, float y);
DraggableView createDraggableView(Bitmap bitmap,
VelocityTracker velocityTracker,
PointF selectedViewPoint,
PointF downEventPoint
);
}
}