إدخال البيانات عبر وحدة تحكُّم دورانية

تحتوي بعض أجهزة Wear OS على زرّ جانبي دوار. عندما يحرّك المستخدم الزر، يمرّر طريقة العرض الحالية لتطبيقك إلى الأعلى أو الأسفل. ويُسمّى هذا النوع من الإدخال إدخال البيانات عبر وحدة تحكُّم دورانية.

ملاحظة: يشير هذا الدليل في المقام الأول إلى التعامل مع الإدخال عبر وحدة تحكُّم دورانية باستخدام واجهات المستخدم المستندة إلى العرض. لمزيد من المعلومات حول التعامل مع الإدخال عبر وحدة تحكُّم دورانية باستخدام ميزة "الكتابة" على نظام التشغيل Wear OS، يُرجى الاطّلاع على الإدخال من خلال وحدة تحكُّم دورانية في Compose.

يتيح العديد من الحاويات القابلة للتمرير، مثل ScrollView وListView وHorizontalScrollView وWearableRecyclerView، طريقة إدخال البيانات باستخدام وحدة تحكُّم دورانية إذا كان التركيز عليها بدون الحاجة إلى استخدام أي رمز خاص بنظام التشغيل Wear OS. ويجب أن يكون التركيز شرطًا أساسيًا أساسيًا، لأنّ المشاهدات لا تجذب الاهتمام بشكل ضمني في نظام التشغيل Android 9 (المستوى 28 لواجهة برمجة التطبيقات) والإصدارات الأحدث.

أفضل الممارسات للتركيز

للاستجابة إلى أحداث الإدخال عبر وحدة تحكُّم دورانية، يجب أن يتم التركيز على حاوية قابلة للتمرير. لا تؤدي أحداث الإدخال من خلال دوران إلى عرض فقاعات التفسيرية للتسلسل الهرمي لطريقة العرض. في حال عدم توفّر طريقة عرض مركّزة، أو إذا كانت طريقة العرض المركّزة تعرض false من View.onGenericMotionEvent()، يتم إرسال الحدث إلى Activity.onGenericMotionEvent().

في ما يلي أفضل الممارسات المتعلّقة بالاستجابة لأحداث الإدخال عبر دوران البيانات:

  • يُرجى العِلم أنّ بدء نشاط أو حتى النقر على عرض لا يؤدي إلى التركيز عليه، حتى إذا كان قابلاً للتركيز. للتركيز على طريقة العرض، يجب أن يستخدم العرض علامة <requestFocus /> أو من خلال طلب View.requestFocus() يدويًا.
  • وضع علامة على طرق العرض المخصّصة القابلة للتمرير على أنّها قابلة للتركيز باستخدام كل من android:focusable="true" وandroid:focusableInTouchMode="true".
  • في حال إرفاق العرض القابل للتمرير بعد Activity.onCreate()، على سبيل المثال، في انتظار انتهاء طلب الشبكة قبل إنشاء واجهة المستخدم، استدعِ requestFocus() بعد إرفاقه.
  • إذا كان العرض القابل للتمرير مبدئيًا هو INVISIBLE أو GONE، اتّصِل بـ requestFocus() عند الضبط على VISIBLE.
  • إذا كان نشاطك يتضمّن عدة طرق عرض قابلة للتمرير، اختَر طريقة عرض للتركيز عليها باستخدام علامة <requestFocus />. التمرير المتداخل غير متاح مع الزر الجانبي الدوّار.
  • إذا كانت واجهة المستخدم تحتوي على طريقة عرض أخرى يتم التركيز عليها عندما يتفاعل المستخدم معها، على سبيل المثال، InputText، يجب منح المستخدم طريقة لاستعادة التركيز إلى العرض القابل للتمرير في حال فقد التركيز من خلال الاستماع إلى النقرات في العرض القابل للتمرير وطلب requestFocus() كاستجابة لذلك.

سلوك مخصّص بالتناوب

إذا كان العرض القابل للتمرير لا يتوافق في الأساس مع التمرير عبر طريقة إدخال البيانات عبر وحدة تحكُّم دورانية أو إذا كنت تريد استخدام طريقة الإدخال عبر وحدة تحكُّم دورانية لغير التمرير، مثل التكبير والتصغير أو تدوير الأقراص، يمكنك التعامل مع أحداث التنقّل بنفسك. احرص على أن ينصبّ تركيزك على وجهة نظرك، وإلا لن تتم استضافة الفعاليات.

يوضّح مقتطف الرمز التالي كيفية استخدام MotionEvent وInputDeviceCompat وViewConfigurationCompat لإضافة تمرير مخصّص إلى طريقة العرض:

Kotlin

myView.setOnGenericMotionListener { v, ev ->
  if (ev.action == MotionEvent.ACTION_SCROLL &&
      ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
  ) {
    // Don't forget the negation here
    val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
        ViewConfigurationCompat.getScaledVerticalScrollFactor(
             ViewConfiguration.get(context), context
        )
    // Swap these axes to scroll horizontally instead
    v.scrollBy(0, delta.roundToInt())
    true
  } else {
    false
  }
}

Java

myView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
  @Override
  public boolean onGenericMotion(View v, MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_SCROLL &&
        ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
    ) {
      // Don't forget the negation here
      float delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
          ViewConfigurationCompat.getScaledVerticalScrollFactor(
               ViewConfiguration.get(context), context
          );

      // Swap these axes to scroll horizontally instead
      v.scrollBy(0, Math.round(delta));

      return true;
    }
    return false;
  }
});

الاختبار باستخدام المحاكي

يمكنك استخدام محاكي Android لمحاكاة التمرير عبر وحدة تحكُّم دورانية على جهاز Wear OS. شغِّل تطبيق Wear OS على المحاكي لتشغيل مشروعك أو اسحب ملف APK إلى المحاكي لتثبيته.

لاختبار طريقة إدخال البيانات عبر وحدة تحكُّم دورانية في المحاكي:

  1. من مدير حزمة تطوير البرامج (SDK)، استخدِم علامة التبويب أدوات حزمة تطوير البرامج للحصول على الإصدار 26.0.3 من محاكي Android أو إصدار أحدث.
  2. في "استوديو Android"، انقر على الأدوات > Android > مدير AVD. أنشئ جهاز Wear جديدًا بواجهة برمجة التطبيقات 25 أو إصدار أحدث.
  3. تشغيل المحاكي من "استوديو Android"
  4. انقر على القائمة الكاملة للنقاط الثلاث أسفل شريط أدوات المحاكي. انقر على علامة التبويب إدخال البيانات عبر وحدة تحكُّم دورانية في النافذة الجديدة لفتح واجهة الإدخال عبر وحدة تحكُّم دورانية وتجربة تمرير الإدخال عبر وحدة تحكُّم دورانية.

يعرض الفيديو التالي طريقة إدخال البيانات عبر وحدة تحكُّم دورانية في المحاكي: