绿豆宝贝 发表于 2015-10-25 03:09:33

Tizen系统处理触控手势的代码方法

您可以实现您的应用程序识别和应对不同类型的手势提供的库。(本文由谷歌在线翻译提供,有很多不顺的地方大家可以自己顺一下)

基本库里面提供了一个广泛的触控手势姿态层,如单击,双击,三点触摸,触摸,开发,动力监测、线,动态,缩放,旋转,可以使用由应用程序来构建一个动态的用户界面交互简单直观,易于使用。

触控手势
初始化触控手势
初始化触控手势:

1.为应用程序创建一个窗口布局。

的 evas_object_rectangle_add () 获取用户输入的函数添加一个矩形窗口对象相同的eva。

Evas_Object *win;
Evas_Object *r; // Gesture layer transparent object
Evas_Object *g; // Gesture layer object

win = elm_win_util_standard_add("gesture_layer", "Gesture Layer");
elm_win_autodel_set(win, EINA_TRUE);

// Gesture layer transparent object
r = evas_object_rectangle_add(evas_object_evas_get(win));
evas_object_move(r, 0, 0);
evas_object_color_set(r, 0, 0, 0, 0);
elm_win_resize_object_add(win, r);

2.创建一个新层的姿态 elm_gesture_layer_add () 函数。

的 elm_gesture_layer_attach () 函数给定姿态层的高度 Evas_Object 。 这个对象听所有鼠标和关键事件,和报告的手势。

// Gesture layer object
g = elm_gesture_layer_add(win);
elm_gesture_layer_attach(g, r);
evas_object_show(r);
实现利用手势

您可以配置的一些性质,利用手势:

您可以修改超时值长利用或双点击手势。

系统中定义的默认值是政策。 Tizen SDK 2.4,它们长,0.5秒和0.33秒为双击。

// Get or set the gesture layer long tap start timeout of an object
void elm_gesture_layer_long_tap_start_timeout_set(Evas_Object *obj, double long_tap_start_timeout);
double elm_gesture_layer_long_tap_start_timeout_get(const Evas_Object *obj);

// Get or set the gesture layer double tap timeout of an object
void elm_gesture_layer_double_tap_timeout_set(Evas_Object *obj, double double_tap_timeout);
double elm_gesture_layer_double_tap_timeout_get(const Evas_Object *obj);
表示层使用手指的大小来检测两倍和三倍。 如果你不设置一个手指大小,使用默认的姿态层 elm_config 手指大小定义系统中的政策。 Tizen SDK 2.4,它是40。

您还可以定义每个开发点的宽容。

// Get or set the gesture layer finger size for taps
void elm_gesture_layer_tap_finger_size_set(Evas_Object *obj, Evas_Coord sz);
Evas_Coord elm_gesture_layer_tap_finger_size_get(const Evas_Object *obj);
表示层支持4种利用手势和姿态状态:

// Gesture types
ELM_GESTURE_N_TAPS, // Single tap
ELM_GESTURE_N_LONG_TAPS, // Long tap
ELM_GESTURE_N_DOUBLE_TAPS, // Double tap
ELM_GESTURE_N_TRIPLE_TAPS, // Triple tap

// Gesture states
ELM_GESTURE_STATE_START, // Gesture started
ELM_GESTURE_STATE_MOVE, // Gesture ongoing
ELM_GESTURE_STATE_END, // Gesture completed
ELM_GESTURE_STATE_ABORT // Ongoing gesture aborted
使用各种利用手势:

单一的
1.使用 elm_gesture_layer_cb_set () 函数设置回调通知关于手势的变化状态:

elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_START,
                         n_finger_tap_start,NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_END,
                         n_finger_tap_end,NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_ABORT,
                         n_finger_tap_abort,NULL);
2.当鼠标事件发生时, n_finger_tap_start () 回调函数被调用:

