Gestur Sentuh

Mengakses data mentah dari touchpad Glass dapat dilakukan dengan Android SDK.

Namun, GDK memberikan detektor gestur yang otomatis mendeteksi gestur umum pada Glass, termasuk mengetuk, menggeser, dan men-scroll.

Selain itu, {i>gesture <i}sederhana diterjemahkan menjadi Peristiwa D-pad secara default untuk memudahkan pemrosesan tanpa menggunakan pendeteksi gestur.

Mendeteksi gestur sebagai peristiwa tombol D-pad

Secara default, sistem Glass menerjemahkan gestur sederhana menjadi peristiwa tombol D-pad. Ini memungkinkan Anda mendengarkan onKeyDown() dan onKeyUp() peristiwa pada aktivitas atau tampilan untuk memproses gestur berikut sebagai tombol D-pad:

Cuplikan berikut mendeteksi saat pengguna mengetuk touchpad:

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

Metode untuk mendeteksi ketukan pada setiap tampilan adalah dengan mengimplementasikan OnClickListener untuk tampilan. Saat pengguna mengetuk touchpad (diterjemahkan sebagai klik tombol tengah D-pad) dengan fokus pada tampilan, tampilan dapat menangani peristiwa dengan 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
    }
}

Mendeteksi gestur dengan pendeteksi gestur

Pendeteksi gestur juga memungkinkan Anda mendeteksi gestur sederhana sebagai {i>gesture <i}yang lebih kompleks, seperti mereka yang menggunakan beberapa jari atau men-scroll. Rumit tidak memiliki tombol D-pad yang sesuai.

GestureDetector menyediakan antarmuka pemroses yang dapat Anda implementasikan agar diberi tahu tentang Gestur.

Mendeteksi gestur tingkat aktivitas

Mendeteksi {i>gesture <i}pada level aktivitas adalah hal yang tepat ketika Anda tidak peduli bagian mana dari UI Anda memiliki fokus. Misalnya, jika Anda ingin menampilkan menu saat pengguna mengetuk touchpad, terlepas dari tampilan yang memiliki fokus, Anda akan menangani MotionEvent dalam aktivitas.

Contoh berikut:

  1. Membuat GestureDetector yang mengimplementasikan pemroses untuk memproses gestur yang dikenali.
  2. Mengganti metode onGenericMotionEvent() aktivitas untuk meneruskan peristiwa gerakan ke detektor gestur Metode onMotionEvent().

Saat peristiwa gerakan terjadi, sistem akan meneruskannya ke detektor gestur. Jika dikenali, detektor gestur akan memberi tahu pemroses yang sesuai untuk memproses acara tersebut.

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

Mendeteksi gestur tingkat tampilan

Mendeteksi gestur pada tingkat tampilan adalah saat yang tepat ingin melakukan hal yang berbeda bergantung pada tampilan yang memiliki fokus.

Contoh berikut:

  1. Membuat tampilan kustom yang menggantikan dispatchGenericFocusedEvent() . Saat terjadi peristiwa gerakan, metode ini akan meneruskan peristiwa gerakan ke detektor gestur.
  2. Mendeklarasikan tampilan agar dapat difokuskan sehingga mendeteksi peristiwa saat memiliki fokus.
  3. Membuat GestureDetector yang mengimplementasikan pemroses untuk memproses gestur yang dikenali.

Saat detektor gestur mengenali gerakan saat tampilan sedang difokuskan, detektor gestur memanggil pemroses yang sesuai.

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