বিভিন্ন পিক্সেল ঘনত্বে কাজ করে

Android ডিভাইসের শুধু বিভিন্ন স্ক্রিন সাইজ—হ্যান্ডসেট, ট্যাবলেট, টিভি ইত্যাদি—থাকে না, তার সাথে বিভিন্ন পিক্সেল সাইজের স্ক্রিনও থাকে। একটি ডিভাইসে প্রতি ইঞ্চিতে ১৬০ পিক্সেল থাকতে পারে, আবার অন্য ডিভাইসে একই স্পেসে ৪৮০ পিক্সেল থাকতে পারে। আপনি যদি পিক্সেল ঘনত্বের এই তারতম্য বিবেচনা না করেন, তাহলে সিস্টেম আপনার ছবি স্কেল করতে পারে, যার ফলে ছবি ঝাপসা হতে পারে বা ছবি ভুল সাইজে দেখা যেতে পারে।

এই পৃষ্ঠা থেকে আপনি জানতে পারবেন যে কীভাবে রেজোলিউশন-ইন্ডিপেন্ডেন্ট পরিমাপের ইউনিট ব্যবহার করে এবং প্রতিটি পিক্সেল ঘনত্বের জন্য বিকল্প বিটম্যাপ রিসোর্স প্রদান করে বিভিন্ন পিক্সেল ঘনত্বে কাজ করার জন্য আপনার অ্যাপ ডিজাইন করতে পারবেন।

এইসব টেকনিকের ওভারভিউ পেতে নিম্নলিখিত ভিডিও দেখুন।

আইকন অ্যাসেট ডিজাইন করার ব্যাপারে আরও তথ্যের জন্য, মেটেরিয়াল ডিজাইন আইকন সংক্রান্ত নির্দেশিকা দেখুন।

ঘনত্ব-নিরপেক্ষ পিক্সেল ব্যবহার করুন

দূরত্ব বা সাইজ নির্ধারণ করার জন্য পিক্সেল ব্যবহার করা এড়িয়ে চলুন। পিক্সেল দিয়ে ডাইমেনশন নির্ধারণ করা সমস্যাজনক কারণ বিভিন্ন স্ক্রিনের পিক্সেল ঘনত্ব আলাদা হয়, তাই একই সংখ্যক পিক্সেল বিভিন্ন ডিভাইসে আলাদা ফিজিক্যাল সাইজ হিসেবে দেখানো হয়।

দুটি উদাহরণ ডিভাইসের ডিসপ্লেতে আলাদা আলাদা ডেনসিটি দেখানো ছবি
ছবি ১: একই সাইজের দুটি স্ক্রিনে আলাদা আলাদা সংখ্যক পিক্সেল থাকতে পারে।

বিভিন্ন ঘনত্বের স্ক্রিনে আপনার UI-এর দৃশ্যমান সাইজ সংরক্ষণ করতে, পরিমাপের একক হিসেবে ঘনত্ব-নিরপেক্ষ পিক্সেল (dp) ব্যবহার করে আপনার UI ডিজাইন করুন। এক ডিপি হল একটি ভার্চুয়াল পিক্সেল ইউনিট যা মোটামুটিভাবে মাঝারি-ঘনত্বের স্ক্রিনে (১৬০ ডিপিআই বা "বেসলাইন" ঘনত্ব) একটি পিক্সেলের সমান। Android এই ভ্যালুকে প্রতিটি অন্যান্য ঘনত্বের জন্য উপযুক্ত সংখ্যক আসল পিক্সেলে অনুবাদ করে।

ছবি ১-এ দেখানো দুটি ডিভাইসের কথা বিবেচনা করুন। বাঁদিকের ডিভাইসে ১০০ পিক্সেল চওড়া ভিউ অনেক বড় দেখায়। ১০০ ডিপি চওড়া হিসেবে সংজ্ঞায়িত করা ভিউ দুটি স্ক্রিনেই একই সাইজের দেখায়।

টেক্সট সাইজ নির্দিষ্ট করার সময়, আপনি পরিবর্তে ইউনিট হিসেবে স্কেলেবল পিক্সেল (sp) ব্যবহার করতে পারেন। sp ইউনিট হল dp-এর মতো একই সাইজ, ডিফল্ট হিসেবে, তবে এটি ব্যবহারকারীর পছন্দের টেক্সট সাইজের উপর ভিত্তি করে ছোট বড় করা হয়। লেআউট সাইজের জন্য sp কখনও ব্যবহার করবেন না।

যেমন, দুটি ভিউয়ের মধ্যে স্পেসিং নির্দিষ্ট করতে, dp ব্যবহার করুন:

<Button android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/clickme"
    android:layout_marginTop="20dp" />

টেক্সট সাইজ নির্দিষ্ট করার সময় sp ব্যবহার করুন:

<TextView android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="20sp" />

dp ইউনিটকে পিক্সেল ইউনিটে কনভার্ট করুন

কিছু ক্ষেত্রে, আপনাকে ডাইমেনশন ডিপি-তে প্রকাশ করতে হবে এবং তারপরে সেগুলিকে পিক্সেলে কনভার্ট করতে হবে। ডিপি ইউনিট থেকে স্ক্রিন পিক্সেলে কনভার্ট করার পদ্ধতি নিম্নলিখিত:

px = dp * (dpi / 160)

মনে রাখবেন: পিক্সেল গণনা করার জন্য এই সমীকরণটি কখনই হার্ডকোড করবেন না। পরিবর্তে, TypedValue.applyDimension() ব্যবহার করুন, যা আপনার জন্য অনেক ধরনের ডাইমেনশন (dp, sp ইত্যাদি) পিক্সেলে কনভার্ট করে।

এমন একটি অ্যাপের কথা ভাবুন যেখানে ব্যবহারকারীর আঙুল অন্তত ১৬ পিক্সেল সরানোর পরে স্ক্রল বা ফ্লিং জেসচার শনাক্ত করা হয়। বেসলাইন স্ক্রিনে, জেসচার শনাক্ত করার আগে ব্যবহারকারীর আঙুলকে 16 pixels / 160 dpi সরাতে হবে, যা ১/১০ ইঞ্চি (বা ২.৫ মিমি)-এর সমান।

হাই-ডেনসিটি ডিসপ্লে (২৪০ ডিপিআই) সহ ডিভাইসে, ব্যবহারকারীর আঙুলকে 16 pixels / 240 dpi সরাতে হবে, যা ১/১৫ ইঞ্চি (বা ১.৭ মিমি)-এর সমান। দূরত্ব অনেক কম, এবং তাই অ্যাপটি ব্যবহারকারীর কাছে আরও সংবেদনশীল বলে মনে হয়।

এই সমস্যার সমাধান করতে, কোডে dp-তে জেসচার থ্রেশহোল্ড প্রকাশ করুন এবং তারপরে এটিকে আসল পিক্সেলে কনভার্ট করুন। যেমন:

Kotlin

// The gesture threshold expressed in dp
private const val GESTURE_THRESHOLD_DP = 16.0f

private var gestureThreshold: Int = 0

// Convert the dps to pixels, based on density scale
gestureThreshold = TypedValue.applyDimension(
  COMPLEX_UNIT_DIP,
  GESTURE_THRESHOLD_DP + 0.5f,
  resources.displayMetrics).toInt()

// Use gestureThreshold as a distance in pixels...

জাভা

// The gesture threshold expressed in dp
private final float GESTURE_THRESHOLD_DP = 16.0f;

// Convert the dps to pixels, based on density scale
int gestureThreshold = (int) TypedValue.applyDimension(
  COMPLEX_UNIT_DIP,
  GESTURE_THRESHOLD_DP + 0.5f,
  getResources().getDisplayMetrics());

// Use gestureThreshold as a distance in pixels...

DisplayMetrics.density ফিল্ডটি বর্তমান পিক্সেল ঘনত্ব অনুযায়ী dp ইউনিটকে পিক্সেলে কনভার্ট করার জন্য ব্যবহৃত স্কেল ফ্যাক্টর নির্দিষ্ট করে। মিডিয়াম-ডেনসিটি স্ক্রিনে, DisplayMetrics.density-এর মান ১.০ এবং হাই-ডেনসিটি স্ক্রিনে এর মান ১.৫। এক্সট্রা-হাই-ডেনসিটি স্ক্রিনে, এটি ২.০-এর সমান এবং লো-ডেনসিটি স্ক্রিনে, এটি ০.৭৫-এর সমান। বর্তমান স্ক্রিনের জন্য আসল পিক্সেল সংখ্যা জানতে TypedValue.applyDimension() এই সংখ্যা ব্যবহার করে।

প্রি-স্কেল করা কনফিগারেশন ভ্যালু ব্যবহার করুন

Android সিস্টেমের মাধ্যমে ব্যবহৃত সাধারণ দূরত্ব, গতি ও সময় অ্যাক্সেস করতে আপনি ViewConfiguration ক্লাস ব্যবহার করতে পারবেন। যেমন, স্ক্রল থ্রেশহোল্ড হিসেবে ফ্রেমওয়ার্কের ব্যবহার করা পিক্সেলের দূরত্ব getScaledTouchSlop()-এর মাধ্যমে পাওয়া যেতে পারে:

Kotlin

private val GESTURE_THRESHOLD_DP = ViewConfiguration.get(myContext).scaledTouchSlop

জাভা

private final int GESTURE_THRESHOLD_DP = ViewConfiguration.get(myContext).getScaledTouchSlop();

ViewConfiguration-এ getScaled প্রিফিক্স দিয়ে শুরু হওয়া পদ্ধতিগুলি পিক্সেলের এমন একটি ভ্যালু রিটার্ন করার গ্যারান্টি দেয় যা বর্তমান পিক্সেল ডেনসিটি যাই হোক না কেন সঠিকভাবে দেখায়।

ভেক্টর গ্রাফিক্সের প্রাধান্য

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

ভেক্টর গ্রাফিক্স সাধারণত SVG (স্কেলেবেল ভেক্টর গ্রাফিক্স) ফাইল হিসেবে প্রদান করা হয়, কিন্তু Android-এ এই ফর্ম্যাট কাজ করে না, তাই আপনাকে SVG ফাইল Android-এর ভেক্টর ড্রয়েবেল ফর্ম্যাটে কনভার্ট করতে হবে।

আপনি Android Studio-এর ভেক্টর অ্যাসেট স্টুডিও ব্যবহার করে নিম্নলিখিত উপায়ে SVG-কে ভেক্টর ড্রয়েবেলে কনভার্ট করতে পারবেন:

  1. প্রোজেক্ট উইন্ডোতে, res ডিরেক্টরিতে ডানদিকের বোতামে ক্লিক করুন এবং নতুন > ভেক্টর অ্যাসেট বিকল্প বেছে নিন।
  2. লোকাল ফাইল (SVG, PSD) বিকল্প বেছে নিন।
  3. আপনি যে ফাইল ইমপোর্ট করতে চান সেটি খুঁজে নিন এবং কোনও অ্যাডজাস্টমেন্ট করুন।

    Android Studio-তে কীভাবে SVG ইমপোর্ট করতে হয় তা দেখানো ছবি
    ছবি ২: Android Studio-এর মাধ্যমে SVG ইমপোর্ট করা।

    আপনি হয়ত অ্যাসেট স্টুডিও উইন্ডোতে কিছু সমস্যা দেখতে পাবেন যা থেকে বোঝা যায় যে ভেক্টর ড্রয়েবেল ফাইলের কিছু প্রপার্টিতে কাজ করে না। এর ফলে আপনি ফাইল ইমপোর্ট করতে পারবেন; কাজ করবে না এমন প্রপার্টি উপেক্ষা করা হয়।

  4. পরবর্তী বিকল্পে ক্লিক করুন।

  5. পরবর্তী স্ক্রিনে, আপনার প্রোজেক্টে যে সোর্স সেট-এ ফাইলটি চান সেটি কনফার্ম করুন এবং শেষ করুন বিকল্পে ক্লিক করুন।

    যেহেতু একটি ভেক্টর ড্রয়েবেল সব পিক্সেল ডেনসিটিতে ব্যবহার করা যায়, তাই এই ফাইলটি আপনার ডিফল্ট ড্রয়েবেল ডিরেক্টরিতে যায়, যেমনটি নিম্নলিখিত হায়ারার্কিতে দেখানো হয়েছে। আপনাকে ডেনসিটি-নির্দিষ্ট ডিরেক্টরি ব্যবহার করতে হবে না।

    res/
      drawable/
        ic_android_launcher.xml
    

ভেক্টর গ্রাফিক তৈরি করার ব্যাপারে আরও তথ্য পেতে, ভেক্টর ড্রয়েবেল ডকুমেন্টেশন পড়ুন।

বিকল্প বিটম্যাপ প্রদান করুন

বিভিন্ন পিক্সেল ডেনসিটি সহ ডিভাইসে ভালো গ্রাফিক্যাল কোয়ালিটি প্রদান করতে, আপনার অ্যাপে প্রতিটি বিটম্যাপের একাধিক ভার্সন প্রদান করুন—প্রতিটি ডেনসিটি বাকেটের জন্য একটি করে, সংশ্লিষ্ট রেজোলিউশনে। অন্যথায়, Android-কে আপনার বিটম্যাপ স্কেল করতে হবে যাতে এটি প্রতিটি স্ক্রিনে একই দৃশ্যমান স্থান দখল করে, যার ফলে স্কেলিং আর্টিফ্যাক্ট যেমন অস্পষ্টতা দেখা দেয়।

বিভিন্ন ঘনত্বের সাইজে বিটম্যাপের জন্য আপেক্ষিক সাইজ দেখানো একটি ছবি
ছবি ৩: বিভিন্ন ডেনসিটি বাকেটে বিটম্যাপের আপেক্ষিক সাইজ।

আপনার অ্যাপে ব্যবহার করার জন্য একাধিক ডেনসিটি বাকেট উপলভ্য। সারণী ১-এ উপলভ্য বিভিন্ন কনফিগারেশন কোয়ালিফায়ার এবং সেগুলি কোন কোন স্ক্রিনের ধরনের ক্ষেত্রে প্রযোজ্য তা বর্ণনা করা হয়েছে।

টেবিল ১. বিভিন্ন পিক্সেল ঘনত্বের জন্য কনফিগারেশন কোয়ালিফায়ার।

ডেনসিটি কোয়ালিফায়ার বর্ণনা
ldpi লো-ডেনসিটি (ldpi) স্ক্রিনের জন্য রিসোর্স (~১২০ dpi)।
mdpi মিডিয়াম-ডেনসিটি (mdpi) স্ক্রিনের জন্য রিসোর্স (~১৬০ dpi)। এটি হল বেসলাইন ঘনত্ব।
hdpi হাই-ডেনসিটি (hdpi) স্ক্রিনের জন্য রিসোর্স (~২৪০ dpi)।
xhdpi এক্সট্রা-হাই-ডেনসিটি (xhdpi) স্ক্রিনের জন্য রিসোর্স (~৩২০ dpi)।
xxhdpi এক্সট্রা-এক্সট্রা-হাই-ডেনসিটি (xxhdpi) স্ক্রিনের (~৪৮০ dpi) জন্য রিসোর্স।
xxxhdpi এক্সট্রা-এক্সট্রা-এক্সট্রা-হাই-ডেনসিটি (xxxhdpi) ব্যবহারের জন্য রিসোর্স (~৬৪০ dpi)।
nodpi সব ডেনসিটির জন্য রিসোর্স। এগুলি হল ডেনসিটি-ইন্ডিপেন্ডেন্ট রিসোর্স। বর্তমান স্ক্রিনের ডেনসিটি যাই হোক না কেন, সিস্টেম এই কোয়ালিফায়ারের সাথে ট্যাগ করা রিসোর্স স্কেল করে না।
tvdpi mdpi এবং hdpi-এর মধ্যে থাকা স্ক্রিনের জন্য রিসোর্স; আনুমানিক ~২১৩ dpi। এটি "প্রাথমিক" ডেনসিটি গ্রুপ হিসেবে বিবেচিত হয় না। এটি মূলত টেলিভিশনের জন্য উদ্দিষ্ট এবং বেশিরভাগ অ্যাপের এটির প্রয়োজন হয় না—বেশিরভাগ অ্যাপের জন্য mdpi এবং hdpi রিসোর্স প্রদান করাই যথেষ্ট এবং সিস্টেম সেগুলিকে উপযুক্ত হিসাবে স্কেল করে। tvdpi রিসোর্স প্রদান করা প্রয়োজন বলে মনে করলে, সেগুলির সাইজ ১.৩৩ * mdpi ফ্যাক্টরে সেট করুন। যেমন, mdpi স্ক্রিনের জন্য ১০০x১০০ পিক্সেলের ছবি tvdpi-এর জন্য ১৩৩x১৩৩ পিক্সেল হয়।

