据我了解,从 3.4 版开始,GTK+ 添加了多点触控支持。我不清楚的是这是否仅适用于手机/平板电脑等触摸屏,或者它是否扩展到 Apple 风格的触摸板(Ubuntu/Unity 和 OS X 在触摸板上使用多点触控手势的方式)。
我也很难找到如何实现手势以及如何跟踪多点触控事件的示例。
有没有关于如何使用 GTK(或类似 Clutter 之类的相关工具)实现多点触控的好例子?
据我了解,从 3.4 版开始,GTK+ 添加了多点触控支持。我不清楚的是这是否仅适用于手机/平板电脑等触摸屏,或者它是否扩展到 Apple 风格的触摸板(Ubuntu/Unity 和 OS X 在触摸板上使用多点触控手势的方式)。
我也很难找到如何实现手势以及如何跟踪多点触控事件的示例。
有没有关于如何使用 GTK(或类似 Clutter 之类的相关工具)实现多点触控的好例子?
我也找不到例子,所以这是我对它的了解:
当使用鼠标 Gdk 传播事件GDK_BUTTON_PRESS
时,GDK_BUTTON_RELEASE
(和其他一些)。这将被转换为按钮按下事件GtkWidget
等信号,然后转换为更高级别的信号,如's clicked如果适用。将回调连接到信号允许访问GdkEventButton 结构。但是,使用可以让您无需跟踪它是单击(按下和释放)还是仅释放(例如在动态滚动期间)。GtkButton
button-press-event
clicked
触摸的工作方式有点不同。有4 个触摸事件:
GDK_TOUCH_BEGIN
一个新的触摸事件序列刚刚开始。此事件类型是在 3.4 中添加的。GDK_TOUCH_UPDATE
触摸事件序列已更新。此事件类型是在 3.4 中添加的。GDK_TOUCH_END
一个触摸事件序列已经完成。此事件类型是在 3.4 中添加的。GDK_TOUCH_CANCEL
触摸事件序列已被取消。此事件类型是在 3.4 中添加的。
GdkEventTouch结构使用GdkEventSequence来区分手指。在我看来,它只是一个值(在源代码中找不到定义),但我可能在这里弄错了。GtkWidget
具有类似于etc 的触摸事件button-press-event
信号,也可以转换为clicked
.
#include <gtkmm.h>
#include <iostream>
int main()
{
auto app = Gtk::Application::create();
Gtk::Window window;
window.set_default_size(1024, 768);
app->signal_startup().connect([&]
{
app->add_window(window);
});
window.show();
//code works for me without adding events mask but let's be thorough
window.add_events(Gdk::TOUCH_MASK);
window.signal_touch_event().connect([&](GdkEventTouch* event)->bool
{
std::cout<<"TOUCH EVENT: ";
switch(event->type)
{
case GDK_TOUCH_BEGIN:
std::cout<<"begin ";
break;
case GDK_TOUCH_UPDATE:
std::cout<<"update ";
break;
case GDK_TOUCH_END:
std::cout<<"end ";
break;
case GDK_TOUCH_CANCEL:
std::cout<<"cancel ";
break;
default:
std::cout<<"something else ";
}
std::cout<<event->sequence<<" "
<<gdk_event_get_event_sequence((GdkEvent*)event)<<" "
<<std::endl;
return GDK_EVENT_PROPAGATE;
});
window.signal_event().connect([&](GdkEvent* event)->bool
{
std::cout<<"EVENT: "<<event->type<<std::endl;
return GDK_EVENT_PROPAGATE;
});
app->run();
return 0;
}
还有触摸板和垫事件和结构,但似乎没有在Gtk
级别上明确处理这些事件。它必须在事件信号的回调中完成,检查GdkEventType并将其转换为适当的结构。