مرجع Android haptics API

این بخش مقدمه‌ای بر APIهای لمسی مختلف موجود در اندروید ارائه می‌دهد. همچنین زمان و نحوه‌ی بررسی پشتیبانی دستگاه لازم برای اطمینان از پخش جلوه‌های لمسی مطابق میل شما را پوشش می‌دهد.

روش‌های مختلفی برای ایجاد جلوه‌های لمسی وجود دارد و هنگام انتخاب از بین آنها، در نظر گرفتن اصول طراحی لمسی اندروید بسیار مهم است. جدول زیر خلاصه‌ای از ویژگی‌های سطح بالای هر رویکرد را نشان می‌دهد:

  • در هنگام برنامه‌ریزی برای جایگزینی رفتار، در دسترس بودن از اهمیت ویژه‌ای برخوردار است و باید با بررسی پشتیبانی تک تک دستگاه‌ها ترکیب شود.
  • حس لامسه شفاف، حس‌های واضح و تمیزی هستند که برای کاربران کمتر آزاردهنده هستند.
  • فناوری‌های لمسی غنی، بیان بهتری دارند و اغلب به سخت‌افزارهای غنی‌تری نیاز دارند.
سطح API در دسترس بودن لمس‌های واضح لمس غنی
ثابت‌های بازخورد لمسی اندروید ۱.۵+
(به ازای هر ثابت)
اثر لرزش از پیش تعریف شده اندروید ۱۰+
ترکیب اثر ارتعاش اندروید ۱۱+ (به ازای هر ثابت)
ارتعاشات روشن/خاموش، تک‌ضربه‌ای و موجی اندروید ۱

علاوه بر این، APIهای اعلان ، که در این صفحه توضیح داده شده‌اند، به شما امکان می‌دهند جلوه‌های لمسی که برای اعلان‌های دریافتی پخش می‌شوند را سفارشی کنید.

همچنین در این صفحه مفاهیم اضافی که سطوح API را پوشش می‌دهند، شرح داده شده است:

  • آیا دستگاه ویبراتور دارد؟
  • کنترل دامنه امکان ایجاد جلوه‌های لمسی نرم‌تر و غنی‌تر را فراهم می‌کند، اما توسط همه دستگاه‌ها پشتیبانی نمی‌شود.
  • VibrationAttributes() به شما کمک می‌کند تا ارتعاش را بر اساس کاربرد آن طبقه‌بندی کنید، اطمینان حاصل کنید که تنظیمات مناسب کاربر روی آن اعمال می‌شود و در نتیجه از غافلگیری کاربر جلوگیری می‌شود.

HapticFeedbackConstants

کلاس HapticFeedbackConstants ثابت‌های مبتنی بر عمل را ارائه می‌دهد تا به برنامه‌ها اجازه دهد بازخورد لمسی را به گونه‌ای اضافه کنند که در سراسر دستگاه سازگار باشد، به جای اینکه هر برنامه برای اقدامات مشترک جلوه‌های متفاوتی داشته باشد.

سازگاری و الزامات

استفاده از متد View.performHapticFeedback با این ثابت‌ها به هیچ مجوز خاصی برای برنامه نیاز ندارد. این تابع ویژگی View.hapticFeedbackEnabled است که اگر روی false تنظیم شود، تمام فراخوانی‌های بازخورد لمسی در نما، از جمله موارد پیش‌فرض، غیرفعال می‌شوند. تنظیم مرتبط اصلی، ویژگی View.hapticFeedbackEnabled است که اگر روی false تنظیم شود، تمام فراخوانی‌های بازخورد لمسی در نما، از جمله موارد پیش‌فرض، غیرفعال می‌شوند. این روش همچنین تنظیمات سیستم کاربر را برای فعال کردن بازخورد لمسی رعایت می‌کند.

تنها نکته‌ی قابل توجه در مورد سازگاری، سطح SDK مربوط به ثابت خاص برای آن عمل است.

هنگام استفاده از HapticFeedbackConstants نیازی به ارائه رفتار جایگزین نیست.

استفاده از HapticsFeedbackConstants

برای جزئیات بیشتر در مورد استفاده از HapticFeedbackConstants ، به افزودن بازخورد لمسی به رویدادها مراجعه کنید.

