为何选择二合一设备
二合一设备是一种可在笔记本电脑和平板电脑之间进行切换的 PC。 笔记本电脑模式(有时被称为台式机模式)支持将键盘和鼠标作为主要输入设备。 平板电脑模式依赖于触摸屏进行输入,因此需要手指或手写笔交互。 二合一设备(如英特尔® 超极本™ PC/平板二合一等)提供了多种精确、可控的输入选项,通过写入和触摸两种输入方式让您工作、娱乐两不误。
开发人员在修改应用时必须考虑到多个场景,才能充分利用这种新型的可变形电脑。 有些应用可能希望两种模式下的菜单和外观保持几乎相同。 而其它应用,如 Krita Gemini for Windows* 8 (参考资料 1)等,则希望慎重选择重点内容,并确保可同时应用于两种用户界面模式。 Krita 是一款素描与绘画程序,专为创建数字格式的全新绘画文件提供端到端解决方案(参考文献 2)。 本文将探讨 Krita 开发人员如何在应用中添加二合一模式感知功能,包括同时实施自动和用户自选模式切换等,以及开发人员在创建应用以便为其应用提供二合一体验时应考虑的几个方面。
简介
多年以来,计算机已经使用了多种输入方式,其中包括打孔卡、命令行和点击等。 自触摸屏推出之后,我们现在可以使用鼠标、手写笔或手指来进行点击输入。 然而,我们中的大多数人并不打算通过触摸完成所有输入操作,而借助模式感知型应用(如 Krita Gemini 等),我们无需这么做。 二合一设备(如英特尔® 超极本™ PC/平板二合一等)能够提供合适的用户界面模式,让用户在一台设备上享受到最佳的用户体验。
有多种方法可以实现二合一设备在笔记本和平板两种模式之间的来回切换(图 1 和图 2)。 英特尔网站上列举了更多二合一设备的例子(参考资料 3)。 通过分离屏幕与键盘,或者禁用键盘并将屏幕作为主输入设备(如将屏幕叠放在键盘上面等),计算机可以从笔记本模式切换至平板模式。 电脑制造商也都开始向操作系统提供这种硬件切换信息。 Windows* 8 API 事件、WM_SETTINGCHANGE 和“ConvertibleSlateMode”文本参数通过发送信号自动执行模式切换。 此外,为方便用户使用,开发人员也可添加手动模式切换按钮。
正如二合一设备可以采用多种方法在笔记本和平板模式之间进行切换一样,软件也可以有不同的切换响应方式。 在某些情况下,软件可能希望使用户界面尽可能接近笔记本电脑模式;而在其他情况下,您可能希望用户界面做出更多重要改变。 英特尔通过与众多厂商通力协作,帮助他们在其应用中添加二合一感知功能。 英特尔帮助 KO GmBH 将其 Krita Touch 应用的功能与其颇受欢迎的 Krita 开源绘画程序(笔记本电脑应用)融入全新 Krita Gemini 应用中。 Krita 项目是一个活跃的开发社区,社区成员乐于欢迎新创意和维护质量支持。 该团队添加了所需的相关机制,以支持笔记本电脑“鼠标与键盘”模式与平板电脑触摸界面模式之间的无缝切换。 观看图 3 短片中演示的 Krita Gemini 用户界面 (UI) 切换步骤。
图 3:视频 — Krita Gemini 用户界面切换—单击图标以运行
在平板电脑模式下创建,在笔记本电脑模式下完善
Gemini 团队致力于最大限度地提升两种操作模式下的用户体验。 在图 4 和图 5 中,您可以看到,在两种模式之间切换用户界面的方法有很多种,且每一种都足够出色。 借助这些方法,用户可以在平板电脑模式下“现场”作画,之后切换到笔记本电脑模式对细节进行润色和修改。
图 4:Krita Gemini 平板电脑用户界面
图 5: Krita Gemini 笔记本电脑用户界面
要使应用可在两种操作模式之间自由切换,需要执行三个主要步骤。
第一步,应用必需能够感知触摸。 幸运的是,触摸感知功能通常在二合一设备执行操作之前就已开启。 通常,这一步骤比执行模式切换重要的多。 英特尔发表了几篇关于为 Windows 8 应用添加触摸输入的文章(参考资料 4)。
第二步,添加二合一设备感知功能。 上述视频的前半部分(图 3)演示了自动传感器激活切换模式,在此例中即为旋转操作(图 6)。 后半部分演示了通过应用中的一个按钮执行的用户发起的切换模式(图 7)。
图 6:传感器状态激活的二合一设备模式切换
图 7:“切换到草图”切换按钮 — 用户发起从笔记本模式切换至平板模式的操作
自动切换支持需要定义和监控传感器状态,并在获悉状态之后执行适当的操作。 此外,如果在代码支持笔记本电脑模式的情况下,用户希望切换至平板电脑模式,那么应用也应默认支持用户发起模式切换 3。 您还可以参考英特尔文章《如何编写二合一设备感知应用》中的示例方法来添加基于传感器的切换方法(参考资料 5)。 您也可以搜索“SlateMode”,从其源代码中中找到 Krita 的模式切换管理代码(参考资料 6)。 Krita 遵守 GNU 公共许可发布。 请参考源代码库获取最新信息(参考资料 7)。
// Snip from Gemini - Define 2-in1 mode hardware states:
#ifdef Q_OS_WIN
#include <shellapi.h>
#define SM_CONVERTIBLESLATEMODE 0x2003
#define SM_SYSTEMDOCKED 0x2004
#endif
并非所有的触屏电脑均提供自动切换功能,因此,我们建议您参照本文列举的 Krita Gemini 团队的做法进行操作,通过在您的应用中添加一个按钮来支持用户手动发起模式切换。 Gemini 的按钮如图 7 中所示。按钮发起的用户界面切换执行与机械传感器发起的切换相同的功能。 屏幕信息和默认输入设备将从平板电脑模式下的触摸和大图标切换到笔记本电脑模式下的鼠标和小图标。 然而,由于传感器路径不存在,因此,按钮方法必须在没有传感器状态信息的情况下执行屏幕、图标和默认输入设备切换。 因此,开发人员应该为用户提供一种模式切换路径,且为防用户选择不恰当的模式,该路径需在没有按钮发起用户界面状态信息的情况下支持触摸或鼠标输入。
按钮定义 — Kaction() — 及其状态和操作如下述代码中所示(参考资料 6):
然后,工程师承担处理由按钮触发的事件的任务。 由于代码不能假定该系统就是二合一系统,因此首先要检查系统的最后一个已知状态,然后更改模式。 (参考资料 6): 第三步,解决测试过程中发现的问题。 虽然在触摸或鼠标模式下使用调色板相当容易,但工作区本身需要确保对焦和变焦与用户的期望保持一致。 因此,让一切变大的方法并不可取。 在平板电脑模式下,控件会变大以适应触摸交互,但屏幕图像本身需要在不同层面进行管理,以保持预期的用户体验。 请注意,在图 3 所示的视频中,在进行模式切换之后,编辑窗格中的图像与在其屏幕上时的尺寸保持相同。 开发人员通过创造性的解决方案预留了屏幕上的这一固定区域,以确保图像的一致。 另一个问题是,最初的解决方案旨在使两种用户界面均可正常运行,这反而影响了性能,因为两个用户界面共享相同的图形资源。 之后开发人员对两种用户界面进行了调整,以确保所分配的资源尽可能满足不同的需求,并尽可能优先满足活跃的用户界面。 正如您所看到的,为您的应用添加二合一模式感知功能是一个非常简单的过程。 您需要了解您的用户如何在两种交互模式中与您的应用进行交互。 请阅读《为基于超极本™ 设计的二合一设备编写切换应用》的英特尔文章,了解有关应用创建和用户界面切换的更多信息(参考资料 8)。 Krita Gemini 开发这一应用的目的在于,通过在平板电脑模式下创作草图并在笔记本电脑模式下最后润色,让艺术创作变得简单。 在您向用户展示您的应用在平板和笔记本模式下的运行状况时,您可以突出显示什么内容? 参考资料 关于作者 Tim Duncan 是一名英特尔工程师,被朋友们形容为“小工具先生”。 他目前正在帮助开发人员将技术集成至解决方案,Tim 拥有数十年的丰富的行业经验,从芯片制造到系统集成均有涉猎。 在英特尔® 开发人员专区中搜索Tim Duncan (Intel),了解他的详细信息 英特尔和 Intel 标识是英特尔在美国和/或其他国家的商标。 Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries. // Snip from Gemini - Define 2-in1 Mode Transition Button:
toDesktop = new KAction(q);
toDesktop->setEnabled(false);
toDesktop->setText(tr("Switch to Desktop"));
SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), q, SLOT(switchDesktopForced()));
connect(toDesktop,
SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), q, SLOT(switchToDesktop()));
sketchView->engine()->rootContext()->setContextProperty("switchToDesktop
sketchView->Action", toDesktop);
// Snip from Gemini - Perform 2-in1 Mode Transition via Button:
#ifdef Q_OS_WIN
bool MainWindow::winEvent( MSG * message, long * result ) {
if (message && message->message == WM_SETTINGCHANGE && message->lParam)
{
if (wcscmp(TEXT("ConvertibleSlateMode"), (TCHAR *) message->lParam) == 0)
d->notifySlateModeChange();
else if (wcscmp(TEXT("SystemDockMode"), (TCHAR *)
message->lParam) == 0)
d->notifyDockingModeChange();
*result = 0;
return true;
}
return false;
}
#endif
void MainWindow::Private::notifySlateModeChange()
{
#ifdef Q_OS_WIN
bool bSlateMode = (GetSystemMetrics(SM_CONVERTIBLESLATEMODE) == 0);
if (slateMode != bSlateMode)
{
slateMode = bSlateMode;
emit q->slateModeChanged();
if (forceSketch || (slateMode && !forceDesktop))
{
if (!toSketch || (toSketch && toSketch->isEnabled()))
q->switchToSketch();
}
else
{
q->switchToDesktop();
}
//qDebug() << "Slate mode is now"<< slateMode;
}
#endif
}
void MainWindow::Private::notifyDockingModeChange()
{
#ifdef Q_OS_WIN
bool bDocked = (GetSystemMetrics(SM_SYSTEMDOCKED) != 0);
if (docked != bDocked)
{
docked = bDocked;
//qDebug() << "Docking mode is now"<< docked;
}
#endif
}
总结
版权所有 © 2013-2014 年英特尔公司。 所有权保留。
*其他的名称和品牌可能是其他所有者的资产。
Copyright © 2013-2014 Intel Corporation. All rights reserved.
*Other names and brands may be claimed as the property of others.