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

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

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

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

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

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

  • انقر على رمز الترجمة إلى KEYCODE_DPAD_CENTER.
  • يُترجم الضغط على زر الكاميرا إلى KEYCODE_CAMERA.
  • يؤدي التمرير سريعًا للأسفل إلى الترجمة إلى 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 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
    }
}

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

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

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

اكتشاف الإيماءات على مستوى النشاط

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