জানালা ব্যবস্থাপনা

ChromeOS একাধিক উইন্ডোতে Android অ্যাপ সমর্থন করে। সিস্টেম অ্যাপগুলিকে উইন্ডো পাত্রে রেন্ডার করে যার আকার ডিভাইসের ফর্ম ফ্যাক্টর দ্বারা নির্ধারিত হয়, যেমন চিত্র 1 এ দেখানো হয়েছে।

চিত্র 1. বিভিন্ন ডিভাইসে একটি অ্যাপ উইন্ডো।

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

এই পৃষ্ঠাটি দেখায় কিভাবে আপনার অ্যাপের উইন্ডো সঠিকভাবে লঞ্চ হয়, মসৃণভাবে আকার পরিবর্তন করে এবং এর আকার পরিবর্তন হলে এর সমস্ত বিষয়বস্তু প্রদর্শন করে।

প্রাথমিক লঞ্চের আকার

অ্যাপগুলি নিম্নলিখিত উপায়ে তাদের প্রাথমিক লঞ্চের আকারের জন্য অনুরোধ করতে পারে:

  • শুধুমাত্র ডেস্কটপ পরিবেশে লঞ্চের আকার ব্যবহার করুন। এটি আপনাকে সঠিক সীমানা এবং অভিযোজন দিতে উইন্ডো ম্যানেজারকে সাহায্য করে। ডেস্কটপ মোডে ব্যবহার করার সময় একটি পছন্দ নির্দেশ করতে, <activity> এর ভিতরে নিম্নলিখিত মেটা ট্যাগগুলি যোগ করুন:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • স্ট্যাটিক লঞ্চ সীমানা ব্যবহার করুন. নিম্নলিখিত উদাহরণের মতো একটি "নির্দিষ্ট" শুরুর আকার নির্দিষ্ট করতে আপনার কার্যকলাপের ম্যানিফেস্ট এন্ট্রির ভিতরে <layout> ব্যবহার করুন:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • গতিশীল লঞ্চ সীমানা ব্যবহার করুন. একটি নতুন কার্যকলাপ তৈরি করার সময় একটি কার্যকলাপ ActivityOptions.setLaunchBounds(Rect) তৈরি এবং ব্যবহার করতে পারে। একটি খালি আয়তক্ষেত্র নির্দিষ্ট করে, আপনার অ্যাপটি সর্বাধিক করা যেতে পারে।

উইন্ডোর আকার পরিবর্তন করুন

ChromeOS-এ, ব্যবহারকারীরা স্বাভাবিক উপায়ে একটি অ্যাপের উইন্ডোর আকার পরিবর্তন করতে পারেন: নীচের-ডান কোণে টেনে নিয়ে, যেমন চিত্র 2-এ দেখানো হয়েছে।

চিত্র 2. একটি পরিবর্তনযোগ্য অ্যাপ উইন্ডো।

View ক্লাস ব্যবহার করার সময় উইন্ডোর আকার পরিবর্তন করার জন্য দুটি বিকল্প রয়েছে:

  • onConfigurationChanged(..) কল করে কনফিগারেশন পরিবর্তনের জন্য গতিশীলভাবে সাড়া দিন। উদাহরণ হিসেবে, আপনি কার্যকলাপের ম্যানিফেস্টে android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" যোগ করতে পারেন। কনফিগারেশন পরিবর্তনগুলি পরিচালনা করার বিষয়ে আরও তথ্যের জন্য, কনফিগারেশন পরিবর্তনগুলি পরিচালনা করুন।
  • সিস্টেমের কার্যকলাপ পুনরায় আরম্ভ করা যাক. এই ক্ষেত্রে, onSaveInstanceState প্রয়োগ করুন এবং পূর্ববর্তী সংরক্ষিত অবস্থা পুনরুদ্ধার করতে ViewModel আর্কিটেকচার উপাদান ব্যবহার করুন।

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

জানালার মাত্রা

আপনার ক্রিয়াকলাপগুলি যখনই তারা শুরু করে তখন তাদের উইন্ডোর মাত্রাগুলি পড়তে দিন এবং বর্তমান কনফিগারেশন অনুসারে তাদের বিষয়বস্তু সাজান৷

