Android Wear 交互表面设计及Android 双击事件监测实现

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/    
         

你可能感兴趣的:(Android)