সমর্থন প্রদর্শন cutouts

কম্পোজ পদ্ধতিটি চেষ্টা করুন
অ্যান্ড্রয়েডের জন্য Jetpack Compose হলো প্রস্তাবিত UI টুলকিট। Compose-এ কীভাবে ডিসপ্লে কাটআউট নিয়ে কাজ করতে হয় তা জানুন।

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

অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) এবং এর পরবর্তী সংস্করণে চালিত ডিভাইসগুলোতে ডিসপ্লে কাটআউট সমর্থন করে। তবে, ডিভাইস নির্মাতারা অ্যান্ড্রয়েড ৮.১ বা এর পূর্ববর্তী সংস্করণে চালিত ডিভাইসগুলোতেও ডিসপ্লে কাটআউট সমর্থন করতে পারেন।

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

উপরের-কেন্দ্রীয় ডিসপ্লে কাটআউটের একটি উদাহরণ দেখানো ছবি।
চিত্র ১.১ ডিসপ্লে কাটআউট।

আপনার অ্যাপ কীভাবে কাটআউট এলাকাগুলো পরিচালনা করবে তা বেছে নিন

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

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

  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT : যখন ডিসপ্লে কাটআউটটি একটি সিস্টেম বারের মধ্যে থাকে, তখন কন্টেন্ট কাটআউট এলাকার মধ্যে রেন্ডার হয়। অন্যথায়, উইন্ডোটি ডিসপ্লে কাটআউটের উপর ওভারল্যাপ করে না; উদাহরণস্বরূপ, ল্যান্ডস্কেপ মোডে প্রদর্শিত হলে কন্টেন্ট লেটারবক্সড হতে পারে। যদি আপনার অ্যাপ SDK 35 টার্গেট করে, তাহলে নন-ফ্লোটিং উইন্ডোগুলোর জন্য এটিকে ALWAYS হিসেবে গণ্য করা হয়।
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS : কন্টেন্টকে সর্বদা কাটআউট এলাকা পর্যন্ত প্রসারিত হওয়ার অনুমতি দেওয়া হয়। যদি আপনার অ্যাপটি SDK 35 টার্গেট করে এবং একটি Android 15 ডিভাইসে চলে, তাহলে এজ-টু-এজ ডিসপ্লে নিশ্চিত করার জন্য নন-ফ্লোটিং উইন্ডোগুলোর ক্ষেত্রে এটিই একমাত্র অনুমোদিত মোড।
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES : পোর্ট্রেট এবং ল্যান্ডস্কেপ উভয় মোডেই কন্টেন্ট কাটআউট এলাকায় রেন্ডার হয়। ফ্লোটিং উইন্ডোর জন্য এটি ব্যবহার করবেন না। যদি আপনার অ্যাপ SDK 35 টার্গেট করে, তবে নন-ফ্লোটিং উইন্ডোর জন্য এটিকে ALWAYS হিসেবে গণ্য করা হবে।
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER : কন্টেন্ট কখনোই কাটআউট এলাকায় রেন্ডার হয় না। যদি আপনার অ্যাপ SDK 35 টার্গেট করে, তাহলে নন-ফ্লোটিং উইন্ডোগুলোর জন্য এটিকে ALWAYS হিসেবে গণ্য করা হয়।

আপনি প্রোগ্রাম্যাটিকভাবে অথবা আপনার অ্যাক্টিভিটিতে একটি স্টাইল সেট করার মাধ্যমে কাটআউট মোড নির্ধারণ করতে পারেন। নিম্নলিখিত উদাহরণটি অ্যাক্টিভিটিতে LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES অ্যাট্রিবিউটটি প্রয়োগ করার জন্য একটি স্টাইল সংজ্ঞায়িত করে।

<style name="ActivityTheme">
  <item name="android:windowLayoutInDisplayCutoutMode">
    shortEdges <!-- default, shortEdges, or never -->
  </item>
</style>

নিম্নলিখিত বিভাগগুলিতে বিভিন্ন কাটআউট মোডগুলি আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে।

ডিফল্ট আচরণ

যদি আপনার অ্যাপটি SDK 35 টার্গেট করে এবং একটি Android 15 ডিভাইসে চলে, তাহলে LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS হলো ডিফল্ট আচরণ, এবং নন-ফ্লোটিং উইন্ডোগুলোর জন্য LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS হিসেবে ব্যাখ্যা করা হয়।

অন্যথায়, LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT হলো ডিফল্ট।

সংক্ষিপ্ত প্রান্তের কাটআউট এলাকাগুলিতে বিষয়বস্তু রেন্ডার করুন

আপনার অ্যাপটি যদি SDK 35 টার্গেট করে এবং একটি Android 15 ডিভাইসে চলে, তাহলে নন-ফ্লোটিং উইন্ডোগুলোর জন্য LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS হিসেবে ব্যাখ্যা করা হয়।

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

