رایجترین محرکهای ارتعاشی در دستگاههای اندروید ، محرکهای رزونانس خطی (LRA) هستند. LRAها حس کلیک روی یک دکمه را روی چیزی که در غیر این صورت یک سطح شیشهای بیحس است، شبیهسازی میکنند. یک سیگنال بازخورد کلیک واضح و شفاف معمولاً بین 10 تا 20 میلیثانیه طول میکشد. این حس باعث میشود تعاملات کاربر طبیعیتر به نظر برسد. برای صفحه کلیدهای مجازی، این بازخورد کلیک میتواند سرعت تایپ را افزایش داده و خطاها را کاهش دهد.
LRA ها چند فرکانس رزونانس رایج دارند:
- برخی از LRAها فرکانسهای رزونانسی در محدوده ۲۰۰ تا ۳۰۰ هرتز داشتند که با فرکانسی که پوست انسان بیشترین حساسیت را به ارتعاش دارد، مطابقت دارد. احساس ارتعاش در این محدوده فرکانسی معمولاً به صورت صاف، تیز و نافذ توصیف میشود.
- مدلهای دیگر LRA فرکانسهای رزونانس پایینتری، در حدود ۱۵۰ هرتز، دارند. این حس از نظر کیفی نرمتر و (از نظر بُعد) کاملتر است.
با توجه به ولتاژ ورودی یکسان در دو فرکانس مختلف، دامنههای خروجی ارتعاش میتوانند متفاوت باشند. هرچه فرکانس از فرکانس رزونانس LRA دورتر باشد، دامنه ارتعاش آن کمتر است.
اثرات لمسی یک دستگاه خاص از هر دو محرک ارتعاش و درایور آن استفاده میکند. درایورهای لمسی که شامل ویژگیهای overdrive و ترمز فعال هستند میتوانند زمان خیزش و زنگ زدن LRAها را کاهش دهند و منجر به ارتعاش پاسخگوتر و واضحتر شوند.
شتاب خروجی ویبراتور
نگاشت فرکانس به شتاب خروجی (FOAM) حداکثر شتاب خروجی قابل دستیابی (بر حسب پیک G) را در یک فرکانس ارتعاش معین (بر حسب هرتز) توصیف میکند. از اندروید ۱۶ (سطح API ۳۶)، این پلتفرم از طریق VibratorFrequencyProfile پشتیبانی داخلی برای این نگاشت ارائه میدهد. میتوانید از این کلاس، همراه با APIهای پوششی پایه و پیشرفته ، برای ایجاد جلوههای لمسی استفاده کنید.
بیشتر موتورهای LRA یک پیک واحد در FOAM خود دارند، معمولاً نزدیک فرکانس رزونانس آنها. شتاب معمولاً با انحراف فرکانس از این محدوده، به صورت نمایی کاهش مییابد. منحنی ممکن است متقارن نباشد و ممکن است در اطراف فرکانس رزونانس یک فلات ایجاد کند تا از موتور در برابر آسیب محافظت کند.
شکل روبرو نمونهای از فوم (FOAM) برای یک موتور LRA را نشان میدهد.
آستانه تشخیص ادراک انسان
آستانه تشخیص درک انسان به حداقل شتاب ارتعاشی اشاره دارد که یک فرد میتواند به طور قابل اعتمادی آن را تشخیص دهد. این سطح بر اساس فرکانس ارتعاش متفاوت است.
نمودار مجاور، آستانه تشخیص ادراک لمسی انسان را بر حسب شتاب، به عنوان تابعی از فرکانس زمانی نشان میدهد. دادههای آستانه از آستانه جابجایی در شکل 1 مقاله بولانوفسکی جونیور و همکارانش در سال 1988 با عنوان "چهار کانال واسطه جنبههای مکانیکی لمس هستند" تبدیل شدهاند.
اندروید به طور خودکار این آستانه را در BasicEnvelopeBuilder مدیریت میکند، که تأیید میکند همه جلوهها از محدوده فرکانسی استفاده میکنند که دامنههای ارتعاشی تولید میکند که حداقل 10 دسیبل از آستانه تشخیص درک انسان بیشتر است.
یک آموزش آنلاین، تبدیل بین دامنه شتاب و دامنه جابجایی را بیشتر توضیح میدهد.
سطوح شتاب ارتعاش
درک انسان از شدت ارتعاش، که یک معیار ادراکی است، به صورت خطی با دامنه ارتعاش، که یک پارامتر فیزیکی است، رشد نمیکند. شدت ادراک شده با سطح احساس (SL) مشخص میشود که به صورت مقدار دسیبل بالاتر از آستانه تشخیص در همان فرکانس تعریف میشود.
دامنه شتاب ارتعاش مربوطه (بر حسب پیک G) را میتوان به صورت زیر محاسبه کرد:
... که در آن دامنه dB مجموع SL و آستانه تشخیص - مقداری در امتداد محور عمودی در نمودار مجاور - در یک فرکانس خاص است.
نمودار مجاور، سطوح شتاب ارتعاش را در 10، 20، 30، 40 و 50 دسیبل SL، به همراه آستانه تشخیص ادراک لمسی انسان (0 دسیبل SL)، به عنوان تابعی از فرکانس زمانی نشان میدهد. دادهها از شکل 8 در مقاله Verrillo, RT و همکارانش در سال 1969 با عنوان "میزان احساس محرکهای ارتعاشی لمسی" تخمین زده شدهاند.
اندروید به طور خودکار این تبدیل را در BasicEnvelopeBuilder انجام میدهد، که مقادیر را به عنوان شدتهای نرمالشده در فضای سطح احساس (dB SL) میگیرد و آنها را به شتاب خروجی تبدیل میکند. از سوی دیگر، WaveformEnvelopeBuilder این تبدیل را اعمال نمیکند و در عوض مقادیر را به عنوان دامنههای شتاب خروجی نرمالشده در فضای شتاب (Gs) میگیرد. API پوشش فرض میکند که وقتی یک طراح یا توسعهدهنده در مورد تغییرات قدرت ارتعاش فکر میکند، انتظار دارد شدت درک شده از یک پوشش خطی تکهای پیروی کند.
هموارسازی پیشفرض شکل موج در دستگاهها
برای مثال، نحوه رفتار یک الگوی شکل موج سفارشی را در یک دستگاه عمومی در نظر بگیرید:
کاتلین
val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
جاوا
long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
نمودارهای زیر شکل موج ورودی و شتاب خروجی مربوط به قطعه کدهای قبلی را نشان میدهند. توجه داشته باشید که هر زمان که تغییر پلهای در دامنه الگو رخ دهد - یعنی در 0 میلیثانیه، 150 میلیثانیه، 200 میلیثانیه، 250 میلیثانیه و 700 میلیثانیه - شتاب به تدریج و نه به طور ناگهانی افزایش مییابد. همچنین در هر تغییر پلهای دامنه، یک جهش بیش از حد وجود دارد و هنگامی که دامنه ورودی ناگهان به 0 کاهش مییابد، زنگ قابل مشاهدهای وجود دارد که حداقل 50 میلیثانیه طول میکشد.
الگوی لمسی بهبود یافته
برای جلوگیری از جهش بیش از حد و کاهش زمان زنگ زدن، دامنهها را به تدریج تغییر دهید. شکل زیر شکل موج و نمودارهای شتاب نسخه اصلاح شده را نشان میدهد:
کاتلین
val timings: LongArray = longArrayOf(
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Do not repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
جاوا
long[] timings = new long[] {
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
};
int[] amplitudes = new int[] {
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
};
int repeatIndex = -1; // Do not repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
ایجاد جلوههای لمسی پیچیدهتر
سایر عناصر در یک پاسخ کلیک رضایتبخش پیچیدهتر هستند و نیاز به دانشی در مورد LRA مورد استفاده در دستگاه دارند. برای بهترین نتیجه، از شکل موجهای از پیش ساخته شده دستگاه و ثابتهای ارائه شده توسط پلتفرم استفاده کنید که به شما امکان انجام موارد زیر را میدهند:
- جلوهها و اشکال اولیه واضح را اجرا کنید.
- آنها را به هم متصل کنید تا جلوههای لمسی جدیدی بسازید.
این ثابتها و مقادیر اولیهی لمسی از پیش تعریفشده میتوانند سرعت کار شما را تا حد زیادی افزایش دهند و در عین حال جلوههای لمسی با کیفیتی ایجاد کنند.