این بخش مقدمهای بر میاناهای برنامهسازی کاربردی مختلف لمسی در Android ارائه میدهد. همچنین زمان و نحوه بررسی پشتیبانی دستگاه لازم برای اطمینان از پخش شدن جلوههای لمسی موردنظرتان را پوشش میدهد.
روشهای مختلفی برای ایجاد جلوههای لمسی وجود دارد و هنگام انتخاب بین آنها، مهم است که اصول طراحی لمسی Android را درنظر بگیرید. جدول زیر این مشخصههای سطح بالای هریک از رویکردها را خلاصه میکند:
- دسترسی بهویژه هنگام برنامهریزی رفتار بازگشتی اهمیت دارد، و باید با بررسی پشتیبانی دستگاه تکی ترکیب شود.
- لمسهای واضح احساسات واضح و شفافی هستند که برای کاربران کمتر آزاردهنده هستند.
- لمسهای غنی بیانگرایی بیشتری دارند و اغلب به سختافزاری با ویژگیهای بیشتر نیاز دارند.
| سطح میانای برنامهسازی کاربردی | دردسترس بودن | پاک کردن فناوری لمسی | فناوری لمسی غنی |
|---|---|---|---|
| HapticFeedbackConstants | Android 1.5+ (بهازای هر ثابت) |
||
| Predefined VibrationEffect | Android 10 و نسخههای بالاتر | ||
VibrationEffect قطعه موسیقی (ترجیحی) |
Android 16+ (26Q4) | ||
ترکیب اولیه VibrationEffect |
Android 11+ (بهازای ثابت) | ||
| لرزشهای روشن/خاموش، تکضرب، و شکلموج | Android 1 |
علاوهبراین، میاناهای برنامهسازی کاربردی اعلان، که در این صفحه توضیح داده شده است، به شما امکان میدهد جلوههای لمسی را که برای اعلانهای ورودی پخش میشود سفارشیسازی کنید.
همچنین در این صفحه، مفاهیم تکمیلی که سطوح API را دربرمیگیرند شرح داده شده است:
- آیا دستگاه لرزاننده دارد؟
- کنترل دامنه امکان ایجاد جلوههای لمسی نرمتر و غنیتر را فراهم میکند، اما همه دستگاهها از آن پشتیبانی نمیکنند.
VibrationAttributes()به شما کمک میکند لرزشها را براساس استفاده طبقهبندی کنید و از این طریق مطمئن شوید تنظیمات کاربر مناسب برای جلوگیری از غافلگیری کاربر اعمال میشود.
HapticFeedbackConstants
کلاس HapticFeedbackConstants ثابتهای کنشمحوری را ارائه میدهد تا به برنامهها اجازه دهد بازخورد لمسی را اضافه کنند که در تجربه دستگاه یکسان باشد،
بهجای اینکه هر برنامه برای کنشهای معمول جلوههای متفاوتی داشته باشد.
سازگاری و الزامات
استفاده از روش View.performHapticFeedback با این ثابتها
به هیچ اجازه ویژهای برای برنامه نیاز ندارد. این روش تابع
دارایی View.hapticFeedbackEnabled است که اگر روی false تنظیم شود،
همه فراخوانیهای بازخورد لمسی در نما، ازجمله فراخوانیهای پیشفرض، را غیرفعال میکند.تنظیم اصلی
مرتبط با آن دارایی View.hapticFeedbackEnabled است که اگر روی
false تنظیم شود، همه فراخوانیهای بازخورد لمسی در نما، ازجمله فراخوانیهای پیشفرض، را غیرفعال میکند. این روش همچنین تنظیمات سیستم کاربر را برای فعال کردن بازخورد لمسی رعایت میکند.
تنها ملاحظه سازگاری، سطح کیت توسعه نرمافزار ثابت خاص برای کنش است.
هنگام استفاده از
HapticFeedbackConstants نیازی به ارائه رفتار بازگشتی نیست.
استفاده از HapticsFeedbackConstants
برای جزئیات استفاده از HapticFeedbackConstants، به افزودن بازخورد لمسی به
رویدادها مراجعه کنید.
ازپیش تعریفشده VibrationEffect
کلاس VibrationEffect
چندین ثابت ازپیش تعریفشده مانند CLICK، TICK، و
DOUBLE_CLICK را ارائه میدهد. این جلوهها ممکن است برای دستگاه بهینهسازی شده باشند.
سازگاری و الزامات
برای پخش هر VibrationEffect، اجازه VIBRATE در مانیفست برنامه لازم است.
هنگام استفاده از VibrationEffect ازپیش تعریفشده، نیازی به ارائه عملکرد جایگزین نیست، زیرا ثابتهایی که پیادهسازی بهینهسازیشده برای دستگاه ندارند به جایگزین پلاتفرم استاندارد برمیگردند.
از Vibrator.areEffectsSupported و Vibrator.areAllEffectsSupported
واسطهای برنامهسازی کاربردی برای تعیین اینکه آیا پیادهسازی بهینهسازیشده برای دستگاه وجود دارد یا نه استفاده میشود.
جلوههای پیشتعریفشده همچنان میتوانند بدون پیادهسازی بهینهسازیشده استفاده شوند و
از جایگزین استاندارد پلاتفرم استفاده میکنند. درنتیجه، این
areEffectsSupported میاناهای برنامهسازی کاربردی فقط درصورتی لازم است که برنامهای بخواهد درنظر بگیرد که آیا جلوه برای دستگاه بهینهسازی شده است یا نه.
روشهای بررسی اثر میتوانند یکی از سه مقدار زیر را برگردانند:
VIBRATION_EFFECT_SUPPORT_YESنشان میدهد که دستگاه از این جلوه پشتیبانی بهینه دارد.VIBRATION_EFFECT_SUPPORT_NOنشان میدهد که دستگاه از پشتیبانی بهینهسازیشده برخوردار نیست، اما همچنان از پشتیبان پلاتفرم استفاده میکند.VIBRATION_EFFECT_SUPPORT_UNKNOWNنشان میدهد که سیستم نمیداند پیادهسازی بهینه شده است یا نه.
ازآنجاییکه مقدار UNKNOWN نشان میدهد API بررسی دردسترس نیست، معمولاً برای همه جلوهها یا هیچکدام از آنها برگردانده میشود. این دستگاهها بهصورت پویا به حالت قبلی برمیگردند.
استفاده از VibrationEffect ازپیشتعریفشده
برای جزئیات استفاده از VibrationEffect ازپیش تعریفشده، به
استفاده از VibrationEffect ازپیش تعریفشده برای تولید بازخورد لمسی مراجعه کنید.
Envelope VibrationEffect
لرزشهای مبتنی بر پوشش امکان کنترل دقیق دامنه و فرکانس لرزش را در طول زمان با تعریف توالی نقاط کنترل فراهم میکنند. این کار به توسعهدهندگان امکان میدهد
تجربههای بازخورد لمسی غنیتر و دقیقتری بسازند. این لرزشها را میتوان بااستفاده از کلاسهای BasicEnvelopeBuilder و WaveformEnvelopeBuilder ایجاد کرد.
سازگاری و الزامات
برای پخش جلوههای لرزشی، برنامه شما باید اجازه VIBRATE را در
مانیفست برنامه اعلام کند.
برای بررسی پشتیبانی از جلوههای پاکت، با
Vibrator.areEnvelopeEffectsSupported() تماس بگیرید.
سازنده پاکت پایه
برای ایجاد یک تجربه لمسی روان و یکپارچه، جلوههای پوشش باید با شدت \( 0.0 \)شروع و پایان یابند. این API با ثابت کردن شدت شروع در صفر این کار را انجام میدهد و اگر شدت پایان صفر نباشد، استثنایی ایجاد میکند. این محدودیت از ایجاد جلوههای پویا نامطلوب در لرزشها بهدلیل ناپیوستگی در دامنه که میتواند بر ادراک لمسی کاربر تأثیر منفی بگذارد جلوگیری میکند.
برای ارائه جلوه پاکت یکنواخت در دستگاههای مختلف، چارچوب ملزم میکند که دستگاههای پشتیبان این ویژگی بتوانند حداقل مدت ۲۰ میلیثانیه بین نقاط کنترل و حداقل ۱۶ نقطه برای جلوههای پاکت را مدیریت کنند.
سازنده پاکت شکل موج
چارچوب مقادیر بسامد و دامنه درخواستشده ارائهشده توسط توسعهدهنده را تغییر نمیدهد. بااینحال، «میانای برنامه کاربردی» همچنین دامنه شروع را روی صفر تنظیم میکند تا انتقالهای همواری ایجاد کند.
برای کمک به شما در بهینهسازی جلوههای پوشش شکل موج برنامه و ارائه سازگاری در دستگاههای مختلف، Android میاناهای برنامهسازی کاربردی برای پُرسمان قابلیتهای مهم دستگاه ارائه میدهد. این روشها اطلاعاتی درباره محدودیتهای دستگاه ارائه میدهند، مثل حداکثر و حداقل مدت انتقال بین نقاط کنترل و حداکثر تعداد نقاط کنترل پشتیبانیشده برای یک جلوه:
getMaxSize()- حداکثر تعداد نقاط کنترل پشتیبانیشده برای یک افکت پاکت را بازیابی میکند.
getMinControlPointDurationMillis()- حداقل مدت پشتیبانیشده بین دو نقطه کنترل در یک جلوه پاکت را برحسب میلیثانیه بازیابی میکند.
getMaxControlPointDurationMillis()- حداکثر مدت پشتیبانیشده بین دو نقطه کنترل در یک جلوه پاکت را به میلیثانیه بازیابی میکند.
getMaxDurationMillis()- حداکثر مدت پشتیبانیشده برای جلوه پاکت را به میلیثانیه بازیابی میکند.
اگر جلوهای از محدودیتهای دستگاه فراتر رود—مثلاً اجازه دادن به نقاط کنترل بیشازحد یا مدت زمانی که از حداکثر مجاز بیشتر باشد—چارچوب بهطور خودکار جلوه را تنظیم میکند تا در محدوده مجاز قرار گیرد. این فرایند اصلاح تلاش میکند تا حد امکان هدف و احساس اصلی طراحی را حفظ کند.
استفاده از «جلوههای لرزش پاکتزن»
برای جزئیات مربوط به ایجاد جلوههای شکل موج پاکت، به ایجاد شکل موج لرزش با پاکتها مراجعه کنید.
قطعه موسیقی VibrationEffect
از Android 16 (26Q4) شروع میشود، VibrationEffect.Builder
میانای برنامهسازی کاربردی ترجیحی برای ساختن جلوههای لمسی غنی و رسا با توالی دادن عناصر لمسی متعدد درطول یک جدول زمانی طراحیشده است. با ارائه زمانبندی لنگرگذاریشده در جدول زمانی، کپسولهسازی اتمی، پشتیبانی از رویدادهای ترکیبی (ترکیب پیشتنظیمها و پاکتها)، و بازگشت خودکار داخلی،
VibrationEffect.Composition را
جایگزین میکند.
واحدهای سازنده
سازنده به شما امکان میدهد عناصر لمسی زیر را بهترتیب قرار دهید:
VibrationEffect.Preset: حسهای لمسی ازپیش تعریفشده که نشاندهنده ضربههای کوتاه رایج، مثلPRESET_CLICK،PRESET_TICK، وPRESET_LOW_TICKاست. پیشتنظیمها جایگزین عناصر اولیه کوتاه ازVibrationEffect.CompositionAPI میشوند. برای جلوههای طولانیتر، پیوسته، یا تدریجی (که قبلاً بااستفاده از افزایش، کاهش، و دیگر عناصر اولیه مدیریت میشد)، بهجای آن از پوششها (PWLE) استفاده کنید. پیشتنظیمها را میتوان بااستفاده ازPreset.create(presetId, scale)از0.0fتا1.0fمقیاسبندی کرد.VibrationEffect.Envelope: پوششهای خطی تکهای (PWLE) ایجادشده بااستفاده ازBasicEnvelopeBuilder(با شدت و وضوح) یاWaveformEnvelopeBuilder(با بسامد و دامنه). پاکتها بااستفاده ازEnvelope.create(builder)ساخته میشوند.VibrationEffect.Event: رویدادهای «خط زمان» ازVibrationEffectموجود بااستفاده ازgetEvents()بازیابی شد. اینها را میتوان بااستفاده ازaddEvents(startTimeShiftMillis, events)با یک انحراف خط زمان اضافه کرد.
زمانبندی و اعتبارسنجی خط زمان
هر عنصر با startTimeMillis که نشاندهنده
انحراف زمان (به میلیثانیه) از ابتدای قطعه موسیقی است به سازنده اضافه میشود:
- اعتبارسنجی زمان ساخت: عناصر باید به ترتیب زمانی شروعشان اضافه شوند. سازنده در زمان ساخت با بررسی حداقل مدت (مثلاً ۱ میلیثانیه برای پیشتنظیمها یا مدتهای شناختهشده برای پوششها) بهترین تلاش را برای اعتبارسنجی انجام میدهد. اگر همپوشانی در زمان ساخت تشخیص داده شود،
IllegalArgumentExceptionپرتاب میشود. - تراز زمانبندی بازپخش: چارچوب درطول بازپخش، پشتیبانی از زمانبندی با بهترین تلاش را ارائه میدهد. اگر رویداد قبلی هنوز درحال اجرا باشد و زمان شروع رویداد زمانبندیشده بعدی فرا برسد، چارچوب بهطور خودکار رویداد بعدی را به اولین جایگاه دردسترس بعدی منتقل میکند. این کار از همپوشانی رویدادها در بازپخش فیزیکی جلوگیری میکند و درعینحال تضمین میکند که هیچ رویداد لمسیای ازدست نرود.
جلوههای تکرارشونده
بااستفاده از setRepeatingEffect(startTimeMillis, repeatingEffect, durationMillis) میتوان جلوه تکرارشونده به قطعه اضافه کرد. پساز پیکربندی یک جلوه تکرارشونده، هیچ عنصر اضافهای نمیتواند به سازنده اضافه شود.
پشتیبانی جایگزین
پشتیبانی خودکار از بازگشت به حالت قبلی در سطح چارچوب بهطور پیشفرض برای لرزش
ایجادشده توسط VibrationEffect.Builder فعال است:
- جایگزین پلاتفرم شفاف: اگر دستگاهی از
Presetدرخواستی یاEnvelopeپایه پشتیبانی نکند، چارچوب بهطور خودکار عنصر پشتیبانینشده را با لرزش پشتیبانیشده مناسب در زمان اجرا با بهترین تلاش جایگزین میکند. برنامه شما نیازی ندارد قبلاز پخش قطعات ساختهشده باVibrationEffect.Builder، قابلیتهای دستگاه (مثلisPresetSupported) را بهصورت دستی بررسی کند. - استثنا برای
WaveformEnvelopeBuilder: جلوههای پوششی ایجادشده توسطWaveformEnvelopeBuilder(که فرکانسهای فیزیکی مطلق را برحسب هرتز و دامنهها را برحسب Gs مشخص میکنند) از پشتیبانی خودکار بازگشتپذیری برخوردار نیستند. ازآنجاکه «دستگاههای کمک شنوایی برنامهپذیر پیشرفته» به منحنیهای بسامد سختافزاری خاصی (FOAM) متکی هستند، جایگزین کردن خودکار آنها باعث بهخطر افتادن هدف طراحی میشود. اگر دستگاه از جلوههای PWLE یا فرکانسهای درخواستشده پشتیبانی نکند، چنین لرزشهایی پخش نخواهند شد. برای سازگاری جهانی،BasicEnvelopeBuilderرا ترجیح دهید.
استفاده از VibrationEffect.Builder
برای نمونههای کد درباره ترکیب کردن جلوهها با VibrationEffect.Builder، به
ایجاد ترکیبهای لنگرشده خط زمان با
VibrationEffect.Builder مراجعه کنید.
ترکیب VibrationEffect عنصر اولیه
ترکیب اولیه VibrationEffect جلوه لرزشی است که بااستفاده از
میانای برنامهسازی کاربردی VibrationEffect.startComposition ایجاد شده است. این «میانای برنامهسازی کاربردی» به شما امکان میدهد
دنبالهای از عناصر اولیه ایجاد کنید.
سازگاری و الزامات
برای پخش هر VibrationEffect، اجازه VIBRATE در مانیفست برنامه لازم است.
بررسی پشتیبانی اولیه
بنابراین، هنگام استفاده از VibrationEffect.Composition API، باید پشتیبانی هر عنصر اولیه را بااستفاده از Vibrator.arePrimitivesSupported یا Vibrator.areAllPrimitivesSupported قبلاز پخش بررسی کنید.
پشتیبانی هر عنصر اولیه را میتوان بااستفاده از روش
Vibrator.arePrimitivesSupported بازیابی کرد. یا، مجموعهای از عناصر اولیه
را میتوان بااستفاده از روش Vibrator.areAllPrimitivesSupported
با هم بررسی کرد - این معادل AND کردن پشتیبانی برای هر عنصر اولیه است.
استفاده از VibrationEffect ترکیب اولیه
برای جزئیات مربوط به استفاده از ترکیبهای اولیه VibrationEffect، به
ایجاد ترکیبهای اولیه لرزش مراجعه کنید.
لرزشهای روشن/خاموش، تکضرب، و شکل موج
قدیمیترین شکل لرزش که در Android پشتیبانی میشود، الگوهای ساده لرزش روشن/خاموش با مدت زمان قابل پیکربندی است. این «میاناهای برنامهسازی کاربردی» معمولاً با اصول طراحی «لمسیسازی» همراستا نیستند زیرا میتوانند لمسیسازیهای وزوزدار تولید کنند؛ از آنها فقط بهعنوان آخرین راهکار استفاده کنید.
رایجترین مورد استفاده برای لرزشهای روشن/خاموش، اعلانها است که در آنها، بدون توجه به شرایط، لرزش مطلوب است. لرزشهای شکل موج همچنین بهطور منحصربهفردی به یک الگو اجازه میدهند تا بهطور نامحدود تکرار شود، همانطور که ممکن است برای آهنگ زنگ تصور کنید.
الگوی یکباره به یکبار لرزیدن بهمدت N میلیثانیه اشاره دارد.
دو نوع الگوی شکل موج وجود دارد:
- فقط زمانبندیها. این نوع شکل موج توصیفی از مدت زمانهای متناوب صرفشده در حالت خاموش و مدت زمانهای صرفشده در حالت روشن است. زمانبندیها با مدت زمان صرفشده در حالت خاموش شروع میشود. درنتیجه، الگوهای شکل موج اغلب با مقدار صفر شروع میشوند تا نشان دهند که لرزش باید بلافاصله شروع شود.
- زمانبندیها و دامنهها. این نوع شکل موج دارای آرایه اضافی از دامنه است که با هر رقم زمانبندی مطابقت دارد، بهجای روشن/خاموش ضمنی شکل اول. بااینحال، مهم است که بررسی کنید دستگاه از کنترل دامنه پشتیبانی میکند تا مطمئن شوید که مقیاسبندی موردنظر قابلدستیابی است.
سازگاری و الزامات
ازآنجاییکه لرزشهای روشن/خاموش قدیمیترین شکل لرزش هستند، این لرزشها در تقریباً همه دستگاههای دارای لرزاننده پشتیبانی میشوند، همانطور که در ادامه این صفحه توضیح داده شده است.
برای پخش هرگونه VibrationEffect یا تماسهای سبک قدیمیتر vibrate، اجازه
VIBRATE در مانیفست برنامه لازم است.
هنگام استفاده از مقادیر دامنه مختلف در شکل موج، اکیداً توصیه میکنیم که دستگاه از کنترل دامنه پشتیبانی کند.
بررسی پشتیبانی از کنترل دامنه
مقادیر دامنه غیرصفر در دستگاههای بدون کنترل دامنه به ۱۰۰٪ گرد میشوند، بنابراین مهم است که بااستفاده از Vibrator.hasAmplitudeControl بررسی کنید که آیا پشتیبانی وجود دارد یا خیر. برای جزئیات بیشتر، کنترل دامنه را ببینید.
باید با دقت درنظر بگیرید که آیا جلوه شما بدون کنترل دامنه کیفیت کافی دارد یا نه. استفاده از لرزش روشن/خاموش که بهطور صریح طراحی شده است ممکن است بهتر باشد.
استفاده از لرزشهای روشن/خاموش
در سطوح جدیدتر کیت توسعه نرمافزار، همه حالتهای لرزش در یک کلاس
بیانگر VibrationEffect ادغام شدهاند، که در آن این لرزشهای ساده بااستفاده از VibrationEffect.createOneShot یا VibrationEffect.createWaveform ایجاد میشوند.
میاناهای برنامهسازی کاربردی اعلان
هنگام سفارشیسازی اعلانهای برنامه، میتوانید از یکی از میاناهای برنامهسازی کاربردی زیر برای مرتبط کردن الگو با هر کانال اعلان استفاده کنید:
- AndroidX
- Android
همه این فرمها از یک الگوی موجی روشن/خاموش پایه استفاده میکنند، همانطور که قبلاً توضیح داده شد، جایی که اولین ورودی تأخیر قبلاز روشن کردن لرزاننده است.
مفاهیم کلی
چندین مفهوم در سطوح API که در بالا شرح داده شده است، اعمال میشود.
آیا دستگاه لرزاننده دارد؟
میتوانید کلاس Vibrator غیرتهی را از
context.getSystemService(Vibrator.class) دریافت کنید. اگر دستگاه لرزاننده نداشته باشد، تماس با میاناهای برنامهسازی کاربردی لرزش هیچ تأثیری ندارد، بنابراین برنامهها نیازی ندارند که همه لمسهای خود را براساس شرطی محدود کنند. بااینحال، درصورت نیاز، برنامه میتواند hasVibrator() را
فراخوانی کند تا
تعیین کند که آیا این لرزاننده واقعی است (true) یا یک لرزاننده ساختگی (false).
آیا کاربر بازخورد لمسی را غیرفعال کرده است؟
برخیاز پیادهسازیهای سفارشی ممکن است نیاز داشته باشد که بهصورت دستی بررسی کنید آیا کاربر تنظیم بازخورد لمسی Android را بهطور کامل غیرفعال کرده است یا نه، در این صورت جلوههای بازخورد لمسی باید سرکوب شوند. این تنظیم را میتوان بااستفاده از کلید HAPTIC_FEEDBACK_ENABLED پُرسمان کرد،
که در آن مقدار صفر به معنی غیرفعال است.
مشخصههای لرزش
مشخصههای لرزش (درحالحاضر بهصورت AudioAttributes) میتواند
ارائه شود تا سیستم را از هدف لرزش مطلع کند. این مجوز زمانی که برنامه شما در پسزمینه است و میخواهید لرزشی را شروع کنید لازم است، زیرا فقط لمسهای توجهی برای استفاده در پسزمینه پشتیبانی میشود.
ایجاد AudioAttributes در مستندات کلاس آن پوشش داده شده است، و
باید بهعنوان لرزش درنظر گرفته شود نه صدا.
بهعنوان راهنما، در اکثر موارد، نوع محتوا CONTENT_TYPE_SONIFICATION است،
و استفاده ممکن است مقادیری مثل USAGE_ASSISTANCE_SONIFICATION برای
بازخورد لمسی در پیشزمینه، یا USAGE_ALARM برای زنگ هشدار در
پسزمینه داشته باشد. پرچمهای صوتی هیچ تأثیری بر لرزشها ندارند.
کنترل دامنه
اگر لرزاننده کنترل دامنه داشته باشد، میتواند لرزشهایی با شدتهای مختلف ایجاد کند. این قابلیت برای تولید لمسهای غنی و همچنین امکان کنترل کاربر بر شدتهای لمس پیشفرض اهمیت دارد.
با تماس گرفتن با Vibrator.hasAmplitudeControl میتوانید پشتیبانی از کنترل دامنه را بررسی کنید. اگر لرزاننده از دامنه پشتیبانی نکند، همه مقادیر دامنه براساس صفر یا غیرصفر بودنشان به خاموش یا روشن نگاشت میشوند. درنتیجه، برنامههایی که از لمسهای غنی با دامنههای مختلف استفاده میکنند باید درنظر داشته باشند که اگر دستگاه کنترل دامنه ندارد، آنها را غیرفعال کنند.
پشتیبانی از جلوههای پاکتزن
لرزانندهها با پشتیبانی از جلوههای پوششی امکان ایجاد لرزشهای پویاتر و دقیقتر را فراهم میکنند و کنترل دقیقتری بر شدت و تیزی لرزش برای تجربههای لمسی غنیتر ارائه میدهند. از
Vibration.areEnvelopeEffectsSupported برای تعیین اینکه دستگاهتان
از این ویژگی پشتیبانی میکند یا نه استفاده کنید. اگر اینطور نباشد، لرزشهای مبتنی بر پاکت نادیده گرفته میشوند.