हैप्टिक फ़्रेमवर्क के लिए उपयोगकर्ता अनुभव से जुड़ी बुनियादी जानकारी

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)
  • पुष्टि करें
  • नहीं
  • 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[] की सीरीज़ में बदलाव करें, जैसा कि छठे चित्र में दिखाया गया है.

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

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

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

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

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

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

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

ऑडियो कपल

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

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

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

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

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

ऑडियो के साथ हैप्टिक फ़ीडबैक

आठवीं इमेज. ऑडियो के साथ काम करने वाले वाइब्रेशन की सुविधा लागू करना

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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