हैप्टिक फ़्रेमवर्क के लिए UX फ़ाउंडेशन

हैप्टिक फ़ीडबैक के लिए, Android फ़्रेमवर्क में किए गए सभी सुधार, यूज़र एक्सपीरियंस (यूएक्स) के सिद्धांतों के एक सेट पर आधारित होते हैं. ये सिद्धांत, एक ही दर से विकसित हो रहे हैं. मौजूदा सिद्धांतों के तहत, तेज़ वाइब्रेशन की जगह साफ़ हैप्टिक का इस्तेमाल किया जाता है. साथ ही, बेहतर हैप्टिक का इस्तेमाल किया जाता है.

यूएक्स के सिद्धांत

पहली इमेज. मौजूदा सिद्धांतों के मुताबिक.

यहां दी गई टेबल में, हैप्टिक से जुड़े सभी उपलब्ध एपीआई की सूची दी गई है:

एपीआई तरीके और स्थिरांक जोड़ने का साल
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
2016 से पहले
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
2016 से पहले
android.os.Vibrator
  • vibrate()
  • hasVibrator()
2016 से पहले
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

बज़ी वाइब्रेशन

पेजर और फ़ीचर फ़ोन के समय से ही, कम क्वालिटी वाले लेकिन कम बिजली की खपत करने वाले ईआरएम (एक्सेंट्रिक रोटेटिंग मास) बज़र पर आधारित वाइब्रेशन का इस्तेमाल, साइलेंट मोड में सुनाई देने वाली रिंगटोन के विकल्प के तौर पर किया जाता रहा है. लेगसी हार्डवेयर कॉम्पोनेंट से तेज़ और खराब आवाज़ें निकलती हैं. इससे हैप्टिक यूज़र एक्सपीरियंस (यूएक्स) को नुकसान पहुंच सकता है. ऐसा इसलिए, क्योंकि ये कॉम्पोनेंट खराब क्वालिटी के इंप्रेशन देते हैं. उदाहरण के लिए, सस्ता और टूटा हुआ फ़ोन.

हैप्टिक इफ़ेक्ट हटाएं

क्लियर हैप्टिक, अलग-अलग स्थितियों में होने वाले बदलावों को महसूस करने में मदद करते हैं. उदाहरण के लिए, डिवाइस के चालू और बंद होने के दौरान होने वाले बाइनरी बदलाव. अलग-अलग अफ़ॉर्डेंस की वजह से, हैप्टिक इफ़ेक्ट एक ही इकाई के तौर पर जनरेट होते हैं. उदाहरण के लिए, एक इनपुट इवेंट के लिए एक हैप्टिक इफ़ेक्ट.

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 नेटवर्क में हैप्टिक की क्वालिटी को बेहतर बनाया जा सकता है. हैप्टिक टेक्नोलॉजी को लागू करने के बारे में ज़्यादा जानने के लिए, बुनियादी चेकलिस्ट, हार्डवेयर का आकलन, और सीडीडी का इस्तेमाल करें.

दबाकर रखें और छोड़ें

दूसरी इमेज. बटन को दबाकर छोड़ना.

रिच हैप्टिक

रिच हैप्टिक, हैप्टिक की एक ऐसी कैटगरी है जो लगातार बढ़ रही है. इसमें सिंगल इंपल्स पर आधारित इफ़ेक्ट के अलावा और भी कई इफ़ेक्ट शामिल हैं. Android का मकसद, बेहतर हैप्टिक फ़ीडबैक देना है. इसके लिए, वह हैप्टिक फ़ीडबैक को अलग-अलग तरह से इस्तेमाल करने और उसे अपनी ज़रूरत के हिसाब से अडजस्ट करने की सुविधा देता है. Android 11 या इससे पहले के वर्शन में, इन मामलों में इस सुविधा का इस्तेमाल किया जा सकता है.

रिच हैप्टिक

तीसरी इमेज. स्लाइडिंग टेक्सचर के साथ रिच हैप्टिक.

