إيماءات اللمس

يمكن الدخول إلى البيانات الأولية من لوحة لمس Glass باستخدام حزمة تطوير البرامج (SDK) لنظام التشغيل Android.

ومع ذلك، توفر دالة GDK أداة رصد الإيماءات الإيماءات الشائعة تلقائيًا في Glass، بما في ذلك النقر والتمرير السريع والتمرير.

بالإضافة إلى ذلك، تتم ترجمة الإيماءات البسيطة إلى استخدِم لوحة التحكّم تلقائيًا لمعالجة الأحداث بسهولة بدون باستخدام أداة رصد الإيماءات.

رصد الإيماءات كأحداث رئيسية على لوحة التحكّم

يحوّل نظام Glass تلقائيًا الإيماءات البسيطة إلى أحداث رئيسية على لوحة التحكّم. هذا النمط يتيح لك الاستماع إلى onKeyDown() وonKeyUp() الأحداث المرتبطة بالأنشطة أو طرق العرض لمعالجة الإيماءات التالية كمفاتيح في لوحة التحكّم:

يرصد المقتطف التالي عندما ينقر المستخدمون على لوحة اللمس:

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 للعرض. عندما ينقر المستخدمون على لوحة اللمس (يُترجم هذا الإجراء كنقرة على لوحة التحكّم المركزية) مع التركيز على العرض، يمكن لطريقة العرض التعامل مع الحدث من خلال 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
    }
}

رصد الإيماءات باستخدام أداة رصد الإيماءات

تتيح لك أدوات رصد الإيماءات اكتشاف الإيماءات البسيطة أيضًا كإيماءات أكثر تعقيدًا، مثل تلك التي تستخدم أصابع متعددة أو التمرير معقد الإيماءات ليس لها مفتاح لوحة تحكم مقابل.

GestureDetector توفّر واجهات استماع يمكنك تنفيذها ليتم إشعارك بإيماءة.

رصد الإيماءات على مستوى النشاط

يعد اكتشاف الإيماءات على مستوى النشاط مناسبًا عندما لا تهتم بأي جزء من واجهة المستخدم بشكل عام. على سبيل المثال، إذا كنت تريد إظهار قائمة عندما ينقر المستخدمون على لوحة اللمس، بغض النظر عن العرض الذي يتم التركيز عليه، ستتعامل مع 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;
    }
}