// Start gesture callback
static Evas_Event_Flags
n_finger_tap_start(void *data, void *event_info)
{
   Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
   printf("N tap started <%p> x,y=<%d,%d> count=<%d> timestamp=<%d> \n",
          event_info, p->x, p->y, p->n, p->timestamp);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
函数返回 EVAS_EVENT_FLAG_ON_HOLD ,如果组件的事件。

的 event_info 属性包含水龙头中的信息 _Elm_Gesture_Taps_Info 数据结构。 如果手指的数量大于2, x 和 y 值的平均值 x 和 y 几何值。

struct
_Elm_Gesture_Taps_Info
{
   Evas_Coord x, y; // Center point between fingers
   unsigned int n; // Number of fingers tapped
   unsigned int timestamp; // Event timestamp
};
3.当鼠标事件发生时,当前的点击手势 ELM_GESTURE_STATE_START 状态, n_finger_tap_end () 回调函数被调用:

static Evas_Event_Flags
n_finger_tap_end(void *data, void *event_info)
{
   Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;

   printf("N tap started <%p> x,y=<%d,%d> count=<%d> timestamp=<%d> \n",
          event_info, p->x, p->y, p->n, p->timestamp);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
4.当一个意想不到的事件发生时一个鼠标事件后, n_finger_tap_abort () 回调函数被调用。

例如,如果转会事件发生后点击开始回调函数被调用时,或者事件发生经过长时间的新闻事件。

static Evas_Event_Flags
n_finger_tap_abort(void *data, void *event_info)
{
   Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
   printf("N tap abort\n");

   return EVAS_EVENT_FLAG_ON_HOLD;
}
双击
1.使用 elm_gesture_layer_cb_set () 函数设置回调通知关于手势的变化状态:

elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS, ELM_GESTURE_STATE_START,
                         dbl_click_start, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS, ELM_GESTURE_STATE_MOVE,
                         dbl_click_move, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS, ELM_GESTURE_STATE_END,
                         dbl_click_end, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS, ELM_GESTURE_STATE_ABORT,
                         dbl_click_abort, NULL);
2.一个双点击手势开始通过调用 dbl_click_start () 当鼠标事件发生时的回调函数。

后鼠标事件发生时,事件发生在一只老鼠 double_tap_timeout 时间限制。

在这种情况下, dbl_click_move () 回调函数被调用时,这意味着双重点击手势事件正在进行。 否则,终止调用回调函数。

如果鼠标不是叫做内 double_tap_timeout 价值,触摸事件动作的区域中定义事件几何。

3.的 dbl_click_end () 回调函数被调用时,同一区域内点击2倍 double_tap_timeout 值(这意味着 dbl_click_move () 回调函数被称为2次)。

如果任何错误的手势检测双点击手势检测期间, dbl_click_abort () 回调函数被调用。

Triple tap三重丝锥

1.使用 elm_gesture_layer_cb_set () 函数设置回调通知关于手势的变化状态:

elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS, ELM_GESTURE_STATE_START,
                         triple_click_start, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS, ELM_GESTURE_STATE_MOVE,
                         triple_click_move, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS, ELM_GESTURE_STATE_END,
                         triple_click_end, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS, ELM_GESTURE_STATE_ABORT,
                         triple_click_abort, NULL);
2.的 triple_click_start () 回调函数被调用时鼠标事件发生。

后鼠标向下时,鼠标事件发生在 double_tap_timeout 价值。 如果是这样, triple_click_move () 回调函数被调用时,这意味着三点击手势事件正在进行。 否则,终止调用回调。

如果鼠标不是叫做内 double_tap_timeout 价值,触摸事件动作的区域中定义事件几何。

3.的 triple_click_end () 调用回调函数如果相同的区域内点击3次 double_tap_timeout 值(这意味着 triple_click_move () 回调函数被称为三次:1利用开始移动,2挖掘移动,移动,和3利用移动和结束)。

如果任何错误的手势检测三点击手势检测期间, triple_click_abort () 回调函数被调用。

长时间利用
1.使用 elm_gesture_layer_cb_set () 函数设置回调通知关于手势的变化状态:
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS, ELM_GESTURE_STATE_START,
                         n_long_tap_start, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS, ELM_GESTURE_STATE_MOVE,
                         n_long_tap_move, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS, ELM_GESTURE_STATE_END,
                         n_long_tap_end, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS, ELM_GESTURE_STATE_ABORT,
                         n_long_tap_abort, NULL);
