استخدام إيماءات المعصم على Wear OS

يمكن أن توفر إيماءات المعصم تفاعلات سريعة بيد واحدة مع تطبيقك عندما تكون الشاشة التي تعمل باللمس غير ملائمة.

على سبيل المثال، يمكن للمستخدم الانتقال بين الإشعارات بيده أثناء حمل كوب ماء باليد الأخرى. تشمل حالات الاستخدام الأخرى لإيماءات المعصم ما يلي:

  • في أحد تطبيقات الركض، أثناء التنقّل عبر الشاشات العمودية التي تعرض الخطوات التي تم قطعها والوقت المنقضي والسرعة الحالية
  • تصفُّح معلومات الرحلات الجوية والبوابة في أحد تطبيقات السفر
  • تصفُّح المقالات في أحد تطبيقات الأخبار

لمراجعة إيماءات المعصم على جهاز ساعة، تأكَّد من تفعيل الإيماءات من خلال اختيار الإعدادات > الميزات المتقدمة > الإيماءات > إيماءات المعصم مفعَّلة. بعد ذلك، أكمِل الدليل التوجيهي عن الإيماءات على الساعة بالنقر على تشغيل الدليل التوجيهي.

ملاحظة: إنّ هز المعصم هو إيماءة الرجوع إلى الخلف أو إيماءة التراجع على مستوى النظام، ولا يمكن تخصيصها من خلال التطبيقات.

يمكن استخدام إيماءات المعصم بالطرق التالية، كما هو موضّح في هذا الدليل:

يتم ربط كل إيماءة معصم بقيمة ثابتة int من الفئة KeyEvent، كما هو موضّح في الجدول التالي:

الإيماءة الحدث الرئيسي الوصف
تدوير المعصم بسرعة إلى اليسار ثم تدويره ببطء إلى اليمين KEYCODE_NAVIGATE_NEXT ينتقل رمز المفتاح هذا إلى العنصر التالي.
تدوير المعصم ببطء إلى اليسار ثم تدويره بسرعة إلى اليمين KEYCODE_NAVIGATE_PREVIOUS يؤدي رمز المفتاح هذا إلى الانتقال إلى العنصر السابق.

استخدام تصميم مقوّس لإتاحة إيماءات المعصم

توفّر الفئة WearableRecyclerView تصميمًا منحنيًا للقوائم متوافقة مع إيماءات المعصم تلقائيًا. وتتضمن الفئة إجراءات محدّدة مسبقًا لمرات ظهور إيماءات المعصم عندما يكون التركيز على الرؤية. للحصول على معلومات عن استخدام الصف WearableRecyclerView، راجِع المقالة إنشاء قوائم على نظام التشغيل Wear OS. يمكنك أيضًا مراجعة قسم أفضل الممارسات في هذا الدليل.

ملاحظة: تحلّ الفئة WearableRecyclerView محلّ فئة مشابهة تم إيقافها في مكتبة دعم الأجهزة القابلة للارتداء.

وحتى إذا كنت تستخدم WearableRecyclerView، ننصحك باستخدام ثوابت من الفئة KeyEvent. يمكن إلغاء الإجراءات المحدّدة مسبقًا من خلال إنشاء فئة فرعية من WearableRecyclerView وإعادة تنفيذ استدعاء onKeyDown(). ويمكن إيقاف السلوك بالكامل باستخدام setEnableGestureNavigation(false). لمزيد من المعلومات، يمكنك الاطّلاع على معالجة إجراءات لوحة المفاتيح.

استخدام الأحداث الرئيسية مباشرةً

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

أمّا الصف المرتبط بتفاعل المستخدم، مثل View أو Activity، والذي يستخدم KeyEvent.Callback، فيمكنه الاستماع إلى الأحداث الرئيسية المرتبطة بإيماءات المعصم، تمامًا كما يمكن إدراجه في أي حدث رئيسي آخر. يستدعي إطار عمل Android السمة View أو السمة Activity التي تركّز على الأحداث الرئيسية. بالنسبة إلى الإيماءات، يتم استدعاء طريقة استدعاء الإجراء onKeyDown() عند حدوث إيماءات.

على سبيل المثال، يمكن لتطبيق إلغاء الإجراءات المحدّدة مسبقًا في View أو Activity التي تنفّذ KeyEvent.Callback على النحو التالي:

Kotlin

class GesturesActivity : Activity() {

    /* KeyEvent.Callback */
    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        return when (keyCode) {
            KeyEvent.KEYCODE_NAVIGATE_NEXT ->
                // Do something that advances a user View to the next item in an ordered list.
                moveToNextItem()
            KeyEvent.KEYCODE_NAVIGATE_PREVIOUS ->
                // Do something that advances a user View to the previous item in an ordered list.
                moveToPreviousItem()
            else -> {
                // If you did not handle it, let it be handled by the next possible element as determined
                // by the Activity.
                super.onKeyDown(keyCode, event)
            }
        }
    }

    /** Shows the next item in the custom list.  */
    private fun moveToNextItem(): Boolean {
        ...
        // Return true if handled successfully, otherwise return false.
        return false
    }

    /** Shows the previous item in the custom list.  */
    private fun moveToPreviousItem(): Boolean {
        ...
        // Return true if handled successfully, otherwise return false.
        return false
    }
}

