diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2019-11-02 19:31:37 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-02 19:31:37 +0100 |
commit | 4d019524a923d4cfddf35d8b5a9538eae651fbbe (patch) | |
tree | 65ce3a6f97f6ef3bb1d12a5e46a00d6db74a0e76 | |
parent | 79918eca30dc2c03d81091e989a7f5dc299e8cda (diff) | |
parent | 9cc66495cfb6393102ce5ad4e82f2ccb716b9b33 (diff) |
Merge pull request #25474 from jeremyz/android_gesture
implement InputEventMagnifyGesture and InputEventPanGesture for android
-rw-r--r-- | platform/android/os_android.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp index defee8f1f1..9156181bbe 100644 --- a/platform/android/os_android.cpp +++ b/platform/android/os_android.cpp @@ -49,6 +49,9 @@ #include "java_godot_io_wrapper.h" #include "java_godot_wrapper.h" +#define PAN_GESTURE_MIN_DELTA 5 // only advertise PanGesture event with dx and dy greater than this +#define MAGNIFY_GESTURE_MIN_FACTOR 0.1 // only advertise MagnifyGesture event with a factor difference from 1.0 greater than this + class AndroidLogger : public Logger { public: virtual void logv(const char *p_format, va_list p_list, bool p_err) { @@ -406,6 +409,35 @@ void OS_Android::process_touch(int p_what, int p_pointer, const Vector<TouchPos> ERR_FAIL_COND(touch.size() != p_points.size()); + if (touch.size() == 1) { + Point2 d = (p_points[0].pos - touch.write[0].pos); + if (fabs(d.x) > PAN_GESTURE_MIN_DELTA || fabs(d.y) > PAN_GESTURE_MIN_DELTA) { + Ref<InputEventPanGesture> ev; + ev.instance(); + ev->set_position(p_points[0].pos); + ev->set_delta(d); + input->parse_input_event(ev); + touch.write[0].pos = p_points[0].pos; + } + } else if (touch.size() == 2) { + Point2 v0 = touch[1].pos - touch[0].pos; + float l0 = (v0.x * v0.x) + (v0.y * v0.y); + if (l0 != 0.0) { + Point2 v1 = p_points[1].pos - p_points[0].pos; + float l1 = (v1.x * v1.x) + (v1.y * v1.y); + float f = (l1 / l0); + if (fabs(f - 1.0) > MAGNIFY_GESTURE_MIN_FACTOR) { + Ref<InputEventMagnifyGesture> ev; + ev.instance(); + ev->set_position(p_points[0].pos + v1 / 2); + ev->set_factor(sqrt(f)); + input->parse_input_event(ev); + touch.write[0].pos = p_points[0].pos; + touch.write[1].pos = p_points[1].pos; + } + } + } + for (int i = 0; i < touch.size(); i++) { int idx = -1; @@ -420,7 +452,7 @@ void OS_Android::process_touch(int p_what, int p_pointer, const Vector<TouchPos> ERR_CONTINUE(idx == -1); if (touch[i].pos == p_points[idx].pos) - continue; //no move unncesearily + continue; //no unnecessary move Ref<InputEventScreenDrag> ev; ev.instance(); |