2.的 n_long_tap_start () 回调函数被调用时鼠标事件发生。

后鼠标向下时,鼠标下状态中定义保持一段时间 long_tap_timeout 价值。

的 n_long_tap_move () 后调用回调函数 long_tap_timeout 时间。 如果继续降低姿态, n_long_tap_move () 回调函数被调用的 long_tap_timeout 时间价值的间隔,如0.5,1.0,和1.5。

3.n_long_tap_move () 回调函数被调用时,如果鼠标事件与事件,发生在相同的几何 n_long_tap_end () 回调函数被调用。

如果检测到任何错误的姿态在漫长的点击手势检测 n_long_tap_abort () 回调函数被调用。

实施动量姿态

动量姿态是用来检测手势层上的任何移动事件和事件信息来做一个有意义的手势动作。 动量姿态用于检测直线,缩放,旋转的手势。

动量姿态的一样 点击手势 。

实现一个动量姿态:

1.使用 elm_gesture_layer_cb_set () 函数设置回调通知关于手势的变化状态:

elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_START,
                         momentum_start, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_END,
                         momentum_end, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_ABORT,
                         momentum_abort, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_MOVE,
                         momentum_move, NULL);
2. momentum_start () 回调函数被调用时鼠标移动事件发生后鼠标事件:

