پایه UX برای چارچوب لمسی

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

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

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

جدول زیر تمام API های لمسی موجود را فهرست می‌کند:

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

لرزش وزوز مانند

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

لمس‌های واضح

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

اندروید قصد دارد تا به جای حس‌های مبهم یا گیج‌کننده، حس‌های لمسی واضح و قوی و در عین حال تیز ارائه دهد.

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

در 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

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

مطبوعات و انتشار

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

لمس غنی

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

حس لامسه غنی

شکل ۳. حس لامسه غنی با بافت کشویی.

کشیدن و سوایپ کردن

شکل ۴. کشیدن و سوایپ کردن.

مورد استفاده ۱: بافت کشویی

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

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

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

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

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

اثر خودتان را خلق کنید

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

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

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

جلوه سهولت ورود را اعمال کنید

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

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

  3. سری timings[] و amplitudes[] را تنظیم کنید تا منحنی ease-in را مطابق شکل ۵ ایجاد کنید.

لرزش طولانی

شکل ۵. منحنی بلندِ کاهش ارتعاش.

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

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

مزایای فناوری لمسی همراه با صدا

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

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

زوج صوتی

شکل ۶. مثالی از هاپتیک زوج صوتی.

هاپتیک‌های صوتی-همراه: نکاتی برای پیاده‌سازی

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

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

فناوری‌های لمسی همراه با صدا

شکل ۷. پیاده‌سازی فناوری‌های لمسی همراه با صدا.

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

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

Haptic Generator architecture

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

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

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

  • فرکانس رزونانس برای فیلتر میان‌گذر

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

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

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

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

  • ضریب Q برای فیلتر میان‌گذر

    ضریب کیفیت ویبراتور (فاکتور Q) توسط دو پارامتر تعیین می‌شود:

    • Zero Q، ضریب کیفیت صفرها در فیلتر میان‌گذر که تا حدی رزونانس را لغو می‌کند.

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

    نسبت این دو مقدار، سرکوب رزونانس را محدود می‌کند تا فرکانس‌های پایین‌تر را تقویت کرده و پاسخ الگوریتم را گسترش دهد. به عنوان مثال، مقادیر پیش‌فرض ۸ برای Zero Q و ۴ برای Pole Q نسبت ۲ را ایجاد می‌کنند و سرکوب رزونانس را با ضریب ۲ (۶ دسی‌بل) محدود می‌کنند. چارچوب اندروید هر دو مقدار را به خروجی روش Vibrator HAL IVibrator.getQFactor پیوند می‌دهد.

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

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

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

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

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

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

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

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

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

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

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

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