বিভিন্ন ঘনত্বের জন্য বিকল্প বিটম্যাপ ড্রয়েবল তৈরি করতে, ছয়টি প্রাথমিক ঘনত্বের মধ্যে ৩:৪:৬:৮:১২:১৬ স্কেলিং অনুপাত অনুসরণ করুন। যেমন, আপনার কাছে যদি বিটম্যাপ ড্রয়েবল থাকে যা মাঝারি-ঘনত্বের স্ক্রিনের জন্য ৪৮x৪৮ পিক্সেল, তাহলে সাইজগুলি হল:

  • কম ঘনত্বের (ldpi) জন্য ৩৬x৩৬ (০.৭৫x)
  • মাঝারি ডেনসিটির (mdpi) জন্য ৪৮x৪৮ (১.০x বেসলাইন)
  • হাই ডেনসিটির (hdpi) জন্য ৭২x৭২ (১.৫x)
  • অতিরিক্ত-উচ্চ ঘনত্বের (xhdpi) জন্য ৯৬x৯৬ (২.০x)
  • অতিরিক্ত-অতিরিক্ত-উচ্চ ঘনত্বের (xxhdpi) জন্য ১৪৪x১৪৪ (৩.০x)
  • অতিরিক্ত-অতিরিক্ত-অতিরিক্ত-উচ্চ ঘনত্বের (xxxhdpi) জন্য ১৯২x১৯২ (৪.০x)

জেনারেট করা ছবির ফাইলগুলি res/-এর অধীনে উপযুক্ত সাবডিরেক্টরিতে রাখুন:

res/
  drawable-xxxhdpi/
    awesome_image.png
  drawable-xxhdpi/
    awesome_image.png
  drawable-xhdpi/
    awesome_image.png
  drawable-hdpi/
    awesome_image.png
  drawable-mdpi/
    awesome_image.png

তারপর, আপনি যেকোনও সময় @drawable/awesomeimage রেফারেন্স করলে, সিস্টেম স্ক্রিনের ডিপিআই-এর উপর ভিত্তি করে উপযুক্ত বিটম্যাপ বেছে নেয়। আপনি যদি সেই ডেনসিটির জন্য ডেনসিটি-নির্দিষ্ট রিসোর্স প্রদান না করেন, তাহলে সিস্টেম পরবর্তী-সেরা ম্যাচটি খুঁজে বের করে এবং স্ক্রিনে ফিট করার জন্য এটিকে স্কেল করে।

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

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

মিপম্যাপ ডিরেক্টরিতে অ্যাপ আইকন রাখুন

অন্যান্য বিটম্যাপ অ্যাসেটের মতো, আপনার অ্যাপ আইকনের ঘনত্ব-নির্দিষ্ট ভার্সন আপনাকে প্রদান করতে হবে। তবে, কিছু অ্যাপ লঞ্চার আপনার অ্যাপ আইকনকে ডিভাইসের ডেনসিটি বাকেট অনুযায়ী যতটা বড় দেখানোর কথা তার থেকে ২৫% পর্যন্ত বড় দেখায়।

যেমন, কোনও ডিভাইসের ডেনসিটি বাকেট xxhdpi হলে এবং আপনার দেওয়া সবচেয়ে বড় অ্যাপ আইকন drawable-xxhdpi-এ থাকলে, অ্যাপ লঞ্চার এই আইকনকে বড় করে দেখায়, যার ফলে এটি কম স্পষ্ট দেখায়।

