ورودی چرخشی

برخی از دستگاه‌های Wear OS حاوی یک دکمه فیزیکی چرخان کناری هستند. وقتی کاربر دکمه را می‌چرخاند، نمای فعلی برنامه شما را به سمت بالا یا پایین حرکت می‌دهد. به این نوع ورودی، ورودی چرخشی می گویند.

توجه: این راهنما در درجه اول به مدیریت ورودی چرخشی با استفاده از رابط های کاربری مبتنی بر View اشاره دارد. برای اطلاعات بیشتر در مورد مدیریت ورودی چرخشی با استفاده از Compose for Wear OS، ورودی چرخشی در نوشتن را ببینید.

بسیاری از کانتینرهای قابل پیمایش، مانند ScrollView ، ListView ، HorizontalScrollView ، و WearableRecyclerView ، اگر فوکوس داشته باشند بدون نیاز به کد مخصوص Wear OS، از ورودی چرخشی پشتیبانی می کنند. داشتن فوکوس یک پیش نیاز مهم است، زیرا در اندروید 9 (سطح API 28) و بالاتر، نماها به طور ضمنی فوکوس دریافت نمی کنند.

روی بهترین شیوه ها تمرکز کنید

برای پاسخ به رویدادهای ورودی چرخشی، یک ظرف قابل پیمایش باید فوکوس داشته باشد. رویدادهای ورودی چرخشی سلسله مراتب نمایش را حباب نمی کند. اگر نمای متمرکزی وجود نداشته باشد، یا اگر نمای متمرکز از View.onGenericMotionEvent() false برگرداند، رویداد به Activity.onGenericMotionEvent() ارسال می‌شود.

موارد زیر بهترین روش‌های پاسخگویی به رویدادهای ورودی چرخشی هستند:

  • به خاطر داشته باشید که به‌طور پیش‌فرض، راه‌اندازی یک فعالیت یا حتی ضربه زدن روی یک نما، به آن فوکوس نمی‌دهد، حتی اگر قابل فوکوس باشد. برای اینکه نمای خود را فوکوس کنید، نما باید از تگ <requestFocus /> استفاده کند یا به صورت دستی View.requestFocus() فراخوانی کند.
  • نماهای قابل پیمایش سفارشی را با استفاده از android:focusable="true" و android:focusableInTouchMode="true" به عنوان قابل فوکوس علامت گذاری کنید.
  • اگر نمای قابل پیمایش شما بعد از Activity.onCreate() ضمیمه شده است — به عنوان مثال، منتظر اتمام درخواست شبکه قبل از ساختن رابط کاربری خود هستید، پس از پیوست کردن آن requestFocus() فراخوانی کنید.
  • اگر نمای قابل پیمایش شما در ابتدا INVISIBLE یا GONE است، هنگامی که آن را روی VISIBLE تنظیم کردید requestFocus() را فراخوانی کنید.
  • اگر فعالیت شما حاوی چندین نمای قابل پیمایش است، یکی را برای تمرکز با استفاده از تگ <requestFocus /> انتخاب کنید. پیمایش تو در تو با دکمه کناری چرخان پشتیبانی نمی شود.
  • اگر رابط کاربری شما حاوی نمای دیگری است که هنگام تعامل کاربر با آن فوکوس می‌کند - به عنوان مثال، یک InputText ، به کاربر راهی برای بازگرداندن فوکوس به نمای قابل پیمایش در صورت از دست دادن فوکوس با گوش دادن به ضربه‌های روی نمای پیمایشی و فراخوانی requestFocus() بدهید. requestFocus() در پاسخ.

رفتار چرخشی سفارشی

اگر نمای قابل پیمایش شما به طور طبیعی از پیمایش ورودی چرخشی پشتیبانی نمی‌کند، یا اگر می‌خواهید از ورودی چرخشی خود برای چیزی غیر از پیمایش استفاده کنید - مانند بزرگ‌نمایی و کوچک‌نمایی یا چرخاندن شماره‌گیرها - می‌توانید رویدادهای اسکرول را خودتان مدیریت کنید. به یاد داشته باشید که مطمئن شوید که دیدگاه شما تمرکز می کند، در غیر این صورت رویدادها از بین نمی روند.

قطعه کد زیر نحوه استفاده از MotionEvent ، InputDeviceCompat و ViewConfigurationCompat را برای افزودن پیمایش سفارشی به نمای خود نشان می دهد:

کاتلین

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
  }
}

جاوا

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 استفاده کنید. برنامه Wear خود را روی شبیه ساز اجرا کنید تا پروژه خود را اجرا کنید یا یک فایل APK را روی شبیه ساز بکشید تا آن را نصب کنید.

برای تست ورودی چرخشی در شبیه ساز:

  1. از مدیر SDK ، از برگه ابزارهای SDK برای دریافت شبیه ساز اندروید 26.0.3 یا بالاتر استفاده کنید.
  2. در Android Studio، Tools > Android > AVD Manager را انتخاب کنید. یک دستگاه Wear جدید با API 25 یا بالاتر ایجاد کنید .
  3. شبیه ساز را از Android Studio اجرا کنید .
  4. روی منوی سرریز سه نقطه در پایین نوار ابزار شبیه ساز کلیک کنید. روی زبانه ورودی چرخشی در پنجره جدید کلیک کنید تا رابط ورودی چرخشی باز شود و اسکرول ورودی چرخشی را امتحان کنید.

ویدئوی زیر ورودی چرخشی در شبیه ساز را نشان می دهد: