Adjust panning gesture 92/89892/1
authorchanywa <cbible.kim@samsung.com>
Tue, 27 Sep 2016 04:19:39 +0000 (13:19 +0900)
committerchanywa <cbible.kim@samsung.com>
Tue, 27 Sep 2016 09:53:34 +0000 (18:53 +0900)
Change-Id: I80885695d5d871b72a3104c8b2ed2d50a7304a0d

capi-maps-service.changes
packaging/capi-maps-service.spec
src/view/inertial_gesture.cpp
src/view/inertial_gesture.h

index 1b98598..30cdc4a 100644 (file)
@@ -1,3 +1,8 @@
+[Version]   capi-maps-service_0.6.7
+[Date]      27 Sep 2016
+[Title]     adjust panning gesture
+[Developer] Seechan Kim <cbible.kim@samsung.com>
+
 [Version]   capi-maps-service_0.6.6
 [Date]      27 Sep 2016
 [Title]     fixed click area, and resizing the marker which image file changed
index e8b57ef..b756783 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-maps-service
 Summary:    Tizen Maps Service API
-Version:    0.6.6
+Version:    0.6.7
 Release:    1
 Group:      Location/API
 License:    Apache-2.0
index f5f9ba4..88ad7a1 100644 (file)
@@ -32,6 +32,7 @@ view::inertial_gesture::inertial_gesture(maps_view_h view)
        : gesture_detector(view)
          , _d(NULL)
          , transiting(false)
+         , transiting_trajectory(false)
 {
        reset();
 
@@ -53,6 +54,7 @@ view::inertial_gesture::inertial_gesture(const inertial_gesture &src)
        : gesture_detector(NULL)
          , _d(NULL)
          , transiting(false)
+         , transiting_trajectory(false)
 {
 }
 
@@ -90,6 +92,7 @@ void view::inertial_gesture::tap(int finger_no, const touch_point &tp)
        _prev[finger_no] = tp;
        _cur_x[finger_no] = tp._x;
        _cur_y[finger_no] = tp._y;
+       _inertial_start[finger_no] = tp;
 
        if (_d)
                _d->tap(finger_no, tp);
@@ -100,12 +103,19 @@ void view::inertial_gesture::move(int finger_no, const touch_point &tp)
        MAPS_LOGI("TRANSITION finger %d move", finger_no);
 
        _maps_view_halt_inertial_camera(_view);
+       update_inertial_start_point(finger_no);
 
        _prev[finger_no] = _last[finger_no];
        _last[finger_no] = tp;
        _cur_x[finger_no] = tp._x;
        _cur_y[finger_no] = tp._y;
 
+       /* check if moved enough as much as effective length */
+       int trajectory = get_trajectory_effective_length(_down[finger_no], tp);
+       MAPS_LOGD("trajectory=%d", trajectory);
+       if (trajectory >= __CLICK_AREA)
+               transiting_trajectory = true;
+
        if (_d)
                _d->move(finger_no, tp);
 }
@@ -117,20 +127,27 @@ void view::inertial_gesture::up(int finger_no, const touch_point &tp)
 
        _last[finger_no] = tp;
 
-       const int delta_x = _last[finger_no]._x - _prev[finger_no]._x;
-       const int delta_y = _last[finger_no]._y - _prev[finger_no]._y;
-       unsigned int dt = _last[finger_no]._timestamp - _prev[finger_no]._timestamp;
+       const int delta_x = _last[finger_no]._x - _inertial_start[finger_no]._x;
+       const int delta_y = _last[finger_no]._y - _inertial_start[finger_no]._y;
+       unsigned int dt = _last[finger_no]._timestamp - _inertial_start[finger_no]._timestamp;
 
-       int trajectory = get_trajectory_effective_length(_down[finger_no], tp);
-       MAPS_LOGD("trajectory=%d", trajectory);
-       if (trajectory <= __CLICK_AREA) dt = 0;
+       /* check if moved enough as much as effective length */
+       int trajectory_total = get_trajectory_effective_length(_down[finger_no], tp);
+       int trajectory_last  = get_trajectory_effective_length(_prev[finger_no], tp);
+       MAPS_LOGD("trajectory total=%d, local=%d dx=%d, dy=%d, dt=%d",
+               trajectory_total, trajectory_last, delta_x, delta_y, dt);
 
-       if (dt == 0) {
+       if (trajectory_total >= __CLICK_AREA)
+               transiting_trajectory = true;
+       if (trajectory_last <= __CLICK_AREA / 3.)
+               transiting_trajectory = false;
+
+       if (dt == 0 || !transiting_trajectory) {
                _derivative_x[finger_no] = .0;
                _derivative_y[finger_no] = .0;
        } else {
-               _derivative_x[finger_no] = 40. * (delta_x) / dt;
-               _derivative_y[finger_no] = 40. * (delta_y) / dt;
+               _derivative_x[finger_no] = 10. * (delta_x) / dt;
+               _derivative_y[finger_no] = 10. * (delta_y) / dt;
        }
        _dt[finger_no] = MIN(1.*dt, 1.);
 
@@ -152,6 +169,17 @@ bool view::inertial_gesture::next_transition_step()
 
                transiting_part[i] = false;
 
+#if 1
+               if ((ABS(_derivative_x[i]) > __ACCURACY) || (ABS(_derivative_y[i]) > __ACCURACY)) {
+                       _cur_x[i] = get_next_point(_cur_x[i], _derivative_x[i], _dt[i]);
+                       _derivative_x[i] = get_next_derivative(_derivative_x[i], _dt[i]);
+                       transiting_part[i] |= ABS(_derivative_x[i]) > __ACCURACY;
+
+                       _cur_y[i] = get_next_point(_cur_y[i], _derivative_y[i], _dt[i]);
+                       _derivative_y[i] = get_next_derivative(_derivative_y[i], _dt[i]);
+                       transiting_part[i] |= ABS(_derivative_y[i]) > __ACCURACY;
+               }
+#else
                if (ABS(_derivative_x[i]) > __ACCURACY) {
                        _cur_x[i] = get_next_point(_cur_x[i], _derivative_x[i], _dt[i]);
                        _derivative_x[i] = get_next_derivative(_derivative_x[i], _dt[i]);
@@ -163,6 +191,7 @@ bool view::inertial_gesture::next_transition_step()
                        _derivative_y[i] = get_next_derivative(_derivative_y[i], _dt[i]);
                        transiting_part[i] |= ABS(_derivative_y[i]) > __ACCURACY;
                }
+#endif
 
                unsigned int timestamp = _last[i]._timestamp + get_transition_time(i);
 
@@ -239,8 +268,22 @@ void view::inertial_gesture::on_idle(void *data)
 void view::inertial_gesture::reset()
 {
        transiting = false;
+       transiting_trajectory = false;
        for (int i = 0; i < MAX_FINGERS; i ++) {
                transiting_part[i] = false;
                transiting_start[i] = 0;
        }
 }
+
+void view::inertial_gesture::update_inertial_start_point(int finger_no)
+{
+       const int margin = 3;
+       if (((_last[finger_no]._x > _prev[finger_no]._x + margin) && (_last[finger_no]._x < _inertial_start[finger_no]._x - margin)) ||
+               ((_last[finger_no]._x < _prev[finger_no]._x - margin) && (_last[finger_no]._x > _inertial_start[finger_no]._x + margin)) ||
+               ((_last[finger_no]._y > _prev[finger_no]._y + margin) && (_last[finger_no]._y < _inertial_start[finger_no]._y - margin)) ||
+               ((_last[finger_no]._y < _prev[finger_no]._y - margin) && (_last[finger_no]._y > _inertial_start[finger_no]._y + margin))) {
+               _inertial_start[finger_no] = _last[finger_no];
+               MAPS_LOGD("reset inertial start (%d,%d)", _inertial_start[finger_no]._x, _inertial_start[finger_no]._y);
+       }
+}
+
index 289cba7..3b2f19e 100644 (file)
@@ -27,12 +27,14 @@ namespace view
                touch_point _down[MAX_FINGERS];
                touch_point _last[MAX_FINGERS];
                touch_point _prev[MAX_FINGERS];
+               touch_point _inertial_start[MAX_FINGERS];
                double _cur_x[MAX_FINGERS];
                double _cur_y[MAX_FINGERS];
                double _derivative_x[MAX_FINGERS];
                double _derivative_y[MAX_FINGERS];
                bool transiting;
                bool transiting_part[MAX_FINGERS];
+               bool transiting_trajectory;
                unsigned transiting_start[MAX_FINGERS];
                double _dt[MAX_FINGERS];
        private:
@@ -62,6 +64,7 @@ namespace view
                static unsigned int get_cur_time();
                unsigned int get_transition_time(int finger_no) const;
                void reset();
+               void update_inertial_start_point(int finger_no);
        };
 };