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

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

उपयोगकर्ता अनुभव से जुड़ी नीतियां

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

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

एपीआई माटिंग में इस्तेमाल हुए तरीके जोड़े जाने का साल
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
2016 से पहले
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_मूव
  • 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)
  • areAllimpacts Support()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • बनाएं पहले से तय()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • लिखें()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

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

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

हैप्टिक फ़ीडबैक की सेटिंग हटाना

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

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 या इससे पहले के वर्शन में, इस्तेमाल के ये उदाहरण काम करते हैं.

रिच हैप्टिक

चौथी इमेज. स्लाइडिंग टेक्स्चर वाले शानदार हैप्टिक

खींचने और स्वाइप करने की सुविधा

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ऑडियो कपल

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

ऑडियो-कपल्ड हैप्टिक: इन्हें लागू करने से जुड़ी सलाह

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

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

ऑडियो जोड़े गए हैप्टिक

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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