বর্তমান কনফিগারেশন নির্ধারণ করতে, বর্তমান কার্যকলাপে getResources().getConfiguration() কল করুন। ব্যাকগ্রাউন্ড অ্যাক্টিভিটি বা সিস্টেম রিসোর্সের কনফিগারেশন ব্যবহার করবেন না। ব্যাকগ্রাউন্ড কার্যকলাপের একটি মাপ নেই, এবং সিস্টেম কনফিগারেশনে বিরোধপূর্ণ আকার এবং অভিযোজন সহ একাধিক উইন্ডো থাকতে পারে, তাই কোন ব্যবহারযোগ্য ডেটা বের করা যাবে না।

মনে রাখবেন যে উইন্ডোর আকার এবং পর্দার আকার একই নয়। DP-তে উইন্ডোর আকার পেতে, Activity.getResources().getConfiguration().screenWidth এবং Activity.getResources().getConfiguration().screenHeight ব্যবহার করুন। আপনি সম্ভবত পর্দা আকার ব্যবহার করার প্রয়োজন হবে না.

বিষয়বস্তুর সীমানা

আকার পরিবর্তন করার পরে একটি উইন্ডোর বিষয়বস্তুর সীমা পরিবর্তিত হতে পারে। উদাহরণস্বরূপ, উইন্ডোটির মধ্যে যে এলাকাটি অ্যাপ দ্বারা ব্যবহৃত হয় সেটি পরিবর্তন হতে পারে যদি উইন্ডোটি স্ক্রিনে ফিট করার জন্য খুব বড় হয়ে যায়। এই নির্দেশিকা অনুসরণ করুন:

  • অ্যাপ্লিকেশানগুলি যেগুলি Android এর লেআউট প্রক্রিয়া ব্যবহার করে সেগুলি স্বয়ংক্রিয়ভাবে উপলব্ধ স্থানে বিন্যস্ত হয়৷
  • স্থানীয় অ্যাপ্লিকেশানগুলিকে উপলব্ধ এলাকা পড়তে হবে এবং অ্যাক্সেসযোগ্য UI উপাদানগুলি এড়াতে আকার পরিবর্তনগুলি নিরীক্ষণ করতে হবে৷ এই পৃষ্ঠের জন্য প্রাথমিক উপলব্ধ আকার নির্ধারণ করতে নিম্নলিখিত পদ্ধতিগুলি কল করুন:

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    একটি পর্যবেক্ষক ব্যবহার করে ক্রমাগত পর্যবেক্ষণ করা যেতে পারে:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • view.addOnLayoutChangeListener(findViewById(android.R.id.content)) এ একজন শ্রোতা যোগ করুন

    যদি অ্যাপটি তার আর্টওয়ার্ককে প্রাক-স্কেল করে, প্রতিবার রেজোলিউশন পরিবর্তন করার সময় তা করুন।

ফ্রি-ফর্ম রিসাইজ করা

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

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

পুরো স্ক্রীন মোডে

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

স্ক্রীন অভিযোজন

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

কিছু অ্যান্ড্রয়েড অ্যাপ্লিকেশান অনুমান করে যে যখন একটি ডিভাইস পোর্ট্রেট মোডে রাখা হয়, তখন ঘূর্ণন মানটি হয় Surface.ROTATION_0 । এটি বেশিরভাগ অ্যান্ড্রয়েড ডিভাইসের জন্য সত্য হতে পারে। যাইহোক, যখন অ্যাপটি একটি নির্দিষ্ট ARC মোডে থাকে, তখন পোর্ট্রেট ওরিয়েন্টেশনের ঘূর্ণন মান Surface.ROTATION_0 নাও হতে পারে।ROTATION_0।

অ্যাক্সিলোমিটার বা অনুরূপ সেন্সর পড়ার সময় একটি সঠিক ঘূর্ণন মান পেতে, Display.getRotation() পদ্ধতি ব্যবহার করুন এবং সেই অনুযায়ী অক্ষ অদলবদল করুন।

মূল কার্যকলাপ এবং অভিযোজন

একটি Chromebook উইন্ডোতে অ্যাক্টিভিটি উইন্ডোর একটি স্ট্যাক থাকে। স্ট্যাকের প্রতিটি উইন্ডোর আকার এবং অভিযোজন একই।

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

ডিভাইস মোড এখানে একটি প্রভাব আছে: ট্যাবলেট মোডে, অভিযোজন লক করা হয় না, এবং প্রতিটি উইন্ডো তার নিজস্ব অভিযোজন সংরক্ষণ করে, যেমনটি Android এ স্বাভাবিক।

ওরিয়েন্টেশন নির্দেশিকা

