रोटरी इनपुट

कुछ Wear OS डिवाइसों में एक फ़िज़िकल रोटेटिंग साइड बटन होता है. जब उपयोगकर्ता बटन का उपयोग करता है, तो यह आपके ऐप्लिकेशन के वर्तमान दृश्य को ऊपर या नीचे स्क्रॉल करता है. इस तरह के इनपुट को यह कहा जाता है रोटरी इनपुट.

ध्यान दें: इस गाइड में मुख्य रूप से, रोटरी इनपुट को हैंडल करने के बारे में बताया गया है. इसके लिए, व्यू पर आधारित यूज़र इंटरफ़ेस (यूआई). Wear OS के लिए लिखने की सुविधा का इस्तेमाल करके, रोटरी इनपुट मैनेज करने के बारे में ज़्यादा जानने के लिए, यहां देखें Compose पर रोटरी इनपुट.

स्क्रोल किए जा सकने वाले कई कंटेनर, जैसे ScrollView, ListView, HorizontalScrollView, और WearableRecyclerView, रोटरी इनपुट की सुविधा दें, अगर उन्हें फ़ोकस करने के लिए Wear की ज़रूरत नहीं है ओएस के लिए खास कोड. 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 Emulator का इस्तेमाल करें Wear डिवाइस पर स्क्रोल कर रहे हैं. चलाने के लिए, एम्युलेटर पर अपना Wear ऐप्लिकेशन लॉन्च करें प्रोजेक्ट को खींचें या किसी प्रोजेक्ट को APK फ़ाइल को एम्युलेटर पर इंस्टॉल करने के लिए.

एम्युलेटर पर रोटरी इनपुट की जांच करने के लिए:

  1. एसडीके मैनेजर में जाकर, एसडीके टूल टैब का इस्तेमाल करके ये काम करें Android Emulator 26.0.3 या उसके बाद का वर्शन पाएं.
  2. Android Studio में, टूल > चुनें Android > एवीडी मैनेजर. एपीआई 25 वाला नया Wear डिवाइस बनाएं या उच्च.
  3. Android Studio से एम्युलेटर चलाएं.
  4. एम्युलेटर टूलबार के सबसे नीचे मौजूद, तीन बिंदु वाले ओवरफ़्लो मेन्यू पर क्लिक करें. क्लिक करें रोटरी इनपुट इंटरफ़ेस खोलने और रोटरी आज़माने के लिए, नई विंडो में रोटरी इनपुट टैब जोड़ें इनपुट स्क्रोलिंग.

नीचे दिया गया वीडियो एम्युलेटर में रोटरी इनपुट दिखाता है: