হ্যাপটিক ফ্রেমওয়ার্কের জন্য UX ফাউন্ডেশন

হ্যাপটিকের চারপাশে তৈরি করা সমস্ত Android ফ্রেমওয়ার্কের উন্নতিগুলি UX নীতিগুলির একটি সেট দ্বারা পরিচালিত হয় যা সমান হারে বিকশিত হচ্ছে। বর্তমান নীতিতে অস্পষ্ট ভাইব্রেশনের পরিবর্তে স্পষ্ট হ্যাপটিক ব্যবহার করা এবং উন্নত হ্যাপটিক এক্সপ্লোর করা হয়।

UX সংক্রান্ত নীতি

ছবি ১. বর্তমান নীতি।

নিচের টেবিলে সব উপলভ্য হ্যাপটিক API-এর তালিকা দেওয়া হল:

API পদ্ধতি ও কনস্ট্যান্ট যে বছর যোগ করা হয়েছে
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
২০১৬ সালের আগে
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
২০২০ (Android 11)
android.View
  • performHapticFeedback()
২০১৬ সালের আগে
android.os.Vibrator
  • vibrate()
  • hasVibrator()
২০১৬ সালের আগে
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
২০২০ (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
২০১৯ (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
২০২০ (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
২০১৯ (Android 10)

বাজি ভাইব্রেশন

পেজার ও ফিচার ফোন থেকে শুরু করে, কম কোয়ালিটি কিন্তু পাওয়ার-সাশ্রয়ী অকেন্দ্রিক রোটেটিং মাস (ERM) বাজার-ভিত্তিক ভাইব্রেশনকে সাইলেন্ট মোডে অডিটরি রিংয়ের বিকল্প হিসেবে ব্যবহার করা হয়েছে। লেগ্যাসি হার্ডওয়্যার কম্পোনেন্ট যা জোরে ও অস্বস্তিকর শ্রবণযোগ্য শব্দ তৈরি করে, তা কম কোয়ালিটির ইম্প্রেশন (যেমন, সস্তা, ভাঙা ফোন) ডেলিভার করার মাধ্যমে হ্যাপ্টিক 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 ইকোসিস্টেমে হ্যাপটিক্সের সামগ্রিক কোয়ালিটি উন্নত করার মূল চাবিকাঠি। হ্যাপ্টিক প্রয়োগ সম্পর্কে আরও জানতে প্রাথমিক চেকলিস্ট, হার্ডওয়্যার মূল্যায়ন ও CDD ব্যবহার করুন।

প্রেস করে ছেড়ে দিন

ছবি ২. প্রেস করা ও ছেড়ে দেওয়া।

রিচ হ্যাপটিক

রিচ হ্যাপটিক্স হল একটি ক্রমবর্ধমান হ্যাপটিক্স বিভাগ যা একক ইমপালস-ভিত্তিক এফেক্টের বাইরে যায়। 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 ক্ষমতার উপর নির্ভর করে।

ব্যবহারিক ক্ষেত্র ২: ইজ-ইন এফেক্ট সহ দীর্ঘ ভাইব্রেশন

দীর্ঘ ভাইব্রেশন হল একটি মসৃণ অ্যামপ্লিটিউড ভাইব্রেশন যা ০ থেকে টার্গেট অ্যামপ্লিটিউডে ট্রানজিশন করে। দীর্ঘক্ষণ ধরে চলা ভাইব্রেশন, মনোযোগ আকর্ষণ করার মতো হ্যাপটিক্স তৈরি করতে পারে। তবে, শান্ত পরিবেশে হঠাৎ করে দীর্ঘক্ষণ ধরে ভাইব্রেট করলে ব্যবহারকারীরা চমকে যেতে পারেন এবং প্রায়ই ভাইব্রেট করার আওয়াজ শোনা যায়। আরও আনন্দদায়ক দীর্ঘ ভাইব্রেশন জেনারেট করতে, দীর্ঘ ভাইব্রেশনের শুরুতে ইজ-ইন এফেক্ট প্রয়োগ করুন। এর ফলে একটি মসৃণ অ্যামপ্লিটিউড ট্রানজিশন তৈরি হয় যা টার্গেট অ্যামপ্লিটিউডের দিকে এগিয়ে যায়।

ইজ-ইন এফেক্ট প্রয়োগ করুন

  1. android.os.Vibrator.hasAmplitudeControl()-এর মাধ্যমে অ্যাম্প্লিটিউড কন্ট্রোলের হার্ডওয়্যার ক্ষমতা চেক করুন।

    • বিভিন্ন অ্যাম্প্লিটিউড সহ ইজ-ইন এফেক্ট তৈরি করতে ফলাফল true হতে হবে।
  2. VibrationEffect ব্যবহার করুন।createWaveform(timings[], amplitudes[], int repeat).

  3. Figure 5-এ দেখানো ইজ-ইন কার্ভ তৈরি করতে timings[] এবং amplitudes[]-এর সিরিজ অ্যাডজাস্ট করুন।

দীর্ঘক্ষণ ধরে ভাইব্রেশন

ছবি ৫. দীর্ঘ ভাইব্রেশন ইজ-ইন কার্ভ।

ব্যবহারের ক্ষেত্র ৩: অডিও-কাপল্ড হ্যাপটিক্স

অডিও-কাপলড হ্যাপটিক্স হল হ্যাপটিক প্যাটার্ন যা অডিওর রিদমের সাথে কাপল করা হয় ব্যবহারকারীর মনোযোগ আকর্ষণ করার জন্য।

অডিও-কাপল্ড হ্যাপটিক্স: সুবিধা

অডিও-কাপল্ড হ্যাপটিক্স প্রয়োগ করতে, দীর্ঘ কম্পনের সাথে স্পষ্ট হ্যাপটিক্স একত্রিত করুন। ক্লিয়ার হ্যাপটিক্স থেকে পাওয়া শক্তিশালী কিন্তু সংক্ষিপ্ত হ্যাপটিক সেনসেশন ডিসক্রিট রিদিমিক প্যাটার্ন প্রদান করে। দীর্ঘ ভাইব্রেশন থেকে পাওয়া উচ্চ মাত্রার স্টিমুলির সাথে এটি যোগ করলে, ব্যবহারকারীর মনোযোগ আকর্ষণ করার কাজটি খুব ভালভাবে করা যায়।

সংবেদনের ছন্দময় প্যাটার্ন বিবেচনা করা গুরুত্বপূর্ণ। কোনও ছন্দ না থাকলে ব্যবহারকারী হ্যাপ্টিক সেনসেশনকে র‍্যান্ডম বাজ হিসেবে ধরে নেন এবং সেগুলি উপেক্ষা করেন।

অডিও কাপল

ছবি ৬. অডিও কাপল হ্যাপটিক্সের উদাহরণ।

অডিও-কাপল্ড হ্যাপটিক্স: প্রয়োগ করার জন্য পরামর্শ

অডিও-কাপলড হ্যাপটিক্স প্রয়োগ করার জন্য অডিও এবং হ্যাপটিক চ্যানেল উভয়ের কন্টেন্ট প্লেব্যাক সম্পর্কে প্রাথমিক ধারণা থাকা প্রয়োজন। নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

  • MediaPlayer বা SoundPool ক্লাস ব্যবহার করুন।

    • বিশেষ মেটাডেটা কী সহ OGG ফর্ম্যাটে অ্যাসেট (ANDROID_HAPTIC-এর পরে হ্যাপটিক চ্যানেলের সংখ্যা) হ্যাপটিক্স ডেটার উপস্থিতি এবং 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)।
    • রিংটোন ও সিঙ্ক্রোনাস হ্যাপটিক ও ফিডব্যাক সহ UI সাউন্ডের মতো ব্যবহার অন্তর্ভুক্ত।
  • Vibrator HAL-কে অবশ্যই এক্সটার্নাল কন্ট্রোল সাপোর্ট প্রয়োগ করতে হবে।

অডিও কাপল্ড হ্যাপটিক্স

ছবি ৭. অডিও-কাপলড হ্যাপটিক প্রয়োগ করা হচ্ছে।

অডিও-কাপল্ড হ্যাপটিক্স: HapticGenerator

HapticGenerator হল Android 12-এ চালু করা একটি অডিও এফেক্ট যা অডিও চ্যানেল থেকে হ্যাপ্টিক ডেটা জেনারেট করতে পারে এবং এটিকে রিয়েল-টাইমে অডিও-কাপলড হ্যাপ্টিক হিসেবে চালাতে পারে। এফেক্টটি AudioTrack-এ প্রয়োগ করা হয়েছে, যা চিত্র ৮-এ দেখানো হয়েছে:

হ্যাপটিক জেনারেটরের আর্কিটেকচার

ছবি ৮. হ্যাপটিক জেনারেটর আর্কিটেকচার।

এই আর্কিটেকচার ভিজ্যুয়ালাইজেশন দেখায় যে হ্যাপ্টিক জেনারেটরটি কোথায় প্রয়োগ করা হয় ইনকামিং ব্যবহারকারীর অডিও স্ট্রিমে এটি অডিও HAL-এ পাঠানোর আগে। জেনারেটর AudioMixer অডিও ও হ্যাপ্টিক ডেটা আলাদা করার পরে এবং অন্য অডিও এফেক্টের আগে প্রয়োগ করা হয় এবং এর আউটপুট স্ট্রিমের আগের যেকোনও হ্যাপ্টিক ডেটাকে ওভাররাইড করে।

আপনার হ্যাপটিক জেনারেটর অ্যালগরিদম যাতে হাই-কোয়ালিটি হ্যাপটিক জেনারেট করে তা নিশ্চিত করতে, ডিভাইস ভাইব্রেটর মোটরের সাথে জেনারেশন অ্যালগরিদম টিউন করুন। এর জন্য, অডিও ওয়েভফর্মের উপর প্রয়োগ করা ফিল্টারের চেইন কনফিগার করা প্যারামিটার অ্যাডজাস্ট করুন। এই বিভাগে এইসব প্যারামিটার সম্পর্কে বিস্তারিত বিবরণ দেওয়া আছে এবং আপনার হার্ডওয়্যার স্পেসিফিকেশন অনুযায়ী কীভাবে সেগুলি টিউন করবেন তাও ব্যাখ্যা করা আছে।

  • ব্যান্ড-পাস ফিল্টারের জন্য রেজোন্যান্ট ফ্রিকোয়েন্সি

    ভাইব্রেটর রেজোন্যান্ট ফ্রিকোয়েন্সি হল সেই ফ্রিকোয়েন্সি যেখানে হ্যাপটিক অ্যাকচুয়েটরের সর্বাধিক আউটপুট থাকে। এই প্যারামিটারটি একটি অ্যান্টি-রেজোনেটরকে আংশিকভাবে অ্যাডজাস্ট করে আরও প্রশস্ত ব্যান্ডউইথ পেতে রেসপন্স ট্রান্সফার ফাংশন ফ্ল্যাটেন করে। Android ফ্রেমওয়ার্ক অটোমেটিক এই ভ্যালুকে Vibrator HAL পদ্ধতির IVibrator.getResonantFrequency আউটপুটের সাথে লিঙ্ক করে।

    এই প্যারামিটারের ডিফল্ট ভ্যালু হল ১৫০ Hz। আপনি কোডে এটি পরিবর্তন করতে পারেন।

  • স্লো এনভেলপের জন্য নরমালাইজেশন পাওয়ার

    এই প্যারামিটার আংশিক স্বাভাবিককরণে (অটোমেটিক গেন কন্ট্রোল) সূচক নির্ধারণ করে। এর ডিফল্ট ভ্যালু হল -০.৮, যার অর্থ হল ডায়নামিক রেঞ্জ ভেরিয়েশনের ৮০% এই গেন কন্ট্রোল স্টেপ দ্বারা সরিয়ে দেওয়া হয়। আপনি কোড থেকে এটি পরিবর্তন করতে পারবেন।

  • ব্যান্ড-স্টপ ফিল্টারের জন্য Q ফ্যাক্টর

    ভাইব্রেটর কোয়ালিটি ফ্যাক্টর (Q ফ্যাক্টর) দুটি প্যারামিটার দ্বারা নির্ধারিত হয়:

    • জিরো Q, ব্যান্ড-স্টপ ফিল্টারে জিরোর কোয়ালিটি ফ্যাক্টর যা আংশিকভাবে রেজোন্যান্স বাতিল করে

    • ব্যান্ড-স্টপ ফিল্টারে পোল Q, পোলগুলির কোয়ালিটি ফ্যাক্টর

    এই দুটি ভ্যালুর অনুপাত, কম ফ্রিকোয়েন্সি বুস্ট করতে এবং অ্যালগরিদমের উত্তরকে আরও বিস্তারিত করতে, রেজোনেন্সের সাপ্রেশনকে সীমিত করে। যেমন, জিরো Q-এর জন্য ৮ এবং পোল Q-এর জন্য ৪-এর ডিফল্ট মান ২-এর অনুপাত তৈরি করে, যা ২-এর ফ্যাক্টর (৬ dB) দ্বারা রেজোন্যান্স সাপ্রেশনকে সীমিত করে। Android ফ্রেমওয়ার্ক, Vibrator HAL পদ্ধতির IVibrator.getQFactor আউটপুটের সাথে দুটি ভ্যালুকে লিঙ্ক করে।

    ডিফল্ট ভ্যালু আপনার ডিভাইসে মোটর শক্তির হ্রাসকে হিসেবে না ধরলে, আমরা একই সাথে দুটি ভ্যালু পরিবর্তন করার সাজেশন দিই এবং দুটি ভ্যালু বাড়ানো বা কমানো যেতে পারে। জিরো Q ও পোল Q-এর অনুপাত ১-এর থেকে বেশি হতে হবে। আপনি কোড থেকে এটি পরিবর্তন করতে পারবেন।

  • বিকৃতির জন্য কোণ সংক্রান্ত ফ্রিকোয়েন্সি

    লো-পাস ফিল্টারের মাধ্যমে কর্নার ফ্রিকোয়েন্সি প্রয়োগ করা হয় যা লো-লেভেল ভাইব্রেশন কমায় এবং কিউবিক ডিস্টরশন ব্যবহার করে হাই-লেভেল বাড়ায়। এটি ডিফল্ট হিসেবে ৩০০ Hz-এ সেট করা থাকে। আপনি কোড থেকে এটি পরিবর্তন করতে পারবেন।

  • ডিস্টরশনের জন্য ইনপুট গেইন ও কিউব থ্রেশহোল্ড

    এইসব প্যারামিটার ইনপুট ওয়েভফর্মে প্রয়োগ করা নন-লিনিয়ার ডিসটর্শন ফিল্টার ব্যবহার করে যা কম ফ্রিকোয়েন্সি সিগন্যালের অ্যামপ্লিটিউড কমায় এবং বেশি ফ্রিকোয়েন্সি সিগন্যালের অ্যামপ্লিটিউড বাড়ায়।

    • ইনপুট গেন ফ্যাক্টরের ডিফল্ট ভ্যালু হল ০.৩।
    • কিউব থ্রেশহোল্ডের ডিফল্ট ভ্যালু হল ০.১।

    আমরা দুটি ভ্যালু একসাথে পরিবর্তন করার সাজেশন দিই। এগুলি কোডে পাওয়া যাবে।

    এই ফিল্টারের মাধ্যমে প্রয়োগ করা ফাংশন সম্পর্কে আরও তথ্য পেতে, কোড-এ প্রয়োগ করা ফাংশন দেখুন।

    এই দুটি প্যারামিটার কীভাবে আউটপুটকে প্রভাবিত করে সে সম্পর্কে আরও জানতে, আমরা ফিল্টারের ফ্রিকোয়েন্সি রেসপন্স প্লট করার এবং বিভিন্ন প্যারামিটার ভ্যালুর সাথে ফ্রিকোয়েন্সি রেসপন্স কীভাবে পরিবর্তিত হয় তা পর্যবেক্ষণ করার সাজেশন দিই।

  • বিকৃতির জন্য আউটপুট গেন

    এই প্যারামিটার চূড়ান্ত কম্পনের প্রশস্ততা নিয়ন্ত্রণ করে। এটি একটি চূড়ান্ত লাভ যা একটি সফট লিমিটারের পরে প্রয়োগ করা হয় যা কম্পনের অ্যামপ্লিটিউডকে ১-এর চেয়ে কম করে দেয়। এর ডিফল্ট ভ্যালু হল ১.৫ এবং আপনি এটি কোডে পরিবর্তন করতে পারবেন।

    ভাইব্রেশন খুব সূক্ষ্ম হলে, ভ্যালু বাড়ান। আপনি যদি অ্যাকচুয়েটর হার্ডওয়্যার খড়খড় করে আওয়াজ করছে শুনতে পান, তাহলে ভ্যালু কমিয়ে দিন।