खींचना और छोड़ना, स्वाइप करना

चौथी इमेज. खींचकर छोड़ना और स्वाइप करना.

इस्तेमाल का पहला उदाहरण: स्लाइडिंग टेक्सचर

अगर उंगली को टच सरफ़ेस पर स्लाइड करते समय हैप्टिक इफ़ेक्ट दोहराया जाता है (उदाहरण के लिए, खींचना, स्वाइप करना, फ़ैंटम हैप्टिक टेक्सचर के साथ सरफ़ेस को एक्सप्लोर करना), तो दोहराए जाने वाले हैप्टिक इफ़ेक्ट को बेहतर और हल्का होना चाहिए.

अगर किसी आवाज़ को साफ़ तौर पर सुनने के बजाय, उसे गूंजते हुए सुना जाता है, तो हो सकता है कि आवाज़ के दोहराव के बीच के इंटरवल को हटा दिया गया हो. इससे कई अलग-अलग सिग्नल के बजाय, एक लंबा बज़ मिलता है.

अगर ऐम्प्लिट्यूड बहुत कम नहीं है, तो दोहराव की वजह से हैप्टिक एनर्जी बढ़ती है. इससे दोहराव के आखिर में, हैप्टिक फ़ीडबैक बहुत ज़्यादा मिलता है.

स्वाइप और खींचकर छोड़ने के जेस्चर के लिए, हैप्टिक टेक्सचर लागू करना

HapticFeedbackConstants में CLOCK_TICK और TEXT_HANDLE_MOVE का इस्तेमाल करें. ये कॉन्स्टेंट, दोहराव और ऐम्प्लिट्यूड की विशेषताओं को पहले से तय करते हैं.

अपना इफ़ेक्ट बनाना

अपना इफ़ेक्ट बनाने के लिए, VibrationEffect.Composition में PRIMITIVE_CLICK और PRIMITIVE_TICK के क्रम को एक साथ जोड़कर डिज़ाइन बनाएं. addPrimitive(int primitiveID, float scale, int delay) का इस्तेमाल करके, दोहराव और ऐम्प्लिट्यूड स्केल की विशेषताओं को अडजस्ट किया जा सकता है. यह सुविधा, Vibrator HAL Interface की CAP_COMPOSE_EFFECTS सुविधा पर निर्भर करती है.

इस्तेमाल का दूसरा उदाहरण: वाइब्रेशन को धीरे-धीरे तेज़ करना

लंबे समय तक वाइब्रेशन होने का मतलब है कि वाइब्रेशन का ऐंप्लीट्यूड धीरे-धीरे बढ़ता है. यह 0 से टारगेट ऐंप्लीट्यूड तक बढ़ता है. ज़ोर से वाइब्रेशन होने पर, ध्यान खींचने वाले हैप्टिक जनरेट हो सकते हैं. हालांकि, शांत माहौल में अचानक लंबे समय तक होने वाले वाइब्रेशन से लोगों को परेशानी हो सकती है. साथ ही, इससे अक्सर आवाज़ भी आती है. ज़्यादा देर तक चलने वाले वाइब्रेशन को बेहतर बनाने के लिए, वाइब्रेशन की शुरुआत में ईज़-इन इफ़ेक्ट लागू करें. इससे ऐम्प्लिट्यूड में आसानी से बदलाव होता है और यह टारगेट ऐम्प्लिट्यूड की ओर बढ़ता है.

ईज़-इन इफ़ेक्ट लागू करना

  1. android.os.Vibrator.hasAmplitudeControl() का इस्तेमाल करके, ऐम्प्लिट्यूड कंट्रोल करने की हार्डवेयर क्षमताओं की जांच करें.

    • ऐम्प्लिट्यूड में बदलाव के साथ ईज़-इन इफ़ेक्ट बनाने के लिए, नतीजे को true होना चाहिए.
  2. VibrationEffect.createWaveform(timings[], amplitudes[], int repeat) का इस्तेमाल करें.

  3. आसान इन कर्व जनरेट करने के लिए, timings[] और amplitudes[] की सीरीज़ को अडजस्ट करें. इसे पांचवें फ़िगर में दिखाया गया है.

