forked from software-mansion/react-native-gesture-handler
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLongPressGestureHandler.java
More file actions
73 lines (64 loc) · 1.98 KB
/
LongPressGestureHandler.java
File metadata and controls
73 lines (64 loc) · 1.98 KB
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
package com.swmansion.gesturehandler;
import android.content.Context;
import android.os.Handler;
import android.view.MotionEvent;
public class LongPressGestureHandler extends GestureHandler<LongPressGestureHandler> {
private static final long DEFAULT_MIN_DURATION_MS = 500; // 1 sec
private static float DEFAULT_MAX_DIST_DP = 10; // 20dp
private long mMinDurationMs = DEFAULT_MIN_DURATION_MS;
private float mMaxDistSq;
private float mStartX, mStartY;
private Handler mHandler;
public LongPressGestureHandler(Context context) {
setShouldCancelWhenOutside(true);
mMaxDistSq = DEFAULT_MAX_DIST_DP * context.getResources().getDisplayMetrics().density;
}
public void setMinDurationMs(long minDurationMs) {
mMinDurationMs = minDurationMs;
}
public LongPressGestureHandler setMaxDist(float maxDist) {
mMaxDistSq = maxDist * maxDist;
return this;
}
@Override
protected void onHandle(MotionEvent event) {
if (getState() == STATE_UNDETERMINED) {
begin();
mStartX = event.getRawX();
mStartY = event.getRawY();
mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
activate();
}
}, mMinDurationMs);
}
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
}
if (getState() == STATE_ACTIVE) {
end();
} else {
fail();
}
} else {
// calculate distance from start
float deltaX = event.getRawX() - mStartX;
float deltaY = event.getRawY() - mStartY;
float distSq = deltaX * deltaX + deltaY * deltaY;
if (distSq > mMaxDistSq && getState() != STATE_ACTIVE) {
fail();
}
}
}
@Override
protected void onStateChange(int newState, int previousState) {
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
}
}
}