2015年8月20日在Android Devlopers Blog ( http://android-developers.blogspot.tw/2015/08/interactive-watch-faces-with-latest.html
)上Google 给出了对Android Wear 最近更新的可交互式表面的解释,正好公司需要对已有的表面添加可交互功能,博主对其进行了一定的研究,现将其总结如下:
1 实现表面可交互的步骤
可交互表面,是指在手表表面对某一UI标志进行点击,则可以打开相应的app界面,如点击月份标志,可以打开wear 端的相应月份app,这个过程关键的是对手势的识别,要想使表面对手势可检测,则需要的步骤为:
1) 确保你 build.gradle 里面的 Wearable Support library 升级到 1.3.0版本之上
2) 在你建立你的watchface 中 <一般继承 CanvasWatchFaceService, 建立Engine类,重写onCreate()方法,具体可看google给的官方例子>,设置watchfaceStyle的时候,将setAcceptsTapEvent(true) 设置上,在这里的WatchFaceStyle.Builder中,使用了build模式,在android中这样的模式处处可见,如设置对话框,使用第三方框架UniversalImageLoader时也是如此,这种模式可以应用到封装自己的工具类上;
3)重写 onTapCommend(int tapType, int x, int y, long eventTime){} 方法
对于tapType, 在Android Wear 中具有三种类型
TAP_TYPE_TOUCH 相当于 MotionEvent.ACTION_DOWN
TAP_TYPE_TAP 相当于 MotionEvent.ACITON_UP
TAP_TYPE_TOUCH_CANCEL 在屏幕上移动的动作
eventTime 在打印可以看到起其数值是差不多,所以猜测应该是指手指按下的持续时间
Android Wear 对于 长按操作 和 左滑 右滑的动作进行了保留,属于系统级的动作。
另外,在 谷歌的这篇开发者博客中还提及到关于Wifi 的更新,手表和手机将不再局限于蓝牙的通信,可以通过Wifi 通信,你所需要做的是继承谷歌提供的接口 Data API。因为版本更新交替的缘故,谷歌还提供了可以对当前版本检测是否支持interactive的代码,具体如下:
PackageInfo packageInfo = PackageManager.getPackageInfo("com.google.android.wearable.app", 0);
if (packageInfo.versionCode > 720000000) {
// Supports taps - cache this result to avoid calling PackageManager again
} else {
// Device does not support taps yet
}
2 双击事件的监测
在手机上如果你想监测到双击事件,可以使用GestureDetector,OnDoubleTapListener等,具体用法可以看官网
http://developer.android.com/training/gestures/detector.html ;
那么在手表上如如何监测到双击事件呢,其实无论手机还是手表上,其监测的原理肯定都是依据所获事件的前后两次的时间以及位置进行判断的,所以对手表上根据onTapCommend函数自己写了一个,具体代码如下:
public void
onTapCommand(
@TapType
int
tapType
,
int
x
,
int
y
,
long
eventTime
) {
supe
r.onT
a
pCommand(tap
T
ype, x,
y
,
e
v
en
tTime);//
switch (
tapType
)
{
case
Watc
hFace
Service
.
TAP_TYPE_
TAP:
if(Math.abs
(m
L
astU
p
InS
c
reenX - x) <15 &&
M
a
th
.
abs
(mL
astU
p
InS
c
reenY - y) < 15 )
{
//
make sure
for the same point
Log.d(TAG,"lo
cat
i
o
n
is
ok");
if (System.cur
ren
t
TimeMi
l
lis() - mLastClic
kTi
me
<= DOUBLE_CLIC
K_T
IME) {
Log
.d(
TAG
,
"time
is
o
k
");
Toast toast = To
ast.ma
keText
(m
Conte
x
t, "Doub
l
e Click"
,
Toast.LENGTH_S
HO
RT);
toast.setGravity(
Gravi
t
y.BOTTOM |
Gravity
.
CENTER_
HO
RIZONTA
L
, 0, 0);
toast.show();
}
}
mLastClickTime =
Syst
em.currentTimeM
il
lis();
mL
astUpInScreenX = x;
m
La
stUpInScreenY = y;
b
r
ea
k;
}
}
上面的变量请自行初始化,DOUBLE_CLICK_TIME的时间设为了500ms/