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

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

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

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

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

एपीआई तरीके और कॉन्स्टेंट जोड़े जाने का साल
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 का मकसद, बेहतर तरीके से काम करने वाले haptics को बेहतर तरीके से कॉम्पोज़ करने और बारीकी से अडजस्ट करने की सुविधा देना है. यहां दिए गए इस्तेमाल के उदाहरण, Android 11 या इससे पहले के वर्शन पर काम करते हैं.

रिच हैप्टिक

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

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

चौथी इमेज. खींचने और स्वाइप करने की सुविधा.

इस्तेमाल का पहला उदाहरण: स्लाइड करने वाला टेक्स्चर

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

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

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

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

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

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

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

इस्तेमाल का दूसरा उदाहरण: आसानी से शुरू होने वाले इफ़ेक्ट के साथ लंबे समय तक वाइब्रेशन

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

धीरे-धीरे शुरू होने वाला इफ़ेक्ट लागू करना

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

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

  3. धीरे-धीरे बढ़ने वाला कर्व जनरेट करने के लिए, timings[] और amplitudes[] की सीरीज़ में बदलाव करें, जैसा कि चित्र 5 में दिखाया गया है.

लंबे समय तक वाइब्रेशन

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

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

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

ऑडियो के साथ काम करने वाले हैप्टिक्स: फ़ायदे

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

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

ऑडियो कपल

छठी इमेज. ऑडियो के साथ हप्टिक्स के इस्तेमाल का उदाहरण.

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

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

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

    • OGG फ़ॉर्मैट में मौजूद ऐसेट में, एक खास मेटाडेटा बटन होता है. इसके बाद, कई हप्टिक चैनल होते हैं. इससे पता चलता है कि ऐसेट में हप्टिक्स डेटा मौजूद है और उसे MediaPlayer और SoundPool के साथ चलाया जा सकता है.ANDROID_HAPTIC
  • audio_policy_configuration.xml में, haptics और ऑडियो प्लेबैक की सुविधा के काम करने की जानकारी दें.

    • हैप्टिक चैनल के साथ आउटपुट प्रोफ़ाइल का इस्तेमाल करें 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 पर लागू किया गया है, जैसा कि आठवें चित्र में दिखाया गया है:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • विरूपण के लिए कोने की फ़्रीक्वेंसी

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

  • इमेज में गड़बड़ी के लिए इनपुट गेन और क्यूब थ्रेशोल्ड

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

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

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

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

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

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

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

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