VibrationEffect از پیش تعریف شده

کلاس VibrationEffect چندین ثابت از پیش تعریف شده مانند CLICK ، TICK و DOUBLE_CLICK ارائه می‌دهد. این جلوه‌ها ممکن است برای دستگاه بهینه شوند.

سازگاری و الزامات

پخش هرگونه VibrationEffect نیاز به مجوز VIBRATE در مانیفست برنامه دارد.

هنگام استفاده از VibrationEffect از پیش تعریف شده، نیازی به ارائه رفتار جایگزین نیست، زیرا ثابت‌هایی که پیاده‌سازی بهینه‌شده برای دستگاه ندارند، به یک جایگزین استاندارد پلتفرم برمی‌گردند.

APIهای Vibrator.areEffectsSupported و Vibrator.areAllEffectsSupported برای تعیین وجود پیاده‌سازی بهینه‌شده برای دستگاه هستند. افکت‌های از پیش تعریف‌شده همچنان می‌توانند بدون پیاده‌سازی بهینه‌شده مورد استفاده قرار گیرند و از جایگزین استاندارد پلتفرم استفاده می‌کنند. در نتیجه، این APIهای areEffectsSupported فقط در صورتی مورد نیاز هستند که یک برنامه بخواهد در نظر بگیرد که آیا افکت برای دستگاه بهینه شده است یا خیر.

متدهای بررسی اثر می‌توانند یکی از سه مقدار زیر را برگردانند:

  • VIBRATION_EFFECT_SUPPORT_YES نشان می‌دهد که دستگاه از این افکت پشتیبانی بهینه کرده است.
  • VIBRATION_EFFECT_SUPPORT_NO نشان می‌دهد که دستگاه پشتیبانی بهینه‌شده‌ای ندارد، اما همچنان از نسخه پشتیبان پلتفرم استفاده می‌کند.
  • VIBRATION_EFFECT_SUPPORT_UNKNOWN نشان می‌دهد که سیستم نمی‌داند که آیا پیاده‌سازی بهینه شده است یا خیر.

از آنجایی که مقدار UNKNOWN نشان می‌دهد که API بررسی‌کننده در دسترس نیست، معمولاً برای همه جلوه‌ها یا هیچ‌کدام از آن‌ها برگردانده می‌شود. این دستگاه‌ها به صورت پویا بازمی‌گردند.

استفاده از VibrationEffect از پیش تعریف شده

برای جزئیات بیشتر در مورد استفاده از یک VibrationEffect از پیش تعریف شده، به استفاده از یک VibrationEffect از پیش تعریف شده برای تولید بازخورد لمسی مراجعه کنید.

اثر ارتعاش پوشش

ارتعاشات مبتنی بر پوشش، با تعریف توالی نقاط کنترل، امکان کنترل دقیق دامنه و فرکانس ارتعاش را در طول زمان فراهم می‌کنند. این امر توسعه‌دهندگان را قادر می‌سازد تا تجربیات بازخورد لمسی غنی‌تر و ظریف‌تری را خلق کنند. این ارتعاشات را می‌توان با استفاده از کلاس‌های BasicEnvelopeBuilder و WaveformEnvelopeBuilder ایجاد کرد.

سازگاری و الزامات

برای پخش هرگونه جلوه لرزشی، برنامه شما باید مجوز VIBRATE را در مانیفست برنامه اعلام کند.

برای بررسی پشتیبانی از جلوه‌های پوششی، تابع Vibrator.areEnvelopeEffectsSupported() را فراخوانی کنید.

سازنده پاکت پایه

برای ایجاد یک تجربه لمسی روان و یکپارچه، جلوه‌های پوششی باید با شدت ... شروع و پایان یابند. \( 0.0 \)این API با ثابت نگه داشتن شدت شروع روی صفر و ایجاد استثنا در صورتی که شدت پایان صفر نباشد، این امر را اعمال می‌کند. این محدودیت از اثرات دینامیکی نامطلوب در ارتعاشات ناشی از ناپیوستگی در دامنه که می‌تواند بر درک لمسی کاربر تأثیر منفی بگذارد، جلوگیری می‌کند.