নিচের ছবিটি পোর্ট্রেট মোডে থাকা একটি ডিভাইসের জন্য LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES এর একটি উদাহরণ:

পোর্ট্রেট মোডে থাকাকালীন কাটআউট এলাকায় কন্টেন্ট রেন্ডার হওয়ার একটি ছবি।
চিত্র ২। পোর্ট্রেট মোডে থাকাকালীন কাটআউট এলাকায় কন্টেন্ট রেন্ডার হওয়া।

নিচের ছবিটি ল্যান্ডস্কেপ মোডে থাকা কোনো ডিভাইসের জন্য LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES এর একটি উদাহরণ:

ল্যান্ডস্কেপ মোডে থাকাকালীন কাটআউট এলাকায় কন্টেন্ট রেন্ডার হওয়ার একটি ছবি।
চিত্র ৩। ল্যান্ডস্কেপ মোডে থাকাকালীন কাটআউট এলাকায় কন্টেন্ট রেন্ডার হওয়া।

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

কোণার একটি কাটআউটকে ছোট প্রান্তের উপর অবস্থিত বলে ধরা হয়:

কোণা কাটা একটি ডিভাইস দেখানো ছবি।
চিত্র ৪. একটি কোণা কাটা অংশযুক্ত যন্ত্র।

ডিসপ্লে কাটআউট এলাকায় কখনই কন্টেন্ট রেন্ডার করবেন না।

আপনার অ্যাপটি যদি SDK 35 টার্গেট করে এবং একটি Android 15 ডিভাইসে চলে, তাহলে নন-ফ্লোটিং উইন্ডোগুলোর জন্য LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS হিসেবে ব্যাখ্যা করা হয়।

LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER চালু থাকলে, উইন্ডোটি কখনোই কাটআউট এলাকার সাথে ওভারল্যাপ করতে পারে না।

নিম্নলিখিতটি পোর্ট্রেট মোডে LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER এর একটি উদাহরণ:

পোর্ট্রেট মোডের জন্য LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER দেখানো একটি ছবি।
চিত্র ৫. পোর্ট্রেট মোডের জন্য LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER এর উদাহরণ।

ল্যান্ডস্কেপ মোডে LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER এর একটি উদাহরণ নিচে দেওয়া হলো:

ল্যান্ডস্কেপের জন্য LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER দেখানো একটি ছবি।
চিত্র ৬। ল্যান্ডস্কেপ মোডে LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER এর উদাহরণ।

ডিসপ্লে কাটআউট সাপোর্টের জন্য সর্বোত্তম অনুশীলন

ডিসপ্লে কাটআউট নিয়ে কাজ করার সময় নিম্নলিখিত বিষয়গুলো বিবেচনা করুন:

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

    অনুপযুক্ত ইনসেট সেটআপের কারণে কন্টেন্টের উপরের অংশ কাটা পড়েছে এমন একটি ছবি।
    চিত্র ৭। কন্টেন্টের উপরিপাতন বা কর্তন এড়াতে WindowInsetsCompat ব্যবহার করুন।
  • আপনার অ্যাপটি উইন্ডোর কতটা জায়গা ব্যবহার করছে তা জানতে View.getLocationInWindow() ব্যবহার করুন। অ্যাপটি পুরো উইন্ডো ব্যবহার করছে বলে ধরে নেবেন না এবং View.getLocationOnScreen() ব্যবহার করবেন না।

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

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

    কন্টেন্ট লেটারবক্সড হলে উইন্ডো এবং স্ক্রিনের স্থানাঙ্ক দেখানো একটি ছবি।
    চিত্র ৯। কন্টেন্ট লেটারবক্সড হলে উইন্ডো বনাম স্ক্রিন স্থানাঙ্ক।
  • MotionEvent হ্যান্ডেল করার সময়, একই ধরনের স্থানাঙ্ক সংক্রান্ত সমস্যা এড়াতে MotionEvent.getX() এবং MotionEvent.getY() ব্যবহার করুন। MotionEvent.getRawX() বা MotionEvent.getRawY() ব্যবহার করবেন না।

আপনার কন্টেন্ট কীভাবে রেন্ডার হয় তা পরীক্ষা করুন

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

  1. ডেভেলপার অপশন সক্রিয় করুন।
  2. ডেভেলপার অপশন স্ক্রিনে, ড্রয়িং সেকশন পর্যন্ত স্ক্রল করুন এবং ‘Simulate a display with a cutout’ নির্বাচন করুন।
  3. কাটআউটের ধরণ নির্বাচন করুন।

    এমুলেটরে কীভাবে একটি ডিসপ্লে কাটআউট অনুকরণ করা যায় তা দেখানো একটি ছবি।
    চিত্র ১০। আপনার কন্টেন্ট কীভাবে রেন্ডার হয় তা পরীক্ষা করার জন্য ডেভেলপার অপশন।

অতিরিক্ত সম্পদ