Java

public final class GesturesActivity extends Activity {

 @Override /* KeyEvent.Callback */
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  switch (keyCode) {
   case KeyEvent.KEYCODE_NAVIGATE_NEXT:
    // Do something that advances a user View to the next item in an ordered list.
    return moveToNextItem();
   case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:
    // Do something that advances a user View to the previous item in an ordered list.
    return moveToPreviousItem();
  }
  // If you did not handle it, let it be handled by the next possible element as determined by the Activity.
  return super.onKeyDown(keyCode, event);
 }

 /** Shows the next item in the custom list. */
 private boolean moveToNextItem() {
  boolean handled = false;
  ...
  // Return true if handled successfully, otherwise return false.
  return handled;
 }

 /** Shows the previous item in the custom list. */
 private boolean moveToPreviousItem() {
  boolean handled = false;
  ...
  // Return true if handled successfully, otherwise return false.
  return handled;
 }
}

أفضل الممارسات

  • يمكنك مراجعة صفحتَي KeyEvent و KeyEvent.Callback للاطّلاع على معلومات حول إرسال الأحداث الرئيسية إلى View وActivity.
  • استخدِم الخيار "تدوير المعصم للخارج" أو "تدوير المعصم للداخل" لاختيار الجهاز التالي.
  • استخدِم لمسة موازية للإيماءة.
  • تقديم ملاحظات مرئية.
  • ولا تستخدم رمزًا مفتاحيًا لتنفيذ وظائف قد تكون مخالفة لباقي العناصر في النظام. على سبيل المثال، لا تستخدم KEYCODE_NAVIGATE_NEXT لإلغاء إجراء أو للتنقّل على المحور الأيسر عن طريق الدوران.
  • لا تعترض الأحداث الرئيسية على العناصر التي ليست جزءًا من واجهة المستخدم، مثل المشاهدات المعروضة خارج الشاشة أو المغطاة جزئيًا. وينطبق ذلك تمامًا على أي حدث رئيسي.
  • لا تعيد تفسير إيماءات النقر المتكرر كإيماءة جديدة خاصة بك. قد يتعارض هذا مع إيماءة "اهتزاز المعصم" في النظام.
  • لكي يتلقّى العرض الأحداث الرئيسية باستخدام الإيماءات، يجب أن يكون محور التركيز. راجِع View.setFocusable().

    بما أنّه يتم التعامل مع الإيماءات على أنّها أحداث رئيسية، فهي تؤدي إلى الانتقال من "وضع اللمس" وقد يؤدي إلى تنفيذ إجراءات غير متوقّعة. وبما أنّ المستخدمين قد يبدّلون بين استخدام اللمس والإيماءات، قد تكون طريقة View::setFocusableInTouchmode() ضرورية. وفي بعض الحالات، قد يكون من الضروري أيضًا استخدام setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS) حتى يتم التركيز على الرؤية المقصودة عندما يتغير التركيز بعد إجراء تغيير على وضع اللمس أو بدءًا منه.

  • استخدِم requestFocus() وclearFocus() بعناية:
    • عند طلب الرقم requestFocus()، تأكَّد من أنّه مناسب للعرض الذي يتم التركيز عليه. إذا كان العرض خارج الشاشة أو مغطى بمشاهدة أخرى، يمكن أن تحدث مفاجآت عندما تؤدي الإيماءات إلى تشغيل استدعاءات.
    • تبدأ الطريقة clearFocus() عملية بحث تركيز للعثور على طريقة عرض أخرى مناسبة. استنادًا إلى التسلسل الهرمي لطريقة العرض، قد يتطلب هذا البحث طريقة حسابية بسيطة. وقد ينتهي الأمر أيضًا بتخصيص التركيز إلى ملف شخصي لا تتوقع أن يتم التركيز عليه.
  • يتم عرض الأحداث الرئيسية أولاً إلى العرض مع التركيز في التسلسل الهرمي للملفات الشخصية. إذا كانت طريقة العرض المركّزة لا تعالج الحدث، بمعنى آخر، تعرض false، لا يتم عرض الحدث في طريقة العرض الرئيسية، حتى إذا كان يجذب التركيز ويشتمِل على KeyListener. بدلاً من ذلك، يتم تسليم الفعالية إلى النشاط الحالي مع التركيز على التسلسل الهرمي للمشاهدات.

    لذلك، قد يكون من الضروري تسجيل جميع الفعاليات على مستوى أعلى، ثم تمرير الرموز ذات الصلة إلى مستوى أعلى. بدلاً من ذلك، يمكنك تصنيف النشاط في فئة فرعية وإلغاء طريقة dispatchKeyEvent(KeyEvent event) لاعتراض المفاتيح عند الضرورة أو التعامل معها عند عدم التعامل معها في الطبقات السفلى.