برای ارائه رندرینگ یکپارچه جلوه پوششی در بین دستگاه‌ها، این چارچوب مستلزم آن است که دستگاه‌هایی که از این ویژگی پشتیبانی می‌کنند، بتوانند حداقل مدت زمان 20 میلی‌ثانیه را بین نقاط کنترل و حداقل 16 نقطه را برای جلوه‌های پوششی مدیریت کنند.

سازنده پاکت موج

این چارچوب مقادیر فرکانس و دامنه درخواستی ارائه شده توسط توسعه‌دهنده را تغییر نمی‌دهد. با این حال، API همچنین دامنه شروع را در صفر ثابت می‌کند تا انتقال‌های نرم ایجاد شود.

برای کمک به شما در بهینه‌سازی جلوه‌های پوشش موج برنامه‌تان و فراهم کردن سازگاری بین دستگاه‌ها، اندروید APIهایی را برای پرس‌وجو از قابلیت‌های مهم دستگاه ارائه می‌دهد. این روش‌ها اطلاعاتی در مورد محدودیت‌های دستگاه، مانند حداکثر و حداقل مدت زمان انتقال بین نقاط کنترل و حداکثر تعداد نقاط کنترل پشتیبانی شده برای یک جلوه واحد، ارائه می‌دهند:

getMaxSize()
حداکثر تعداد نقاط کنترل پشتیبانی شده برای یک جلوه پوششی را بازیابی می‌کند.
getMinControlPointDurationMillis()
حداقل مدت زمان پشتیبانی شده، بر حسب میلی ثانیه، بین دو نقطه کنترل درون یک افکت پوششی را بازیابی می‌کند.
getMaxControlPointDurationMillis()
حداکثر مدت زمان پشتیبانی شده، بر حسب میلی ثانیه، بین دو نقطه کنترل درون یک افکت پوششی را بازیابی می‌کند.
getMaxDurationMillis()
حداکثر مدت زمان پشتیبانی شده برای یک افکت پوششی را بر حسب میلی ثانیه بازیابی می‌کند.

اگر یک افکت از محدودیت‌های دستگاه فراتر رود - مانند اجازه دادن به نقاط کنترل بیش از حد یا مدت زمان بیش از حداکثر - چارچوب به طور خودکار افکت را تنظیم می‌کند تا در محدوده مجاز قرار گیرد. این فرآیند تنظیم سعی می‌کند تا حد امکان هدف و حس اصلی طرح را حفظ کند.

استفاده از اثرات ارتعاش پوششی

برای جزئیات بیشتر در مورد ایجاد جلوه‌های شکل موج پوششی، به ایجاد شکل موج ارتعاشی با پوشش‌ها مراجعه کنید.

ترکیب VibrationEffect

یک کامپوزیشن VibrationEffect یک افکت ارتعاشی است که با استفاده از API مربوط به VibrationEffect.startComposition ایجاد می‌شود. این API با ایجاد دنباله‌ای از عناصر اولیه با تأخیرها و شدت‌های سفارشی، امکان لمس غنی و رسا را ​​فراهم می‌کند. با این حال، برای جلوگیری از یک تجربه کلی متناقض، دقت ویژه‌ای داشته باشید تا مطمئن شوید دستگاه از ویژگی‌های ترکیب‌شده پشتیبانی می‌کند.

سازگاری و الزامات

پخش هرگونه VibrationEffect نیاز به مجوز VIBRATE در مانیفست برنامه دارد.

همه دستگاه‌ها از تمام ویژگی‌های API ترکیب پشتیبانی نمی‌کنند و مهم است که از در دسترس بودن اولیه‌ها اطمینان حاصل شود.

بررسی پشتیبانی اولیه ارتعاش

پشتیبانی Per-primitives را می‌توان با استفاده از متد Vibrator.arePrimitivesSupported بازیابی کرد. به طور جایگزین، می‌توان مجموعه‌ای از primitiveها را با استفاده از متد Vibrator.areAllPrimitivesSupported با هم بررسی کرد - این معادل AND کردن پشتیبانی Per-primitives است.

استفاده از ترکیبات VibrationEffect

برای جزئیات بیشتر در مورد استفاده از ترکیب‌های VibrationEffect ، به ایجاد ترکیب‌های ارتعاشی مراجعه کنید.

