پایه تجربه کاربری برای چارچوب لمسی

همه بهبودهای چارچوب Android که حول لمسیات ساخته شده‌اند، از مجموعه‌ای از اصول تجربه کاربری که با نرخ یکسانی درحال تکامل هستند، نشئت می‌گیرند. اصول فعلی شامل جایگزینی لرزش وزوزدار با فناوری لمسی واضح و کاوش فناوری لمسی غنی است.

اصول تجربه کاربری

شکل ۱. اصول فعلی.

جدول زیر فهرست همه «میاناهای برنامه‌سازی کاربردی لمسی» دردسترس را نشان می‌دهد:

API روش‌ها و ثابت‌ها سال اضافه شد
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
قبل‌از ۲۰۱۶
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
‫۲۰۱۷ (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
‫۲۰۲۰ (Android 11)
android.View
  • performHapticFeedback()
قبل‌از ۲۰۱۶
android.os.Vibrator
  • vibrate()
  • hasVibrator()
قبل‌از ۲۰۱۶
  • hasAmplitudeControl()
‫۲۰۱۷ (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
‫۲۰۲۰ (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
‫۲۰۱۷ (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
۲۰۱۹ (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
‫۲۰۲۰ (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
۲۰۱۹ (Android 10)

لرزش وزوزکننده

از زمان پیجرها و تلفن‌های ساده، لرزش‌های مبتنی بر زنگ اخبار با جرم چرخان گریز از مرکز (ERM) که کیفیت پایین اما مصرف انرژی کمی دارند، به‌عنوان جایگزینی برای زنگ شنیداری در حالت ساکت استفاده شده‌اند. اجزای سخت‌افزاری قدیمی که صداهای بلند و ناخوشایند شنیداری تولید می‌کنند می‌توانند با ارائه بازخوردهای لمسی بی‌کیفیت (برای مثال، تلفن ارزان و خراب) به تجربه کاربری لمسی آسیب برسانند.

پاک کردن فناوری لمسی

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

هدف Android ارائه لمس‌های واضح با احساسات قوی و درعین‌حال دقیق است، نه احساسات مبهم یا نرم.

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

در HapticFeedbackConstants:

  • 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

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

فشار دادن و رها کردن

شکل ۲. فشار دادن و رها کردن.

فناوری لمسی غنی

لمس‌های پیشرفته یک دسته لمسی درحال رشد است که فراتر از جلوه‌های تک‌تکانه‌ای است. هدف Android پشتیبانی از لمس‌های غنی با ترکیب‌پذیری و تنظیم‌پذیری بالا با سطح دقیقی از جزئیات است. موارد استفاده زیر در Android 11 یا نسخه‌های پایین‌تر پشتیبانی می‌شوند.

فناوری لمسی غنی

شکل ۳. لمس‌های واقعی غنی با بافت لغزنده.

کشیدن و تند کشیدن

شکل ۴. کشیدن و تند کشیدن.

مورد استفاده ۱: بافت لغزنده

اگر جلوه لمسی درحین لغزاندن انگشت روی سطح لمسی تکرار شود (برای مثال، کشیدن، تند کشیدن، کاوش سطح با بافت لمسی فانتوم)، جلوه‌های لمسی تکرارشونده ترجیحاً واضح و ظریف هستند.

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

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

پیاده‌سازی بافت لمسی سطحی برای اشاره‌های تند کشیدن و کشیدن

از CLOCK_TICK و TEXT_HANDLE_MOVE در HapticFeedbackConstants استفاده کنید. این ثابت‌ها ویژگی‌های تکرار و دامنه را ازپیش تعریف می‌کنند.

جلوه خودتان را بسازید

برای ساختن جلوه خودتان، با به‌هم پیوستن توالی‌های PRIMITIVE_CLICK و PRIMITIVE_TICK در VibrationEffect.Composition طراحی کنید. می‌توانید مشخصه‌های تکرار و مقیاس دامنه را بااستفاده از addPrimitive(int primitiveID, float scale, int delay) تنظیم کنید. پشتیبانی به قابلیت CAP_COMPOSE_EFFECTS میانای HAL لرزاننده بستگی دارد.

مورد استفاده ۲: لرزش طولانی با جلوه شروع آرام

لرزش طولانی لرزشی با دامنه یکنواخت است که از ۰ به دامنه هدف تغییر می‌کند. لرزش طولانی می‌تواند لمس‌های جلب‌توجه‌کننده قابل‌درک ایجاد کند. اما لرزش طولانی ناگهانی می‌تواند کاربران را در محیطی آرام غافلگیر کند و اغلب صداهای وزوز قابل‌شنیدن تولید می‌کند. برای تولید لرزش طولانی‌تر و دلپذیرتر، اثر «آرام شروع» را در ابتدای لرزش طولانی اعمال کنید. این کار باعث تولید انتقال دامنه همواری می‌شود که به‌سمت دامنه هدف ساخته می‌شود.

اعمال کردن جلوه «آهسته شروع شدن»

  1. قابلیت‌های سخت‌افزاری کنترل دامنه را با android.os.Vibrator.hasAmplitudeControl() بررسی کنید.

    • نتیجه باید true باشد تا جلوه شروع آسان با دامنه متغیر تولید شود.
  2. از VibrationEffect.createWaveform(timings[], amplitudes[], int repeat) استفاده کنید.

  3. سری timings[] و amplitudes[] را برای تولید منحنی آرام شروع، همان‌طور که در شکل ۵ نشان داده شده است، تنظیم کنید.

لرزش طولانی

شکل ۵. منحنی لرزش طولانی با شروع آهسته.

مورد استفاده ۳: لمس‌های جفت‌شده با صدا

لمس‌های جفت‌شده با صدا الگوهای لمسی هستند که با ریتم صدا جفت می‌شوند تا توجه کاربر را جلب کنند.

فناوری لمسی جفت‌شده با صدا: مزایا

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

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

زوج صوتی

شکل ۶. نمونه فناوری لمسی جفت صوتی.

فناوری لمسی جفت‌شده با صدا: نکاتی برای پیاده‌سازی

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

  • از کلاس‌های MediaPlayer یا SoundPool استفاده کنید.

    • دارایی‌های با قالب OGG که کلید فراداده خاصی دارند (ANDROID_HAPTIC به‌دنبال تعدادی کانال لمسی) نشان‌دهنده وجود داده‌های لمسی و بازپخش با MediaPlayer و SoundPool هستند.
  • پشتیبانی از فناوری لمسی و بازپخش صدا را در 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).
    • موارد استفاده شامل آهنگ‌های زنگ و صداهای رابط کاربری با لمسی‌های هم‌زمان و بازخورد است.
  • ‫Vibrator HAL باید از کنترل خارجی پشتیبانی کند.

فناوری لمسی جفت‌شده صوتی

شکل ۷. درحال پیاده‌سازی بازخورد لمسی جفت‌شده با صدا.

فناوری لمسی جفت‌شده با صدا: HapticGenerator

HapticGenerator یک جلوه صوتی است که در Android 12 معرفی شده است و می‌تواند از کانال صوتی داده‌های لمسی تولید کند و آن را به‌صورت هم‌زمان به‌عنوان لمس‌های جفت‌شده با صدا پخش کند. همان‌طور که در شکل ۸ نشان داده شده است، جلوه روی AudioTrack اعمال می‌شود:

معماری «مولد لمسی»

شکل ۸. معماری «ژنراتور لمسی».

این تجسم معماری نشان می‌دهد که «مولد لمسی» کجا روی جاری‌سازی صوتی ورودی کاربر اعمال می‌شود، پیش‌از اینکه به Audio HAL ارسال شود. مولد بعداز اینکه AudioMixer داده‌های صوتی و لمسی را تقسیم کرد و قبل‌از هر جلوه صوتی دیگری اعمال می‌شود، و برونداد آن بر هر داده لمسی قبلی در جاری‌سازی برتری دارد.

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

  • فرکانس تشدید برای فیلتر میان‌گذر

    فرکانس تشدید لرزاننده فرکانسی است که در آن محرک لمسی حداکثر خروجی را دارد. این پارامتر یک ضدتشدیدگر را تنظیم می‌کند تا تابع انتقال پاسخ را تاحدی مسطح کند و پهنای باند وسیع‌تری به‌دست آید. چارچوب Android به‌طور خودکار این مقدار را به برونداد روش Vibrator HAL IVibrator.getResonantFrequency پیوند می‌دهد.

    مقدار پیش‌فرض این پارامتر ۱۵۰ هرتز است. می‌توانید این مقدار را در کد تغییر دهید.

  • قدرت عادی‌سازی برای پوشش آهسته

    این پارامتر توان در عادی‌سازی جزئی (کنترل بهره خودکار) را تعیین می‌کند. مقدار پیش‌فرض آن -۰٫۸ است، یعنی ۸۰٪ از تغییرات گستره پویا توسط این مرحله کنترل بهره حذف می‌شود. می‌توانید این مورد را در کد اصلاح کنید.

  • عامل کیفیت برای فیلتر میان‌گذر

    عامل کیفیت لرزاننده (عامل Q) با دو پارامتر تعیین می‌شود:

    • ‫Q صفر، عامل کیفیت صفرها در فیلتر توقف‌باند که رزونانس را تا حدی لغو می‌کند

    • قطب Q، عامل کیفیت قطب‌ها در فیلتر میان‌نگذر

    نسبت این دو مقدار سرکوب رزونانس را محدود می‌کند تا فرکانس‌های پایین‌تر را تقویت کند و پاسخ الگوریتم را گسترده‌تر کند. برای مثال، مقادیر پیش‌فرض ۸ برای «صفر Q» و ۴ برای «قطب Q» نسبت ۲ را تولید می‌کند که سرکوب تشدید را با ضریب ۲ (۶ دسی‌بل) محدود می‌کند. چارچوب Android هر دو مقدار را به برونداد روش IVibrator.getQFactor در «لایه انتزاع سخت‌افزار» لرزاننده پیوند می‌دهد.

    اگر مقادیر پیش‌فرض کاهش قدرت موتور را در دستگاهتان درنظر نمی‌گیرد، توصیه می‌کنیم هر دو مقدار را هم‌زمان اصلاح کنید و هر دو را افزایش یا کاهش دهید. نسبت «کیفیت صفر» به «کیفیت قطب» باید بزرگ‌تر از ۱ باشد. می‌توانید این مورد را در کد اصلاح کنید.

  • فرکانس گوشه برای اعوجاج

    فرکانس گوشه توسط فیلتر پایین‌گذر اعمال می‌شود که لرزش سطح پایین را سرکوب می‌کند و سطوح بالاتر را بااستفاده از اعوجاج مکعبی تقویت می‌کند. به‌طور پیش‌فرض روی ۳۰۰ هرتز تنظیم شده است. می‌توانید این مقدار را در کد تغییر دهید.

  • بهره ورودی و آستانه مکعب برای اعوجاج

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

    • مقدار پیش‌فرض برای ضریب بهره ورودی ۰٫۳ است.
    • مقدار پیش‌فرض برای آستانه مکعب ۰٫۱ است.

    توصیه می‌کنیم هر دو مقدار را با هم اصلاح کنید. آن‌ها را می‌توانید در کد پیدا کنید.

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

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

  • بهره خروجی برای اعوجاج

    این پارامتر دامنه لرزش نهایی را کنترل می‌کند. این بهره نهایی است که پس‌از محدودکننده نرمی اعمال می‌شود که دامنه‌های ارتعاش را به کمتر از ۱ محدود می‌کند. مقدار پیش‌فرض آن ۱٫۵ است و می‌توانید آن را در کد اصلاح کنید.

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