터치 동작

Glass 터치패드의 원시 데이터에 액세스하는 것은 Android SDK입니다.

하지만 GDK는 동작 감지기를 통해 Glass에서 다음과 같은 일반적인 동작을 자동으로 감지합니다. 탭, 스와이프, 스크롤이 있습니다.

또한 간단한 동작은 기본적으로 D패드 이벤트를 사용해 이벤트를 처리하지 않고도 쉽게 처리할 수 있음 동작 감지기를 사용합니다

동작을 D패드 키 이벤트로 감지

기본적으로 Glass 시스템은 간단한 동작을 D패드 키 이벤트로 변환합니다. 이 들을 수 있어 onKeyDown() 드림 및 onKeyUp() 이벤트를 사용하여 다음 동작을 D패드 키로 처리합니다.

다음 스니펫은 사용자가 터치패드를 탭할 때 이를 감지합니다.

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 super.onKeyDown(keycode, event);
    }
}

개별 뷰에서 탭을 감지하는 메서드는 OnClickListener 드림 입니다. 사용자가 터치패드를 탭할 때 (D패드의 가운데 버튼 클릭으로 번역됨) 뷰에 포커스가 있으면 뷰는 OnClickListener

public final class MyActivity extends Activity implements OnClickListener {

    View cardView;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        cardView = new Card(this).setText("Tap to carry out an action").getView();
        // To receive touch events from the touchpad, the view should be focusable.
        cardView.setOnClickListener(this);
        cardView.setFocusable(true);
        cardView.setFocusableInTouchMode(true);
        setContentView(cardView);
    }

    @Override
    protected void onResume() {
        // To receive touch events from the touchpad, the view should have focus.
        cardView.requestFocus();
        super.onResume();
    }

    @Override
    public void onClick(View v) {
        // perform desired action
    }
}

동작 감지기로 동작 감지

동작 감지기를 사용하면 간단한 동작도 감지할 수 있습니다. 좀 더 복잡한 동작일 수도 있고 여러 손가락을 사용하거나 스크롤을 사용하는 등의 동작을 할 수 있습니다 복잡함 동작에는 해당하는 D패드 키가 없습니다.

GestureDetector 사용자가 구현할 수 있는 리스너 인터페이스를 제공합니다. 동작에 대한 알림을 받습니다.

활동 수준 동작 감지

활동 수준에서 동작을 감지하는 것이 적절함 UI의 어떤 부분이 중요한지 상관없을 때 초점을 맞추고 있습니다. 예를 들어 사용자가 선택한 메뉴 항목을 사용자가 터치패드를 탭할 때 어떤 뷰에 포커스가 있는지와 상관없이 MotionEvent 확인할 수 있습니다.

예를 들면 다음과 같습니다.

  1. GestureDetector를 만듭니다. 는 인식된 동작을 처리하기 위해 리스너를 구현합니다.
  2. 동작 감지기에 모션 이벤트를 전달하도록 활동의 onGenericMotionEvent() 메서드를 재정의합니다. onMotionEvent() 메서드를 사용하여 지도 가장자리에 패딩을 추가할 수 있습니다.

모션 이벤트가 발생하면 시스템은 이를 동작 감지기로 전달합니다. 만약 인식된 경우, 동작 감지기는 해당 리스너가 있습니다.

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;
    }
}

뷰 수준 동작 감지

뷰 수준에서 동작을 감지하는 것은 어떤 보기에 포커스가 있는지에 따라 다른 작업을 해야 합니다.

예를 들면 다음과 같습니다.

  1. 다음 메서드를 재정의하는 맞춤 뷰를 만듭니다. dispatchGenericFocusedEvent() 드림 메서드를 사용하여 축소하도록 요청합니다. 모션 이벤트가 발생하면 이 메서드는 모션 이벤트를 동작 감지기에 전달합니다.
  2. 포커스가 있을 때 이벤트를 감지하도록 뷰를 포커스 가능으로 선언합니다.
  3. 다음을 구현하는 GestureDetector를 만듭니다. 리스너를 추가하여 인식된 동작을 처리합니다.

동작 감지기가 뷰에 포커스가 있을 때 모션을 인식하면 동작 감지기가 적절한 리스너를 호출합니다.

/**
 * 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;
    }
}