हैप्टिक फ़्रेमवर्क के लिए 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[] की सीरीज़ को अडजस्ट करें. इसे इमेज 5 में दिखाया गया है.

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

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

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

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

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

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

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

ऑडियो कपल

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

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

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

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

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

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

ऑडियो के साथ हैप्टिक: 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 फ़्रेमवर्क, दोनों वैल्यू को Vibrator HAL के IVibrator.getQFactor तरीके के आउटपुट से लिंक करता है.

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

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

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

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

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

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

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

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

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

  • आवाज़ में गड़बड़ी के लिए आउटपुट गेन

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

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