ارتعاشات روشن-خاموش، تک ضربه‌ای و موجی شکل

قدیمی‌ترین نوع ویبره پشتیبانی‌شده در اندروید، الگوهای ساده‌ی روشن و خاموش کردن ویبراتور با مدت زمان قابل تنظیم است. این APIها معمولاً با اصول طراحی Haptics همسو نیستند، زیرا می‌توانند صداهای وزوز مانند ایجاد کنند؛ از آن‌ها اجتناب کنید، مگر به عنوان آخرین راه حل.

رایج‌ترین مورد استفاده از ویبره‌های روشن-خاموش، اعلان‌ها هستند که در آن‌ها، صرف نظر از نوع، مقداری ویبره مورد نظر است. ویبره‌های موجی همچنین به طور منحصر به فردی به یک الگو اجازه می‌دهند تا به طور نامحدود تکرار شود، همانطور که ممکن است برای یک آهنگ زنگ تصور کنید.

الگوی تک‌ضربه‌ای به ارتعاش یک‌باره به مدت N میلی‌ثانیه اشاره دارد.

دو نوع الگوی شکل موج وجود دارد:

  • فقط زمان‌بندی. این نوع شکل موج، توصیفی از مدت زمان‌های متناوبِ خاموش و مدت زمان‌های روشن است. زمان‌بندی‌ها با مدت زمان خاموش شروع می‌شوند. در نتیجه، الگوهای شکل موج اغلب با مقدار صفر شروع می‌شوند تا نشان دهند که بلافاصله ارتعاش شروع می‌شود.
  • زمان‌بندی‌ها و دامنه‌ها. این نوع شکل موج، به جای روشن-خاموش ضمنی شکل اول، دارای آرایه‌ای اضافی از دامنه‌ها برای مطابقت با هر شکل زمان‌بندی است. با این حال، مهم است که بررسی کنید که دستگاه از کنترل دامنه پشتیبانی می‌کند تا اطمینان حاصل شود که مقیاس‌بندی مورد نظر قابل دستیابی است.

سازگاری و الزامات

از آنجایی که ویبره‌های روشن-خاموش قدیمی‌ترین نوع ویبره هستند، تقریباً در تمام دستگاه‌های دارای ویبراتور ، همانطور که بعداً در این صفحه توضیح داده خواهد شد، پشتیبانی می‌شوند.

پخش هرگونه VibrationEffect یا تماس‌های vibrate قدیمی‌تر، نیاز به مجوز VIBRATE در مانیفست برنامه دارد.

هنگام استفاده از مقادیر دامنه مختلف در یک شکل موج، اکیداً توصیه می‌کنیم که دستگاه از کنترل دامنه پشتیبانی کند.

پشتیبانی از کنترل دامنه را بررسی کنید

مقادیر دامنه غیر صفر در دستگاه‌هایی که کنترل دامنه ندارند، تا ۱۰۰٪ گرد می‌شوند، بنابراین بررسی وجود پشتیبانی با استفاده از Vibrator.hasAmplitudeControl مهم است. برای جزئیات بیشتر به کنترل دامنه مراجعه کنید.

شما باید با دقت بررسی کنید که آیا افکت شما بدون کنترل دامنه، کیفیت کافی را دارد یا خیر. بازگشت به یک ارتعاش روشن-خاموش که به صراحت طراحی شده باشد، ممکن است بهتر باشد.

استفاده از ویبره‌های روشن-خاموش

در سطوح جدیدتر SDK، تمام حالت‌های ارتعاش در یک کلاس VibrationEffect واحد و رسا تجمیع شدند، که در آن این ارتعاشات ساده با استفاده از VibrationEffect.createOneshot یا VibrationEffect.createWaveform ایجاد می‌شوند.

APIهای اعلان

هنگام سفارشی‌سازی اعلان‌های برنامه خود، می‌توانید از یکی از APIهای زیر برای مرتبط کردن یک الگو با هر کانال اعلان استفاده کنید:

همانطور که قبلاً توضیح داده شد، همه این اشکال از یک الگوی موجی پایه روشن-خاموش پیروی می‌کنند که در آن اولین ورودی، تأخیر قبل از روشن کردن ویبراتور است.