এটি এড়াতে, আপনার সব অ্যাপ আইকন drawable ডিরেক্টরির পরিবর্তে mipmap ডিরেক্টরিতে রাখুন। drawable ডিরেক্টরির মতো নয়, সব mipmap ডিরেক্টরি APK-তে থেকে যায়, এমনকি আপনি ডেনসিটি-নির্দিষ্ট APK তৈরি করলেও। এটি লঞ্চার অ্যাপকে হোম স্ক্রিনে দেখানোর জন্য সেরা রেজোলিউশন আইকন বেছে নিতে দেয়।

res/
  mipmap-xxxhdpi/
    launcher_icon.png
  mipmap-xxhdpi/
    launcher_icon.png
  mipmap-xhdpi/
    launcher_icon.png
  mipmap-hdpi/
    launcher_icon.png
  mipmap-mdpi/
    launcher_icon.png

xxhdpi ডিভাইসের আগের উদাহরণে, আপনি mipmap-xxxhdpi ডিরেক্টরিতে আরও বেশি ডেনসিটি সহ লঞ্চার আইকন দিতে পারেন।

আইকন ডিজাইন সংক্রান্ত নির্দেশিকার জন্য, সিস্টেম আইকন দেখুন।

অ্যাপ আইকন তৈরি করার ব্যাপারে সাহায্য পেতে, Image Asset Studio-এর সাহায্যে অ্যাপ আইকন তৈরি করুন দেখুন।

ঘনত্ব সংক্রান্ত বিরল সমস্যার জন্য পরামর্শ

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

রানটাইমে গ্রাফিক্স ম্যানিপুলেট করার সময় আপনি কীভাবে একাধিক ঘনত্বকে সমর্থন করতে পারেন তা আরও ভালভাবে বুঝতে, বিটম্যাপের জন্য সঠিক স্কেল নিশ্চিত করতে সিস্টেম কীভাবে সাহায্য করে তা আপনাকে জানতে হবে। এটি নিম্নলিখিত উপায়ে করা হয়:

  1. বিটম্যাপ ড্রয়েবেলের মতো রিসোর্সের প্রি-স্কেলিং

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

    আপনি যদি প্রি-স্কেল করা রিসোর্সের ডাইমেনশন অনুরোধ করেন, তাহলে সিস্টেম স্কেলিংয়ের পরে ডাইমেনশন উপস্থাপনকারী মান ফেরত দেয়। যেমন, mdpi স্ক্রিনের জন্য ৫০x৫০ পিক্সেলে ডিজাইন করা বিটম্যাপ hdpi স্ক্রিনে ৭৫x৭৫ পিক্সেলে স্কেল করা হয় (যদি hdpi-এর জন্য কোনও বিকল্প রিসোর্স না থাকে) এবং সিস্টেম সেই অনুযায়ী সাইজ রিপোর্ট করে।

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

    res/drawable-nodpi/icon.png

    সিস্টেম যখন এই ফোল্ডার থেকে icon.png বিটম্যাপ ব্যবহার করে, তখন এটি বর্তমান ডিভাইসের ডেনসিটির উপর ভিত্তি করে এটিকে স্কেল করে না।

  2. পিক্সেল ডাইমেনশন ও কোঅর্ডিনেটের অটো-স্কেলিং

    আপনি ম্যানিফেস্টে android:anyDensity-কে "false"-এ সেট করে অথবা Bitmap-এর জন্য প্রোগ্রাম্যাটিক্যালি inScaled-কে "false"-এ সেট করে প্রি-স্কেলিং ডাইমেনশন ও ছবি বন্ধ করতে পারবেন। এই ক্ষেত্রে, সিস্টেম আঁকার সময় যেকোনও অ্যাবসোলিউট পিক্সেল কোঅর্ডিনেট এবং পিক্সেল ডাইমেনশন ভ্যালু অটো-স্কেল করে। এটি করার উদ্দেশ্য হল, পিক্সেল-ডিফাইন করা স্ক্রিন এলিমেন্টগুলি যাতে বেসলাইন পিক্সেল ডেনসিটিতে (mdpi) দেখানোর সময় প্রায় একই ফিজিক্যাল সাইজে দেখানো হয় তা নিশ্চিত করা। সিস্টেম এই স্কেলিং অ্যাপের জন্য স্বচ্ছভাবে পরিচালনা করে এবং অ্যাপে ফিজিক্যাল পিক্সেল ডাইমেনশনের পরিবর্তে স্কেল করা পিক্সেল ডাইমেনশন রিপোর্ট করে।

    যেমন, ধরুন কোনও ডিভাইসে WVGA হাই-ডেনসিটি স্ক্রিন আছে, যা ৪৮০x৮০০ এবং প্রায় ঐতিহ্যগত HVGA স্ক্রিনের মতো একই সাইজ—কিন্তু এটি এমন একটি অ্যাপ চালাচ্ছে যা প্রি-স্কেলিং বন্ধ করেছে। এই ক্ষেত্রে, স্ক্রিনের ডাইমেনশন সম্পর্কে কোয়েরি করার সময় সিস্টেম অ্যাপকে "মিথ্যা" বলে এবং ৩২০x৫৩৩ রিপোর্ট করে, যা পিক্সেল ঘনত্বের জন্য আনুমানিক mdpi ট্রান্সলেশন।

    তারপর, অ্যাপটি যখন ড্রয়িং অপারেশন করে, যেমন (১০,১০) থেকে (১০০, ১০০) পর্যন্ত একটি আয়তক্ষেত্রকে অবৈধ করা, সিস্টেমটি উপযুক্ত পরিমাণে স্কেল করে স্থানাঙ্কগুলিকে রূপান্তরিত করে এবং আসলে অঞ্চলটিকে (১৫,১৫) থেকে (১৫০, ১৫০) পর্যন্ত অবৈধ করে। আপনার অ্যাপ সরাসরি স্কেল করা বিটম্যাপ ম্যানিপুলেট করলে, এই অমিল অপ্রত্যাশিত আচরণের কারণ হতে পারে, তবে অ্যাপের সেরা পারফর্ম্যান্স নিশ্চিত করার জন্য এটি একটি যুক্তিসঙ্গত ট্রেড-অফ হিসেবে বিবেচিত হয়। আপনি এই ধরনের পরিস্থিতির সম্মুখীন হলে, dp ইউনিটকে পিক্সেল ইউনিটে কনভার্ট করুন নিবন্ধটি পড়ুন।

    সাধারণত, আপনি প্রি-স্কেলিং বন্ধ করেন না। একাধিক স্ক্রিন সাপোর্ট করার সবচেয়ে ভালো উপায় হল এই পৃষ্ঠায় বর্ণিত প্রাথমিক কৌশলগুলি অনুসরণ করা।

