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

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

اصول UX

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

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

API مواد و روش ها سال اضافه شد
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • فشار طولانی
قبل از 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (اندروید 8)
  • تایید
  • رد کنید
  • GESTURE_START
  • GESTURE_END
2020 (اندروید 11)
android.View
  • performHapticFeedback()
قبل از 2016
android.os.Vibrator
  • لرزش ()
  • hasVibrator()
قبل از 2016
  • hasAmplitudeControl()
2017 (اندروید 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (اندروید 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (اندروید 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 (اندروید 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • ساختن()
2020 (اندروید 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (اندروید 10)

لرزش وزوز

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

هاپتیک ها را پاک کنید

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

هدف آندروید ارائه لمسی شفاف با احساسات قوی و در عین حال تیز است نه احساساتی که وزوز یا مات هستند.

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

در 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 استفاده کنید. برای کسب اطلاعات بیشتر در مورد پیاده سازی لمسی.

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

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

لمسی غنی

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

هپتیک غنی

شکل 4. هاپتیک غنی با بافت کشویی

کشیدن و کشیدن انگشت

شکل 5. کشیدن و کشیدن

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

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

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

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

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

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

اثر خود را ایجاد کنید

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

مورد استفاده 2: لرزش طولانی با اثر آسان

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

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

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

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

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

لرزش طولانی

شکل 6. منحنی سهولت ارتعاش طولانی

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

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

لمسی همراه با صدا: مزایا

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

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

زوج صوتی

شکل 7. نمونه لمسی زوج صوتی

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

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

  • از کلاس های 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 باید پشتیبانی کنترل خارجی را اجرا کند.

هپتیک های همراه صوتی

شکل 8. پیاده سازی هاپتیک های جفت شده صوتی

لمسی همراه با صوتی: مولد هپتیک

HapticGenerator یک جلوه صوتی است که در اندروید 12 معرفی شده است که می تواند داده های لمسی را از یک کانال صوتی تولید کند و آن را به صورت لمسی همراه با صدا در زمان واقعی پخش کند. این افکت بر روی AudioTrack همانطور که در شکل 9 توضیح داده شده است اعمال می شود.

Haptic Generator architecture

شکل 9. معماری ژنراتور هپتیک

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

  1. فرکانس تشدید برای فیلتر باند گذر

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

    مقدار پیش فرض این پارامتر 150 هرتز است. این را می توان در کد اینجا اصلاح کرد.

  2. قدرت عادی سازی برای پاکت آهسته

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

  3. فاکتور Q برای فیلتر باند استاپ

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

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

    • Pole Q، فاکتور کیفیت قطب ها در فیلتر band-stop.

    نسبت این دو مقدار، سرکوب رزونانس را محدود می‌کند تا فرکانس‌های پایین‌تر را تقویت کند و پاسخ الگوریتم را گسترش دهد. به عنوان مثال، مقادیر پیش‌فرض 8 برای صفر Q و 4 برای قطب Q نسبت 2 را ایجاد می‌کنند که سرکوب تشدید را با ضریب 2 (6 دسی‌بل) محدود می‌کند. چارچوب Android هر دو مقدار را به خروجی روش Vibrator HAL پیوند می دهد IVibrator.getQFactor .

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

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

    فرکانس گوشه توسط یک فیلتر پایین گذر اعمال می شود که لرزش سطح پایین را سرکوب می کند و با استفاده از اعوجاج مکعبی سطوح بالاتر را افزایش می دهد. به طور پیش فرض 300 هرتز است. این را می توان در کد اینجا اصلاح کرد.

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

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

    • مقدار پیش فرض برای ضریب افزایش ورودی 0.3 است.
    • مقدار پیش فرض برای آستانه مکعب 0.1 است.

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

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

  6. بهره خروجی برای اعوجاج

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