مفاهیم کلی

چندین مفهوم در سطوح API که در بالا به تفصیل توضیح داده شد، اعمال می‌شود.

آیا دستگاه ویبراتور دارد؟

شما می‌توانید یک کلاس Vibrator غیر تهی را از context.getSystemService(Vibrator.class) دریافت کنید. اگر دستگاه ویبراتور نداشته باشد، فراخوانی‌های APIهای مربوط به ویبراتور هیچ تاثیری ندارند، بنابراین برنامه‌ها نیازی به محدود کردن تمام قابلیت‌های لمسی خود بر اساس یک شرط ندارند. با این حال، در صورت نیاز، یک برنامه می‌تواند hasVibrator() را فراخوانی کند تا مشخص کند که آیا این یک ویبراتور واقعی ( true ) است یا یک ویبراتور ناقص ( false ).

آیا کاربر لمس لمسی را غیرفعال کرده است؟

برخی از پیاده‌سازی‌های سفارشی ممکن است نیاز به بررسی دستی داشته باشند که آیا کاربر تنظیمات بازخورد لمسی اندروید را به طور کامل غیرفعال کرده است یا خیر، که در این صورت باید اثرات بازخورد لمسی سرکوب شوند. این تنظیم را می‌توان با استفاده از کلید HAPTIC_FEEDBACK_ENABLED جستجو کرد، که در آن مقدار صفر به معنای غیرفعال بودن است.

ویژگی‌های ارتعاش

ویژگی‌های لرزش (در حال حاضر به شکل AudioAttributes ) می‌توانند برای کمک به اطلاع‌رسانی به سیستم در مورد هدف لرزش ارائه شوند. این امر هنگام شروع لرزش زمانی که برنامه شما در پس‌زمینه است، ضروری است، زیرا فقط لمس‌های توجه برای استفاده در پس‌زمینه پشتیبانی می‌شوند.

نحوه ایجاد AudioAttributes در مستندات کلاس آن توضیح داده شده است و باید آن را به عنوان لرزش در نظر گرفت نه صدا .

به عنوان راهنما، در بیشتر موارد، نوع محتوا CONTENT_TYPE_SONIFICATION است و استفاده از آن می‌تواند مقادیری مانند USAGE_ASSISTANCE_SONIFICATION برای بازخورد لمسی در پیش‌زمینه یا USAGE_ALARM برای هشدار در پس‌زمینه باشد. پرچم‌های صوتی هیچ تاثیری بر لرزش‌ها ندارند.

کنترل دامنه

اگر یک ویبراتور قابلیت کنترل دامنه داشته باشد، می‌تواند ارتعاشاتی با شدت‌های مختلف ایجاد کند. این یک قابلیت مهم برای تولید حس لامسه غنی است و همچنین به طور بالقوه امکان کنترل شدت‌های لامسه پیش‌فرض را برای کاربر فراهم می‌کند.

پشتیبانی از کنترل دامنه را می‌توان با فراخوانی Vibrator.hasAmplitudeControl بررسی کرد. اگر ویبراتوری پشتیبانی از دامنه نداشته باشد، تمام مقادیر دامنه بر اساس صفر/غیرصفر بودنشان به خاموش/روشن نگاشت می‌شوند . در نتیجه، برنامه‌هایی که از فناوری‌های لمسی غنی با دامنه‌های متغیر استفاده می‌کنند، در صورت عدم کنترل دامنه دستگاه، باید غیرفعال کردن آنها را در نظر بگیرند.

پشتیبانی از جلوه‌های پوششی

ویبراتورهایی که دارای جلوه‌های پوششی هستند، از ایجاد ارتعاشات پویاتر و ظریف‌تر پشتیبانی کرده و امکان ایجاد آنها را فراهم می‌کنند و کنترل دقیق‌تری بر شدت و وضوح برای تجربیات لمسی غنی‌تر ارائه می‌دهند. برای تعیین اینکه آیا دستگاه شما از این ویژگی پشتیبانی می‌کند یا خیر، Vibration.areEnvelopeEffectsSupported استفاده کنید. در غیر این صورت، ارتعاشات مبتنی بر پوشش نادیده گرفته می‌شوند.