static Evas_Event_Flags
momentum_start(void *data, void *event_info)
{
   Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
   printf("momentum started x1,y1=<%d,%d> tx,ty=<%u,%u> n=<%u>\n",
          p->x1, p->y1, p->tx, p->ty, p->n);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
event_info 属性包含在动量信息 Elm_Gesture_Momentum_Info 数据结构:

struct
_Elm_Gesture_Momentum_Info // Report line ends, timestamps, and momentum computed      
{
   Evas_Coord x1; // Final-swipe direction with starting point on X
   Evas_Coord y1; // Final-swipe direction with starting point on Y
   Evas_Coord x2; // Final-swipe direction with ending point on X
   Evas_Coord y2; // Final-swipe direction with ending point on Y

   unsigned int tx; // Timestamp of the start of the final X swipe
   unsigned int ty; // Timestamp of the start of the final Y swipe

   Evas_Coord mx; // Momentum on X
   Evas_Coord my; // Momentum on Y

   unsigned int n; // Number of fingers
};
(x1,y1坐标不一定是同步的。 x1坐标的X值X方向的起点,和y1协调都有同样的y这是明显的在v型运动。

3.momentum_move () 回调函数被调用时检测到鼠标移动事件:

static Evas_Event_Flags
momentum_move(void *data, void *event_info)
{
   Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
   printf("momentum move x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n",
          p->x1, p->y1, p->x2, p->y2, p->tx, p->ty, p->mx, p->my, p->n);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
4.鼠标事件发生后鼠标移动事件被检测到。 表示层检查 mx 和 我的 内部值。 如果 mx 和 我的 有值, momentum_end () 回调函数被调用。 否则, mx 和 我的 有0值在鼠标时间, momentum_abort () 回调函数被调用。

static Evas_Event_Flags
momentum_end(void *data, void *event_info)
{
   Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
   printf("momentum ended x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=>%u>\n",
          p->x1, p->y1, p->x2, p->y2, p->tx, p->ty, p->mx, p->my, p->n);

   return EVAS_EVENT_FLAG_ON_HOLD;
}

static Evas_Event_Flags
momentum_abort(void *data, void *event_info)
{
   printf("momentum abort\n");

   return EVAS_EVENT_FLAG_ON_HOLD;
}
实现线手势
线的手势是用来检测鼠标移动事件。 手势层检查每个事件来决定是否要画一条线。

您可以配置的一些性质的手势:

您可以修改一条线的最小长度和距离公差。

系统中定义的默认值是政策。 Tizen SDK 2.4,40的最小长度,距离公差和40。

// Get or set the gesture layer line min length of an object
void elm_gesture_layer_line_min_length_set(Evas_Object *obj, int line_min_length);
int elm_gesture_layer_line_min_length_get(const Evas_Object *obj);


// Get or set the gesture layer line distance tolerance of an object
void elm_gesture_layer_line_distance_tolerance_set(Evas_Object *obj, Evas_Coord line_distance_tolerance);
Evas_Coord elm_gesture_layer_line_distance_tolerance_get(const Evas_Object *obj);
您可以启用继续模式允许,电影,缩放和旋转的姿态重新启动。 默认值是 真正的 。

例如,当画一条线,可以停止运动,而手指保持在触摸屏上。 这一行动使行结束。 手指继续后,手势重启。 继续模式被禁用时,手指必须起飞触摸屏结束一个手势,然后再次触摸屏幕,开始一个新的姿态。

// Get or set the gesture layer continue mode of an object
void elm_gesture_layer_continues_enable_set(Evas_Object *obj, Eina_Bool continues_enable);
Eina_Bool elm_gesture_layer_continues_enable_get(const Evas_Object *obj);
线的动作状态是一样的 点击手势 。

创建一个手势行:

1.使用 elm_gesture_layer_cb_set () 函数设置回调通知关于手势的变化状态:

elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES, ELM_GESTURE_STATE_START,
                         line_start, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES, ELM_GESTURE_STATE_MOVE,
                         line_move, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES, ELM_GESTURE_STATE_END,
                         line_end, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES, ELM_GESTURE_STATE_ABORT,
                         line_abort, NULL);
2.line_start () 回调函数被调用时鼠标移动事件发生后鼠标事件:

static Evas_Event_Flags
line_start(void *data, void *event_info)
{
   Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
   printf("line started angle=<%lf> x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n",
          p->angle, p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2,
          p->momentum.tx, p->momentum.ty, p->momentum.n);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
event_info 属性包含的行信息 Elm_Gesture_Line_Info 数据结构:

struct
_Elm_Gesture_Line_Info
{
   Elm_Gesture_Momentum_Info momentum; // Line momentum info
   double angle; // Angle (direction) of the lines
};
3.line_move () 调用回调函数对每个鼠标移动事件发现除非线距离超出了公差距离值。

如果启用了继续模式和动量值为0,不叫回调。

static Evas_Event_Flags
line_move(void *data, void *event_info)
{
   Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
   printf("line move angle=<%lf> x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n",
          p->angle, p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2,
          p->momentum.tx, p->momentum.ty, p->momentum.n);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
4.line_end 调用回调函数当鼠标事件发生时的姿态比线长最小长度值。 如果启用了继续模式,回调就是当用户停止画一条线,时间又开始了。 (停顿时间后重启,要么结束回调函数被调用时,或者如果鼠标不会发生,再次回调叫)。

static Evas_Event_Flags
line_end(void *data, void *event_info)
{
   Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
   printf("line end angle=<%lf> x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>,\n",
          p->angle, p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2,
          p->momentum.tx, p->momentum.ty, p->momentum.n);

   return EVAS_EVENT_FLAG_ON_HOLD;
}

5.line_abort () 调用回调函数当鼠标移动事件发生时和公差外的几何角是角值和线是短于最小长度值:

static Evas_Event_Flags
line_abort(void *data, void *event_info)
{
   Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
   printf("line abort\n");

   return EVAS_EVENT_FLAG_ON_HOLD;
}
实现电影的手势
您可以配置的一些性质,利用手势:

您可以修改电影电影时间限制的姿态。

系统中定义的默认值是政策。 Tizen SDK 2.4,这是250 ms。

// Get or set the gesture layer flick time limit (in milliseconds) of an object
void elm_gesture_layer_flick_time_limit_ms_set(Evas_Object *obj, unsigned int flick_time_limit_ms);
unsigned int elm_gesture_layer_flick_time_limit_ms_get(const Evas_Object *obj);

电影的手势和姿态信息的数据结构是一样的 线的手势 。

创建一个电影动作:

1.使用 elm_gesture_layer_cb_set () 函数设置回调通知关于手势的变化状态:

elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_START,
                         flick_start, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END,
                         flick_end, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_ABORT,
                         flick_abort, NULL);
flick_move () 回调函数一样工作 line_move () 回调。

2.flick_start () 回调函数被调用时鼠标移动事件发生后鼠标事件。

后调用 flick_start () 回调函数,姿态层检测到一个线的姿态。 如果是这样,它检查电影的时间限制,如果限制内的线事件发生时, flick_end () 回调函数被调用。 否则, flick_abort () 回调函数被调用。

实现缩放手势

您可以配置的一些性质的缩放手势:

您可以修改各种缩放值,如缩放一步,距离公差。

系统中定义的默认值是政策。 在Tizen SDK 2.4中,它们是:

zoom_step :0.0
zoom_finger_factor :1.0
zoom_wheel_factor :0.05
zoom_distance_tolerance :1.0

// Get or set the step value for zoom action
void elm_gesture_layer_zoom_step_set(Evas_Object *obj, double step);
double elm_gesture_layer_zoom_step_get(const Evas_Object *obj);

// Get or set the gesture layer zoom distance tolerance of an object
void elm_gesture_layer_zoom_distance_tolerance_set(Evas_Object *obj, Evas_Coord zoom_distance_tolerance);
Evas_Coord elm_gesture_layer_zoom_distance_tolerance_get(const Evas_Object *obj);

// Get or set the gesture layer zoom wheel factor of an object
void elm_gesture_layer_zoom_wheel_factor_set(Evas_Object *obj, double zoom_wheel_factor);
double elm_gesture_layer_zoom_wheel_factor_get(const Evas_Object *obj);

// Get or set the gesture layer zoom finger factor of an object
void elm_gesture_layer_zoom_finger_factor_set(Evas_Object *obj, double zoom_finger_factor);
double elm_gesture_layer_zoom_finger_factor_get(const Evas_Object *obj);
缩放手势状态是一样的 点击手势 。

使用缩放手势时,注意以下几点:

默认缩放值为1,当缩放手势开始。 每一个放大的手势后,价值是增加或减少根据内部计算逻辑。 半径值用于计算。

如果鼠标滚轮事件被发送 Ctrl 关键姿态层, zoom_start () 调用回调函数使用默认缩放值(1)和缩放值( zoom_finger_factor * 变焦_wheel_factor )增加或减少在每一步跟着车轮向上或向下。

如果有两个指状低事件点比变焦距离公差值接近,缩放手势不是开始。 比的差距 zoom_distance_tolerance 价值,缩放手势启动默认值1和事件信息被一个半径值和手势的动量的值。

创建一个缩放手势:

1.使用 elm_gesture_layer_cb_set () 函数设置回调通知关于手势的变化状态:

elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_START,
                         zoom_start, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_END,
                         zoom_end, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_ABORT,
                         zoom_abort, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_MOVE,
                         zoom_move, NULL);
2.当两个鼠标事件发生时, zoom_start () 回调函数被调用的缩放值(1),和计算半径和动量为当前缩放手势:

static Evas_Event_Flags
zoom_start(void *data, void *event_info)
{
   Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
   printf("zoom started <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n",
          p->x, p->y, p->zoom, p->radius, p->momentum);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
event_info 属性包含放大信息 Elm_Gesture_Zoom_Info 数据结构:

struct _Elm_Gesture_Zoom_Info
{
   Evas_Coord x, y; // Zoom center point reported to the user
   Evas_Coord radius; // Radius between fingers reported to the user
   double zoom; // Zoom value: 1.0 means no zoom
   double momentum; // Zoom momentum: zoom growth per second (NOT YET SUPPORTED)
};
3.zoom_move () 调用回调函数,当用户移动2鼠标事件,除了每个鼠标下的差距小于 zoom_distance_tolerance 价值。

正常的缩放手势检测逻辑:

表示层记得每个接触几何的差距。
当用户移动每个触摸点,姿态层计算每个感动的缺口几何为每个移动事件。
如果值(+的差距 zoom_distance_tolerance 差距, zoom_distance_tolerance )是比第一个更大或更小的间隙值,计算姿态层调用 zoom_move () 回调函数的计算结果。
static Evas_Event_Flags
zoom_move(void *data, void *event_info)
{
   Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
   printf("zoom move <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n",
          p->x, p->y, p->zoom, p->radius, p->momentum);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
4.当鼠标事件发生时, Ctrl 关键检测到信号(用鼠标滚轮缩放, Ctrl 键), zoom_end () 回调函数被调用:

static Evas_Event_Flags
zoom_end(void *data, void *event_info)
{
   Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
   printf("zoom end <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n",
          p->x, p->y, p->zoom, p->radius, p->momentum);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
5.当事件计数大于3, zoom_abort () 回调函数被调用。

static Evas_Event_Flags
zoom_abort(void *data, void *event_info EINA_UNUSED)
{
   printf("zoom abort\n");

   return EVAS_EVENT_FLAG_ON_HOLD;
}
实现旋转的手势

您可以配置的一些性质的旋转动作:

您可以修改旋转步骤和宽容。

系统中定义的默认值是政策。 Tizen SDK 2.4,0.0旋转步骤,和0.0349角公差。

// Get or set the step value for rotate action
void elm_gesture_layer_rotate_step_set(Evas_Object *obj, double step);
double elm_gesture_layer_rotate_step_get(const Evas_Object *obj);

// Get or set the gesture layer rotate angular tolerance of an object
void elm_gesture_layer_rotate_angular_tolerance_set(Evas_Object *obj, double rotate_angular_tolerance);
double elm_gesture_layer_rotate_angular_tolerance_get(const Evas_Object *obj);
旋转的动作状态是一样的 点击手势 。

使用旋转动作时,要注意以下几点:

当手势层检测到2鼠标事件,计算两点之间的角度。

然后姿态层检测每个鼠标移动事件计算两点之间的角度。 如果角度值大于第一个角和计算的总和 rotate_angular_tolerance , rotate_move () 回调函数被调用的结果。

如果设置了旋转动作的步骤, rotate_move () 在每一步调用回调函数。

创建一个旋转的手势:

1.使用 elm_gesture_layer_cb_set () 函数设置回调通知关于手势的变化状态:

elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_START,
                         rotate_start, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_END,
                         rotate_end, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_ABORT,
                         rotate_abort, NULL);
elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_MOVE,
                         rotate_move, NULL);
2.当手势层的2点了, rotate_start () 回调函数被调用:

static Evas_Event_Flags
rotate_start(void *data, void *event_info)
{
   Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
   printf("rotate started <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n",
          p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
event_info 属性包含在旋转信息 Elm_Gesture_Rotate_Info 数据结构:

struct _Elm_Gesture_Rotate_Info
{
   Evas_Coord x, y; // Zoom center point reported to the user
   Evas_Coord radius; // Radius between fingers reported to the user
   double base_angle; // Holds the start angle
   double angle; // Rotation value: 0.0 means no rotation
   double momentum; // Rotation momentum: rotation done per second (NOT YET SUPPORTED)
};
3. rotate_move () 函数被调用的每个探测点当鼠标移动事件发生及其角大于基础角和角公差之和:

static Evas_Event_Flags
rotate_move(void *data, void *event_info)
{
   Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
   printf("rotate move <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n",
          p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
4.当鼠标事件发生时, rotate_end () 回调函数被调用:

static Evas_Event_Flags
rotate_end(void *data, void *event_info)
{
   Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
   printf("rotate end <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n",
          p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum);

   return EVAS_EVENT_FLAG_ON_HOLD;
}
5.如果鼠标事件计数高于3, rotate_abort () 回调函数被调用:

static Evas_Event_Flags
rotate_abort(void *data, void *event_info EINA_UNUSED)
{
   printf("rotate abort\n");

   return EVAS_EVENT_FLAG_ON_HOLD;
}

页: [1]
查看完整版本: Tizen系统处理触控手势的代码方法