تمام پیشرفتهای چارچوب اندرویدی که حول محور لمسی ساخته شدهاند، توسط مجموعهای از اصول UX هدایت میشوند که با سرعت یکسانی در حال تکامل هستند. اصول فعلی شامل جایگزینی ارتعاش وزوز با لمسی شفاف و کاوش در لمسی غنی است.
شکل 1. اصول فعلی
جدول زیر تمام API های لمسی موجود را فهرست می کند.
API | مواد و روش ها | سال اضافه شد |
---|---|---|
android.view.HapticFeedbackConstants |
| قبل از 2016 |
| 2017 (اندروید 8) | |
| 2020 (اندروید 11) | |
android.View |
| قبل از 2016 |
android.os.Vibrator |
| قبل از 2016 |
| 2017 (اندروید 8) | |
| 2020 (اندروید 11) | |
android.os.VibrationEffect |
| 2017 (اندروید 8) |
| 2019 (اندروید 10) | |
android.os.VibrationEffect.Composition |
| 2020 (اندروید 11) |
android.media.AudioAttributes.Builder |
| 2019 (اندروید 10) |
ارتعاشات مبتنی بر زنگ ERM با کیفیت پایین اما کم مصرف که قدمت آن به پیجرها و تلفن های همراه برمی گردد، به عنوان جایگزینی برای زنگ شنیداری در حالت بی صدا استفاده شده است. قطعات سخت افزاری قدیمی که صداهای شنیدنی بلند و ناخوشایند تولید می کنند، می توانند با ارائه تصاویری با کیفیت پایین (مثلاً یک تلفن ارزان و خراب) به UX لمسی آسیب بزنند.
لمسی شفاف از احساس تغییرات حالت گسسته پشتیبانی می کند (به عنوان مثال، تغییرات باینری در طول فرآیند روشن/خاموش برق). با توجه به ماهیت affordance گسسته ، لمس شفاف به عنوان یک موجودیت واحد تولید می شود (به عنوان مثال، یک اثر لمسی در هر یک رویداد ورودی).
هدف آندروید ارائه لمسی شفاف با احساسات قوی و در عین حال تیز است نه احساساتی که وزوز یا مات هستند.
ثابت های لمسی از پیش تعریف شده که برای پشتیبانی از هاپتیک های شفاف ایجاد می شوند شامل موارد زیر است.
-
CLOCK_TICK
-
CONFIRM
-
CONTEXT_CLICK
-
GESTURE_END
-
GESTURE_START
-
KEYBOARD_PRESS
-
KEYBOARD_RELEASE
-
KEYBOARD_TAP
-
LONG_PRESS
-
REJECT
-
TEXT_HANDLE_MOVE
-
VIRTUAL_KEY
-
VIRTUAL_KEY_RELEASE
در VibrationEffect
:
-
EFFECT_CLICK
-
EFFECT_DOUBLE_CLICK
-
EFFECT_HEAVY_CLICK
-
EFFECT_TICK
ایجاد دانش مشترک بین سازندگان دستگاه و توسعه دهندگان کلید افزایش کیفیت کلی هاپتیک در اکوسیستم اندروید است. از چک لیست اولیه ، ارزیابی سخت افزار و CDD استفاده کنید. برای کسب اطلاعات بیشتر در مورد پیاده سازی لمسی.
شکل 3. فشار دادن و رها کردن.
لمسی غنی یک دسته لمسی رو به رشد است که فراتر از اثرات تک تکانه مبتنی بر تکانه است. هدف آندروید پشتیبانی از هاپتیک های غنی با قابلیت ترکیب و تنظیم بالا با سطح دقیق دانه بندی است. موارد استفاده زیر در Android 11 یا پایینتر پشتیبانی میشوند.
شکل 4. هاپتیک غنی با بافت کشویی
شکل 5. کشیدن و کشیدن
اگر یک افکت لمسی در حالی که انگشت روی یک سطح لمسی می لغزد تکرار شود (به عنوان مثال، کشیدن، کشیدن انگشت، کاوش سطح با بافت لمسی فانتوم)، جلوههای لمسی تکراری ترجیحا واضح و ظریف هستند.
اگر اثر فردی به جای واضح باشد، فواصل بین تکرارها احتمالاً از بین می رود. نتیجه یک وزوز طولانی است، نه چندین سیگنال گسسته.
اگر دامنه به اندازه کافی ظریف نباشد، انرژی لمسی درک شده از طریق تکرار ایجاد می شود و در پایان تکرار، هاپتیک بسیار قوی ایجاد می شود.
از CLOCK_TICK
و TEXT_HANDLE_MOVE
در HapticFeedbackConstants
استفاده کنید. این ثابت ها ویژگی های تکرار و دامنه را از پیش تعریف می کنند.
برای ایجاد جلوه خودتان، با رشتهبندی دنبالههای PRIMITIVE_CLICK
و PRIMITIVE_TICK
در VibrationEffect.Composition
یک طرح بسازید. شما می توانید ویژگی های مقیاس تکرار و دامنه را با استفاده از addPrimitive(int primitiveID, float scale, int delay)
تنظیم کنید. پشتیبانی متکی به قابلیت CAP_COMPOSE_EFFECTS
رابط ویبراتور HAL است.
ارتعاش طولانی یک ارتعاش دامنه صاف است که از 0 به دامنه هدف تغییر می کند. ارتعاش طولانی می تواند لمسی توجه قابل درک را ایجاد کند. با این حال، یک لرزش ناگهانی طولانی می تواند کاربران را در یک محیط آرام مبهوت کند و اغلب صداهای وزوز قابل شنیدن تولید می کند. برای ایجاد ارتعاش طولانی دلپذیرتر، جلوه آسان را در ابتدای ارتعاش طولانی اعمال کنید. این یک انتقال دامنه صاف ایجاد می کند که به سمت دامنه هدف ایجاد می شود.
قابلیت های سخت افزاری کنترل دامنه را با
android.os.Vibrator.hasAmplitudeControl()
بررسی کنید.- نتیجه باید
true
باشد تا اثر آسانی با دامنه متفاوت ایجاد شود.
- نتیجه باید
از
VibrationEffect
استفاده کنید.createWaveform(timings[], amplitudes[], int repeat)
.همانطور که در شکل 6 نشان داده شده است، سری
timings[]
وamplitudes[]
برای ایجاد منحنی سهولت تنظیم کنید.
شکل 6. منحنی سهولت ارتعاش طولانی
لمسی همراه با صدا ، الگوهای لمسی هستند که با ریتم صدا همراه شده اند تا توجه کاربر را به خود جلب کنند.
برای پیاده سازی هاپتیک های جفت شده صوتی، لمسی شفاف را با ارتعاشات طولانی ترکیب کنید. احساسات لمسی قوی اما کوتاه ناشی از لمس شفاف، الگوهای ریتمیک گسسته ای را ارائه می دهد. هنگامی که با سطوح بالایی از محرک هایی که ارتعاش طولانی فراهم می کند ترکیب شود، این کار برای جلب توجه کاربر بسیار عالی است.
مهم است که الگوهای ریتمیک حس را در نظر بگیرید. اگر هیچ حسی از ریتم وجود نداشته باشد، کاربر احساسات لمسی را به عنوان وزوزهای تصادفی درک می کند و تمایل دارد آنها را نادیده بگیرد.
شکل 7. نمونه لمسی زوج صوتی
اجرای لمسی همراه با صدا نیاز به درک اساسی از پخش محتوای کانال های صوتی و لمسی دارد. موارد زیر را در نظر داشته باشید.
از کلاس های
MediaPlayer
یاSoundPool
استفاده کنید.- دارایی ها در قالب OGG با یک کلید فراداده ویژه (
ANDROID_HAPTIC
و به دنبال آن تعدادی کانال لمسی) وجود داده های لمسی و پخش باMediaPlayer
وSoundPool
را نشان می دهد.
- دارایی ها در قالب OGG با یک کلید فراداده ویژه (
پشتیبانی از هاپتیک و پخش صدا را در
audio_policy_configuration.xml
نشان دهید.- از نمایه خروجی با کانال لمسی
AUDIO_CHANNEL_OUT_HAPTIC_A|B
استفاده کنید. - برای یک جریان خروجی با کانال های لمسی، به یاد داشته باشید که کانال های لمسی به عنوان کانال های اضافی در داده ها ارائه می شوند.
مثال
اگر ماسک کانال برای جریان خروجی به شکل زیر باشد:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
سپس هر نمونه باید به شکل زیر باشد:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- از نمایه خروجی با کانال لمسی
برای پخش کانال لمسی
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
را بهfalse
تغییر دهید.- به طور پیشفرض، کانالهای لمسی بیصدا هستند (
true
). - موارد استفاده شامل آهنگ های زنگ و صداهای رابط کاربری با لمس و بازخورد همزمان است.
- به طور پیشفرض، کانالهای لمسی بیصدا هستند (
ویبراتور HAL باید پشتیبانی کنترل خارجی را اجرا کند.
- برای پیاده سازی HIDL ،
setExternalControl(bool enabled) generates (Status status)
استفاده کنید. - برای پیاده سازی AIDL ، از
void setExternalControl(in boolean enabled)
استفاده کنید.
- برای پیاده سازی HIDL ،
شکل 8. پیاده سازی هاپتیک های جفت شده صوتی
HapticGenerator
یک جلوه صوتی است که در اندروید 12 معرفی شده است که می تواند داده های لمسی را از یک کانال صوتی تولید کند و آن را به صورت لمسی همراه با صدا در زمان واقعی پخش کند. این افکت بر روی AudioTrack
همانطور که در شکل 9 توضیح داده شده است اعمال می شود.
شکل 9. معماری ژنراتور هپتیک
برای اطمینان از اینکه الگوریتم مولد لمسی شما هاپتیک با کیفیت بالا تولید می کند، الگوریتم تولید را با تنظیم پارامترهایی که زنجیره فیلترهای اعمال شده برای شکل موج های صوتی را پیکربندی می کند، روی موتور ویبراتور دستگاه تنظیم کنید. این بخش این پارامترها را به تفصیل شرح می دهد و نحوه تنظیم آنها را با مشخصات سخت افزاری خود توضیح می دهد.
فرکانس تشدید برای فیلتر باند گذر
فرکانس تشدید ویبره فرکانسی است که در آن یک محرک لمسی حداکثر خروجی را دارد. این پارامتر یک ضد تشدید کننده را تنظیم می کند تا تا حدی تابع انتقال پاسخ را صاف کند تا پهنای باند وسیع تری به دست آورد. چارچوب Android به طور خودکار این مقدار را به خروجی روش Vibrator HAL پیوند می دهد
IVibrator.getResonantFrequency
.مقدار پیش فرض این پارامتر 150 هرتز است. این را می توان در کد اینجا اصلاح کرد.
قدرت عادی سازی برای پاکت آهسته
این پارامتر توان را در نرمال سازی جزئی (کنترل بهره خودکار) تعیین می کند. مقدار پیشفرض آن -0.8 است، به این معنی که 80٪ از تغییرات محدوده دینامیکی با این مرحله کنترل بهره حذف میشود. این را می توان در کد اینجا اصلاح کرد.
فاکتور Q برای فیلتر باند استاپ
فاکتور کیفیت ویبراتور (ضریب Q) توسط دو پارامتر تعیین می شود:
Zero Q، ضریب کیفیت صفرها در فیلتر باند استاپ که تا حدی رزونانس را لغو می کند.
Pole Q، فاکتور کیفیت قطب ها در فیلتر band-stop.
نسبت این دو مقدار، سرکوب رزونانس را محدود میکند تا فرکانسهای پایینتر را تقویت کند و پاسخ الگوریتم را گسترش دهد. به عنوان مثال، مقادیر پیشفرض 8 برای صفر Q و 4 برای قطب Q نسبت 2 را ایجاد میکنند که سرکوب تشدید را با ضریب 2 (6 دسیبل) محدود میکند. چارچوب Android هر دو مقدار را به خروجی روش Vibrator HAL پیوند می دهد
IVibrator.getQFactor
.اگر مقادیر پیشفرض باعث کاهش قدرت موتور در دستگاه شما نمیشود، توصیه میکنیم هر دو مقدار را همزمان تغییر دهید و هر دو را افزایش یا کاهش دهید. نسبت صفر Q به قطب Q باید بیشتر از 1 باشد. این را می توان در کد اینجا اصلاح کرد.
فرکانس گوشه برای اعوجاج
فرکانس گوشه توسط یک فیلتر پایین گذر اعمال می شود که لرزش سطح پایین را سرکوب می کند و با استفاده از اعوجاج مکعبی سطوح بالاتر را افزایش می دهد. به طور پیش فرض 300 هرتز است. این را می توان در کد اینجا اصلاح کرد.
بهره ورودی و آستانه مکعب برای اعوجاج
این پارامترها توسط یک فیلتر اعوجاج غیر خطی اعمال شده بر روی شکل موج ورودی استفاده می شود که دامنه سیگنال های فرکانس پایین تر را کاهش می دهد و سیگنال های فرکانس بالاتر را افزایش می دهد.
- مقدار پیش فرض برای ضریب افزایش ورودی 0.3 است.
- مقدار پیش فرض برای آستانه مکعب 0.1 است.
توصیه می کنیم هر دو مقدار را با هم تغییر دهید. آنها را می توان در کد اینجا پیدا کرد.
برای اطلاعات بیشتر در مورد عملکرد اعمال شده توسط این فیلتر، به پیاده سازی موجود در اینجا مراجعه کنید. برای کسب اطلاعات بیشتر در مورد چگونگی تأثیر این دو پارامتر بر خروجی، توصیه می کنیم پاسخ های فرکانسی فیلترها را رسم کنید و مشاهده کنید که چگونه پاسخ های فرکانس با مقادیر پارامترهای مختلف تغییر می کند.
بهره خروجی برای اعوجاج
این پارامتر دامنه ارتعاش نهایی را کنترل می کند. این یک بهره نهایی است که بعد از یک محدود کننده نرم اعمال می شود که دامنه ارتعاش را به کمتر از 1 محدود می کند. مقدار پیش فرض آن 1.5 است و می توان آن را در کد اینجا تغییر داد. اگر لرزش خیلی ظریف است، مقدار را افزایش دهید. اگر صدای تق تق سخت افزار محرک را می شنوید، مقدار را کاهش دهید.