অভিযোজন পরিচালনার জন্য এই নির্দেশিকা অনুসরণ করুন:

  • আপনি যদি শুধুমাত্র একটি অভিযোজন সমর্থন করেন, ম্যানিফেস্টে তথ্য যোগ করুন যাতে উইন্ডো ম্যানেজার অ্যাপ্লিকেশন শুরু করার আগে এটি সম্পর্কে জানেন। আপনি যখন ওরিয়েন্টেশন নির্দিষ্ট করেন, সম্ভব হলে সেন্সর ওরিয়েন্টেশনও নির্দিষ্ট করুন। ক্রোমবুকগুলি প্রায়শই রূপান্তরযোগ্য হয় এবং একটি উল্টা-পাল্টা অ্যাপ একটি খারাপ ব্যবহারকারীর অভিজ্ঞতা৷
  • একটি একক নির্বাচিত অভিযোজন সঙ্গে থাকার চেষ্টা করুন. ম্যানিফেস্টে একটি ওরিয়েন্টেশনের অনুরোধ করা এড়িয়ে চলুন এবং পরবর্তীতে অন্য একটি প্রোগ্রামেটিক সেট করুন।
  • উইন্ডোর আকারের উপর ভিত্তি করে অভিযোজন পরিবর্তনে সতর্ক থাকুন। ব্যবহারকারী একটি ছোট পোর্ট্রেট-আকারের উইন্ডোতে আটকে যেতে পারে এবং একটি বড় ল্যান্ডস্কেপ উইন্ডোতে ফিরে আসতে সক্ষম হবে না।
  • সমস্ত উপলব্ধ লেআউটগুলির মধ্যে টগল করার জন্য Chrome-এ উইন্ডো নিয়ন্ত্রণ রয়েছে৷ সঠিক অভিযোজন বিকল্পটি বেছে নিয়ে, আপনি নিশ্চিত করতে পারেন যে অ্যাপটি চালু করার পরে ব্যবহারকারীর সঠিক বিন্যাস রয়েছে। যদি একটি অ্যাপ পোর্ট্রেট এবং ল্যান্ডস্কেপে উপলব্ধ থাকে, সম্ভব হলে এটিকে ল্যান্ডস্কেপে ডিফল্ট করুন। এই বিকল্পটি সেট করার পরে, এটি প্রতি অ্যাপের ভিত্তিতে মনে রাখা হয়।
  • অপ্রয়োজনীয় অভিযোজন পরিবর্তন এড়াতে চেষ্টা করুন। উদাহরণস্বরূপ, যদি অ্যাক্টিভিটি ওরিয়েন্টেশনটি পোর্ট্রেট হয়, কিন্তু অ্যাপটি রানটাইমে setRequestedOrientation(LANDSCAPE) কল করে, এটি অপ্রয়োজনীয় উইন্ডোর আকার পরিবর্তন করে, যা ব্যবহারকারীর জন্য বিরক্তিকর এবং অ্যাপটি এটি পরিচালনা করতে পারে না এমন অ্যাপটি পুনরায় চালু করতে পারে। স্থিতিবিন্যাস একবার সেট করা ভাল, উদাহরণস্বরূপ, ম্যানিফেস্টে, এবং শুধুমাত্র প্রয়োজন হলে এটি পরিবর্তন করুন।

অন্যান্য বিবেচ্য বিষয়

ChromeOS-এ অ্যান্ড্রয়েড অ্যাপগুলির সাথে কাজ করার সময় এখানে কিছু অন্যান্য বিষয় বিবেচনা করতে হবে:

  • আপনার কার্যকলাপের onDestroy পদ্ধতিতে finish() কল করবেন না। এর ফলে অ্যাপটি পুনরায় আকারে বন্ধ হয়ে যায় এবং পুনরায় চালু হয় না।
  • উইন্ডোর ধরনগুলি ব্যবহার করবেন না যা সামঞ্জস্যপূর্ণ নয়, যেমন TYPE_KEYGUARD এবং TYPE_APPLICATION_MEDIA
  • পূর্বে বরাদ্দ করা বস্তুগুলি ক্যাশে করে দ্রুত কার্যকলাপ পুনরায় আরম্ভ করুন।
  • আপনি যদি ব্যবহারকারী আপনার অ্যাপের আকার পরিবর্তন করতে না চান, তাহলে আপনার ম্যানিফেস্ট ফাইলে android:resizeableActivity=false উল্লেখ করুন।
  • আপনার অ্যাপটি উইন্ডোর আকারের পরিবর্তনগুলি যথাযথভাবে পরিচালনা করে তা নিশ্চিত করতে পরীক্ষা করুন।