देर तक होने वाला वाइब्रेशन

पांचवीं इमेज. देर तक होने वाले वाइब्रेशन के लिए, आसानी से शुरू होने वाला कर्व.

इस्तेमाल का तीसरा उदाहरण: ऑडियो के साथ हैप्टिक

ऑडियो के साथ हैप्टिक, हैप्टिक पैटर्न होते हैं. ये पैटर्न, ऑडियो की लय के साथ मिलकर काम करते हैं, ताकि उपयोगकर्ता का ध्यान खींचा जा सके.

ऑडियो के साथ हैप्टिक फ़ीडबैक देने की सुविधा: फ़ायदे

ऑडियो के साथ हैप्टिक को जोड़ने के लिए, साफ़ हैप्टिक को लंबे वाइब्रेशन के साथ जोड़ें. क्लियर हैप्टिक की वजह से, हैप्टिक की तेज़ लेकिन कम समय के लिए होने वाली संवेदनाएं, अलग-अलग रिदम वाले पैटर्न देती हैं. जब इसे लंबे समय तक वाइब्रेशन देने वाले स्टिमुलस के साथ जोड़ा जाता है, तो यह उपयोगकर्ता का ध्यान खींचने में बहुत मददगार होता है.

लयबद्ध पैटर्न को ध्यान में रखना ज़रूरी है. अगर हैप्टिक फ़ीडबैक में कोई रिदम नहीं है, तो उपयोगकर्ता को ऐसा लगेगा कि ये वाइब्रेशन अचानक हो रहे हैं. इसलिए, वह इन्हें अनदेखा कर सकता है.

ऑडियो कपल

छठी इमेज. ऑडियो और हैप्टिक के उदाहरण.

ऑडियो के साथ हैप्टिक: लागू करने के बारे में सलाह

ऑडियो के साथ हैप्टिक इफ़ेक्ट लागू करने के लिए, ऑडियो और हैप्टिक, दोनों चैनलों के कॉन्टेंट को चलाने की बुनियादी जानकारी होना ज़रूरी है. इन बातों का ध्यान रखें:

  • MediaPlayer या SoundPool क्लास का इस्तेमाल करें.

    • खास मेटाडेटा कुंजी (ANDROID_HAPTIC के बाद हैप्टिक चैनलों की संख्या) वाली OGG फ़ॉर्मैट में मौजूद ऐसेट, हैप्टिक डेटा की मौजूदगी और 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) होते हैं.
    • इस्तेमाल के उदाहरणों में, रिंगटोन और यूज़र इंटरफ़ेस (यूआई) की आवाज़ें शामिल हैं. इनमें सिंक्रोनस हैप्टिक और फ़ीडबैक की सुविधा होती है.
  • वाइब्रेटर एचएएल में, बाहरी कंट्रोल की सुविधा लागू होनी चाहिए.

ऑडियो के साथ हैप्टिक

सातवीं इमेज. ऑडियो के साथ हैप्टिक इफ़ेक्ट लागू किए जा रहे हैं.

ऑडियो के साथ हैप्टिक: HapticGenerator

HapticGenerator, Android 12 में पेश किया गया एक ऑडियो इफ़ेक्ट है. यह ऑडियो चैनल से हैप्टिक डेटा जनरेट कर सकता है और उसे रीयल टाइम में ऑडियो-कपल्ड हैप्टिक के तौर पर चला सकता है. इफ़ेक्ट को AudioTrack पर लागू किया जाता है. इसे इमेज 8 में दिखाया गया है:

हैप्टिक जनरेटर का आर्किटेक्चर

आठवीं इमेज. हैप्टिक जनरेटर का आर्किटेक्चर.

