谷歌眼鏡GDK開發指南之觸控手勢

原文地址:http://bbs.seacat.cn/thread-900-1-1.html


可以通過Android sdk訪問Glass觸控板的原始數據。但GDK提供一個 gesture detector ,可以自動識別通用手勢,包括觸摸、滑動和滾動。


通過D-pad keys識別手勢


默認情況下,Glass系統會將簡單的手勢轉換爲D-pad keys事件。可以監聽onKeyDown() 和 onKeyUp() 事件來處理D-pad keys:




1、觸摸事件轉義爲 KEYCODE_DPAD_CENTER
2、相機按鈕按下事件轉義爲 KEYCODE_CAMERA.
3、下滑事件轉移爲 KEYCODE_BACK


這是一小段觸控事件的代碼:


public class MyActivity extends Activity {
    ...
    @Override
    public boolean onKeyDown(int keycode, KeyEvent event) {
        if (keycode == KeyEvent.KEYCODE_DPAD_CENTER) {
            // user tapped touchpad, do something
            return true;
        }
        ...
        return false;
    }
}



通過gesture detector識別


使用gesture detector可以識別更多複雜的手勢,例如多點觸控或滾動。複雜的手勢沒有對應的D-pad key。


你可以實現 GestureDetector 提供的監聽接口來通知 Gesture


識別activity層級的手勢


1、創建一個 GestureDetector 的監聽來處理識別的手勢
2、重寫activity的 onGenericMotionEvent() 方法,傳入motion events給gesture detector的onMotionEvent()方法




當一個motion時間發生時,系統將它傳給gesture detector。如果被識別了,gesture detector通知相關的監聽接口來處理事件。


public class MainActivity extends Activity {
    private GestureDetector mGestureDetector;
    // ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        mGestureDetector = createGestureDetector(this);
    }
 
    private GestureDetector createGestureDetector(Context context) {
    GestureDetector gestureDetector = new GestureDetector(context);
        //Create a base listener for generic gestures
        gestureDetector.setBaseListener( new GestureDetector.BaseListener() {
            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    // do something on tap
                    return true;
                } else if (gesture == Gesture.TWO_TAP) {
                    // do something on two finger tap
                    return true;
                } else if (gesture == Gesture.SWIPE_RIGHT) {
                    // do something on right (forward) swipe
                    return true;
                } else if (gesture == Gesture.SWIPE_LEFT) {
                    // do something on left (backwards) swipe
                    return true;
                }
                return false;
            }
        });
        gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
            @Override
            public void onFingerCountChanged(int previousCount, int currentCount) {
              // do something on finger count changes
            }
        });
        gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
            @Override
            public boolean onScroll(float displacement, float delta, float velocity) {
                // do something on scrolling
            }
        });
        return gestureDetector;
    }
 
    /*
     * Send generic motion events to the gesture detector
     */
    @Override
    public boolean onGenericMotionEvent(MotionEvent event) {
        if (mGestureDetector != null) {
            return mGestureDetector.onMotionEvent(event);
        }
        return false;
    }
}



識別view層級的手勢


1、創建 一個自定義view並重寫 dispatchGenericFocusedEvent() 方法。當一個motion 時間發生時,這個方法傳入motion事件給gesture detector。


2、設置view爲focusable ,以便當view獲取焦點的時候能檢測到事件。


3、創建一個 GestureDetector 的監聽來處理識別的手勢




當gesture detector識別到一個motion 的時候,gesture detector通知相關的監聽接口來處理事件。


/**
 * TextView that handles touchpad input (currently only TAP).
 */
public class TouchpadHandlingTextView extends TextView
        implements OnAttachStateChangeListener{
 
    private final GestureDetector mTouchDetector;
 
    public TouchpadHandlingTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchDetector = createGestureDetector(context);
        // must set the view to be focusable
        setFocusable(true);
        setFocusableInTouchMode(true);
    }
 
    public TouchpadHandlingTextView(Context context) {
        this(context, null);
    }
 
    @Override
    public void onViewAttachedToWindow(View v) {
        requestFocus();
    }
 
    @Override
    public void onViewDetachedFromWindow(View v) {
    }
 
    /**
     * Pass a MotionEvent into the gesture detector
     */
    @Override
    public boolean dispatchGenericFocusedEvent(MotionEvent event) {
        if (isFocused()) {
            return mTouchDetector.onMotionEvent(event);
        }
        return super.dispatchGenericFocusedEvent(event);
    }
 
    /**
     * Create gesture detector that triggers onClickListener. Implement
     * onClickListener in your Activity and override
     * onClick() to handle the "tap" gesture.
     */
    private GestureDetector createGestureDetector(Context context) {
        GestureDetector gd = new GestureDetector(context);
        gd.setBaseListener(new GestureDetector.BaseListener() {
 
            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    return performClick();
                }
                return false;
            }
        });
        return gd;
    }
}




發佈了24 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章