আপনার অ্যাপ যদি বিটম্যাপ ম্যানিপুলেট করে বা অন্য কোনও উপায়ে স্ক্রিনে সরাসরি পিক্সেলের সাথে ইন্টার‍্যাক্ট করে, তাহলে বিভিন্ন পিক্সেল ডেনসিটি সাপোর্ট করার জন্য আপনাকে অতিরিক্ত পদক্ষেপ নিতে হতে পারে। যেমন, আপনি যদি টাচ জেসচারে সাড়া দিতে গিয়ে আঙুল কতগুলি পিক্সেল অতিক্রম করছে তা গণনা করেন, তাহলে আপনাকে আসল পিক্সেলের পরিবর্তে উপযুক্ত density-independent pixel ভ্যালু ব্যবহার করতে হবে, তবে আপনি dp ও px ভ্যালুর মধ্যে কনভার্ট করতে পারবেন।

সব পিক্সেল ডেনসিটিতে পরীক্ষা করুন

বিভিন্ন পিক্সেল ডেনসিটি সহ একাধিক ডিভাইসে আপনার অ্যাপ পরীক্ষা করুন যাতে আপনি নিশ্চিত করতে পারেন যে আপনার UI স্কেল সঠিকভাবে কাজ করছে। সম্ভব হলে ফিজিক্যাল ডিভাইসে পরীক্ষা করা; বিভিন্ন পিক্সেল ঘনত্বের জন্য ফিজিক্যাল ডিভাইসে অ্যাক্সেস না থাকলে Android এমুলেটর ব্যবহার করুন।

আপনি যদি ফিজিক্যাল ডিভাইসে টেস্ট করতে চান কিন্তু ডিভাইস কিনতে না চান, তাহলে Google ডেটা সেন্টারে ডিভাইস অ্যাক্সেস করতে Firebase Test Lab ব্যবহার করতে পারেন।