आर्किटेक्चर के इस विज़ुअलाइज़ेशन में दिखाया गया है कि उपयोगकर्ता के ऑडियो स्ट्रीम को ऑडियो एचएएल को भेजने से पहले, हैप्टिक जनरेटर कहां लागू किया जाता है. जनरेटर को, AudioMixer के ऑडियो और हैप्टिक डेटा को अलग करने के बाद और किसी भी अन्य ऑडियो इफ़ेक्ट से पहले लागू किया जाता है. इसका आउटपुट, स्ट्रीम में मौजूद किसी भी पिछले हैप्टिक डेटा को बदल देता है.

यह पक्का करने के लिए कि हैप्टिक जनरेटर एल्गोरिदम, अच्छी क्वालिटी वाले हैप्टिक जनरेट करे, जनरेशन एल्गोरिदम को डिवाइस वाइब्रेटर मोटर के हिसाब से ट्यून करें. इसके लिए, उन पैरामीटर को अडजस्ट करें जो ऑडियो वेवफ़ॉर्म पर लागू होने वाले फ़िल्टर की चेन को कॉन्फ़िगर करते हैं. इस सेक्शन में, इन पैरामीटर के बारे में विस्तार से बताया गया है. साथ ही, यह भी बताया गया है कि इन्हें अपने हार्डवेयर स्पेसिफ़िकेशन के हिसाब से कैसे ट्यून किया जा सकता है.

  • बैंड-पास फ़िल्टर के लिए रेज़ोनेंट फ़्रीक्वेंसी

    वाइब्रेटर की रेज़ोनेंट फ़्रीक्वेंसी वह फ़्रीक्वेंसी होती है जिस पर हैप्टिक ऐक्चुएटर ज़्यादा से ज़्यादा आउटपुट देता है. यह पैरामीटर, एंटी-रेज़ोनेटर को अडजस्ट करता है, ताकि रिस्पॉन्स ट्रांसफ़र फ़ंक्शन को कुछ हद तक फ़्लैट किया जा सके. इससे ज़्यादा बैंडविड्थ मिलती है. Android फ़्रेमवर्क, इस वैल्यू को Vibrator HAL के IVibrator.getResonantFrequency तरीके के आउटपुट से अपने-आप लिंक कर देता है.

    इस पैरामीटर की डिफ़ॉल्ट वैल्यू 150 हर्ट्ज़ होती है. इसे कोड में जाकर बदला जा सकता है.

  • स्लो एन्वेलप के लिए नॉर्मलाइज़ेशन पावर

    यह पैरामीटर, पार्शियल नॉर्मलाइज़ेशन (ऑटोमैटिक गेन कंट्रोल) में एक्सपोनेंट तय करता है. इसकी डिफ़ॉल्ट वैल्यू -0.8 होती है. इसका मतलब है कि इस गेन कंट्रोल स्टेप से, डाइनैमिक रेंज के 80% वैरिएशन को हटा दिया जाता है. कोड में जाकर, इसमें बदलाव किया जा सकता है.

  • बैंड-स्टॉप फ़िल्टर के लिए Q फ़ैक्टर

    वाइब्रेटर का क्वालिटी फ़ैक्टर (Q फ़ैक्टर), दो पैरामीटर के आधार पर तय किया जाता है:

    • बैंड-स्टॉप फ़िल्टर में मौजूद ज़ीरो का क्वालिटी फ़ैक्टर, जो रेज़ोनेंस को कुछ हद तक रद्द करता है

    • पोल Q, बैंड-स्टॉप फ़िल्टर में पोल का क्वालिटी फ़ैक्टर

    इन दोनों वैल्यू का अनुपात, रेज़ोनेंस को कम करने की सुविधा को सीमित करता है, ताकि कम फ़्रीक्वेंसी को बढ़ाया जा सके और एल्गोरिदम के जवाब को बेहतर बनाया जा सके. उदाहरण के लिए, ज़ीरो क्यू के लिए 8 और पोल क्यू के लिए 4 की डिफ़ॉल्ट वैल्यू से 2 का अनुपात मिलता है. इससे रेज़ोनेंस को 2 के फ़ैक्टर (6 डीबी) से कम किया जा सकता है. Android फ़्रेमवर्क, दोनों वैल्यू को वाइब्रेटर एचएएल के IVibrator.getQFactor तरीके के आउटपुट से लिंक करता है.

    अगर डिफ़ॉल्ट वैल्यू से, आपके डिवाइस में मोटर की स्पीड कम होने का पता नहीं चलता है, तो हमारा सुझाव है कि आप दोनों वैल्यू में एक साथ बदलाव करें. साथ ही, दोनों वैल्यू को एक साथ बढ़ाएं या घटाएं. शून्य Q से पोल Q का अनुपात 1 से ज़्यादा होना चाहिए. कोड में जाकर, इसमें बदलाव किया जा सकता है.

  • डिस्टॉर्शन के लिए कॉर्नर फ़्रीक्वेंसी

    कॉर्नर फ़्रीक्वेंसी को लो-पास फ़िल्टर की मदद से लागू किया जाता है. यह फ़िल्टर, कम लेवल के वाइब्रेशन को कम करता है और क्यूबिक डिस्टॉर्शन का इस्तेमाल करके, ज़्यादा लेवल के वाइब्रेशन को बढ़ाता है. यह डिफ़ॉल्ट रूप से 300 हर्ट्ज़ पर सेट होता है. इसे कोड में जाकर बदला जा सकता है.

  • इनपुट गेन और डिस्टॉर्शन के लिए क्यूब थ्रेशोल्ड

    इन पैरामीटर का इस्तेमाल, इनपुट वेवफ़ॉर्म पर लागू किए गए नॉनलीनियर डिस्टॉर्शन फ़िल्टर करता है. यह फ़िल्टर, कम फ़्रीक्वेंसी वाले सिग्नल के ऐम्प्लिट्यूड को कम करता है और ज़्यादा फ़्रीक्वेंसी वाले सिग्नल के ऐम्प्लिट्यूड को बढ़ाता है.

    • इनपुट गेन फ़ैक्टर की डिफ़ॉल्ट वैल्यू 0.3 होती है.
    • क्यूब थ्रेशोल्ड की डिफ़ॉल्ट वैल्यू 0.1 होती है.

    हमारा सुझाव है कि आप दोनों वैल्यू को एक साथ बदलें. ये कोड में मौजूद होते हैं.

    इस फ़िल्टर से लागू होने वाले फ़ंक्शन के बारे में ज़्यादा जानने के लिए, कोड में जाकर देखें.

    इन दोनों पैरामीटर से आउटपुट पर कैसे असर पड़ता है, इस बारे में ज़्यादा जानने के लिए, हमारा सुझाव है कि फ़िल्टर की फ़्रीक्वेंसी रिस्पॉन्स को प्लॉट करें. साथ ही, देखें कि अलग-अलग पैरामीटर वैल्यू के साथ फ़्रीक्वेंसी रिस्पॉन्स कैसे बदलते हैं.

  • डिस्टॉर्शन के लिए आउटपुट गेन

    यह पैरामीटर, वाइब्रेशन के फ़ाइनल ऐम्प्लिट्यूड को कंट्रोल करता है. यह फ़ाइनल गेन है. इसे सॉफ्ट लिमिटर के बाद लागू किया जाता है. सॉफ्ट लिमिटर, वाइब्रेशन ऐम्प्लिट्यूड को 1 से कम पर सीमित करता है. इसकी डिफ़ॉल्ट वैल्यू 1.5 होती है. इसे कोड में जाकर बदला जा सकता है.

    अगर वाइब्रेशन बहुत कम है, तो वैल्यू बढ़ाएं. अगर आपको ऐक्चुएटर हार्डवेयर के हिलने की आवाज़ सुनाई दे रही है, तो वैल्यू कम करें.