সিস্টেম বারগুলি কাস্টমাইজ করুন

সিস্টেম বার কাস্টমাইজ করতে, UI কম্পোনেন্টগুলোতে XML কনফিগারেশন এবং ড্যাগার মডিউলের সমন্বিত ব্যবহার করুন।

সিস্টেম বারের আচরণ সংজ্ঞায়িত করুন

একটি সিস্টেম বার নির্ধারণ করতে, এর চেহারা ও অ্যানিমেশন ঠিক করার জন্য একটি XML ফাইলে <SystemBar> ট্যাগটি ব্যবহার করুন। এই XML ফাইলটি একটি রানটাইম রিসোর্স ওভারলে (RRO)-এর অংশ।

সিস্টেমবার ট্যাগ অ্যাট্রিবিউট

সিস্টেম বার কনফিগারেশনের মূল উপাদান হলো <SystemBar> , যা নিম্নলিখিত অ্যাট্রিবিউটগুলো সমর্থন করে:

বৈশিষ্ট্য অবস্থা বর্ণনা
id প্রয়োজনীয় সিস্টেম বারের জন্য অনন্য রিসোর্স আইডি। উদাহরণস্বরূপ, @id/my_custom_status_bar
type প্রয়োজনীয় সিস্টেম বারের ধরন নির্দিষ্ট করে, যা হয় status অথবা navigation
barZOrder প্রয়োজনীয়

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

  • যদি আপনি কোনো হেডস আপ নোটিফিকেশনের উপরে একটি সিস্টেম বার প্রদর্শন করেন, তাহলে এই মানটি অবশ্যই 10 এর বেশি হতে হবে।
  • ওভারল্যাপিং সিস্টেম বারগুলোর Z-অর্ডার একই হতে পারে না।
defaultVariant প্রয়োজনীয় সিস্টেম বার চালু করার সময় ডিফল্টরূপে প্রযোজ্য <Variant> -এর আইডি।
displayId ঐচ্ছিক সিস্টেম বার চালু করার সময় ডিফল্টরূপে প্রযোজ্য <Variant> -এর আইডি।
hideForKeyboard ঐচ্ছিক

সফটওয়্যার কীবোর্ড সক্রিয় থাকাকালীন সিস্টেম বার স্বয়ংক্রিয়ভাবে লুকাবে কিনা, তা নির্দেশ করার জন্য বুলিয়ান মান true বা false । এই অ্যাট্রিবিউটের ডিফল্ট মান false

যখন এই অ্যাট্রিবিউটটি ' true হবে, তখন আপনাকে সিস্টেম বারের জন্য অবশ্যই _System_Show_Panel এবং _System_Hide_Panel ট্রানজিশনগুলো প্রদান করতে হবে।

dragOpenNotification ঐচ্ছিক

সিস্টেম বার স্বয়ংক্রিয়ভাবে নোটিফিকেশন প্যানেল খুলবে কিনা, তা নির্দেশ করার জন্য বুলিয়ান মান হলো true বা false । এই অ্যাট্রিবিউটের ডিফল্ট মান হলো false

dragCloseNotification ঐচ্ছিক

সিস্টেম বার স্বয়ংক্রিয়ভাবে নোটিফিকেশন প্যানেলটি বন্ধ করবে কিনা, তা নির্দেশ করার জন্য বুলিয়ান মান হলো true বা false । এই অ্যাট্রিবিউটের ডিফল্ট মান হলো false

সিস্টেম বার আইডি এবং প্রকার

TopCarSystemBar , BottomCarSystemBar , LeftCarSystemBar , এবং RightCarSystemBar id ভ্যালু হিসেবে ব্যবহার করা থেকে বিরত থাকুন। সিস্টেম পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্য রক্ষার জন্য এই আইডিগুলো সংরক্ষিত রাখে, এবং এগুলোর ব্যবহার অপ্রত্যাশিত আচরণের কারণ হতে পারে।

বেসিক টপ স্ট্যাটাস বার এবং বটম নেভিগেশন বার কনফিগারেশনের জন্য, type অ্যাট্রিবিউটের ভ্যালু হিসেবে যথাক্রমে status এবং nav ব্যবহার করুন।

আপনি যদি এই আইডিগুলো ব্যবহার করেন, তাহলে ‘Provide a system bar UI with Dagger’ শিরোনামের অংশটি এড়িয়ে যেতে পারেন।

<Variant>
ভিজ্যুয়াল স্টেট নির্ধারণ করে। আরও জানতে, ‘ভিজ্যুয়াল স্টেট ডিজাইন করতে ভ্যারিয়েন্টের ব্যবহার’ দেখুন। <SystemBar> ট্যাগের মধ্যে এক বা একাধিক <Variant> ট্যাগ নির্ধারণ করুন। প্রতিটি ভ্যারিয়েন্ট একটি স্বতন্ত্র ভিজ্যুয়াল স্টেটকে প্রতিনিধিত্ব করে এবং এতে এমন প্রোপার্টি থাকে যা সেই স্টেটে সিস্টেম বারের চেহারা নিয়ন্ত্রণ করে।
<Visibility isVisible="true|false">
সিস্টেম বারের দৃশ্যমানতা নিয়ন্ত্রণ করে। isVisible বুলিয়ানটি নির্দেশ করে যে সিস্টেম বারটি দৃশ্যমান হবে কি না।
<Alpha alpha="float_value">
সিস্টেম বারের স্বচ্ছতা নিয়ন্ত্রণ করে। alpha মান 0.0 (সম্পূর্ণ স্বচ্ছ) এবং 1.0 (সম্পূর্ণ অস্বচ্ছ)-এর মধ্যে থাকে।
<Bounds .../>

সিস্টেম বারের অবস্থান এবং আকার নির্ধারণ করে। <SystemBar> এলিমেন্টের ক্ষেত্রে, এর সীমানা অবশ্যই ডিসপ্লের অন্তত একটি প্রান্তকে (বাম, উপর, ডান বা নীচে) স্পর্শ করতে হবে। এর অ্যাট্রিবিউটগুলো হলো:

  • left , top , right , bottom : পরম স্থানাঙ্ক।
  • width , height : মাত্রা।
  • leftOffset , topOffset , rightOffset , bottomOffset : আয়তক্ষেত্রটির কেন্দ্রের দিকে অফসেট।
<Corner radius="dimen"/>

সিস্টেম বারের কোণার ব্যাসার্ধ নির্ধারণ করে। radius ক্ষেত্রে, কোণার ব্যাসার্ধের মাত্রা লিখুন।

<Insets .../>

সিস্টেম বারের জন্য ইনসেট নির্ধারণ করে। অ্যাট্রিবিউটগুলো হলো left , top , right , এবং bottom । প্রতিটি অ্যাট্রিবিউটের জন্য, ইনসেটগুলোর একটি ডাইমেনশন ভ্যালু লিখুন।

<Gravity .../>

সিস্টেম বারের বিষয়বস্তুর গুরুত্ব নির্ধারণ করে। আরও জানতে, সোর্স কোডে HunTagXmlParserKt.GRAVITY_TAG দেখুন।

  • আপনি যখন অভিকর্ষের কোনো মান উল্লেখ করেন না, তখন সিস্টেমটি অভ্যন্তরীণভাবে তা গণনা করে নেয়।
  • সমর্থিত মানগুলি হলো TOP , BOTTOM , LEFT , RIGHT , CENTER , CENTER_HORIZONTAL , CENTER_VERTICAL এবং FILL_HORIZONTAL এর সমন্বয়, যেখানে প্রতিটি মান একটি | চিহ্ন দ্বারা পৃথক করা থাকে।

মাত্রার একক

px , dp (বা dip ), % , অথবা dimension , integer , fraction , string , বা attribute রিসোর্সের রেফারেন্স ব্যবহার করে মাত্রা নির্দিষ্ট করুন।

রূপান্তর: বিভিন্ন রূপের মধ্যে অ্যানিমেট করুন

আরও জানতে, ‘ট্রানজিশন কনফিগার করুন’ দেখুন। সিস্টেম বারটি কীভাবে বিভিন্ন রূপের মধ্যে অ্যানিমেট করবে তা নির্ধারণ করতে <Transitions> ব্লকটি ব্যবহার করুন:

আইটেম ট্যাগ অ্যাট্রিবিউট
<Transition> fromVariant , toVariant , onEvent , onEventTokens , animator , duration , delay , interpolator
<Transitions> defaultDuration , defaultInterpolator

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

স্কেলেবল UI একটি সিস্টেম বার লুকানোর (বা দেখানোর) জন্য ইভেন্ট পাঠাতে থাকে, যাতে অন্যান্য প্যানেলগুলো প্রয়োজন অনুযায়ী সাড়া দিতে পারে। অন্যদিকে, hideForKeyboard অ্যাট্রিবিউটের সঠিক কার্যকারিতার জন্য সিস্টেম বার লুকানো ও দেখানোর ট্রানজিশন অবশ্যই প্রদান করতে হবে। এই নমুনা XML কাঠামোটি বিবেচনা করুন:

<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" hideForKeyboard="true">
    <Variant id="@+id/default_variant">
        <Bounds top="0px" left="0px" right="100%" height="100px"/>
        <Visibility isVisible="true"/>
    </Variant>
    <Variant id="@+id/hidden_variant" parent="@id/default_variant">
        <Visibility isVisible="false"/>
    </Variant>
    <Transitions>
        <Transition onEvent="_System_Show_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/default_variant"/>
        <Transition onEvent="_System_Hide_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/hidden_variant"/>
    </Transitions>
</SystemBar>

ড্যাগার দিয়ে একটি সিস্টেম বার UI প্রদান করুন

XML-এ সিস্টেম বার সংজ্ঞায়িত করার পরে, প্রকৃত View এবং Window প্রদান করুন। এটি করার জন্য, ডিফল্ট ড্যাগার মডিউল, CarSystemBarModule.java তে একটি অ্যাপ্লিকেশন ওভাররাইড প্রয়োগ করুন। উদাহরণস্বরূপ:

import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;

import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;

@Module
public abstract class MySystemBarModule extends CarSystemBarModule {

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
        return new CarSystemBarViewSupplierUsingLayout(
            R.layout.my_custom_status_bar, // provisioned layout
            R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
        );
    }

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
        return new CarSystemBarWindowSupplierUsingLayout(
            R.layout.my_navigation_bar_window, // Can reuse existing window layouts
            R.id.my_custom_bar_window // The ID that will be assigned to the window
        );
    }
}

SystemUI ওভাররাইডে একটি ড্যাগার মডিউল তৈরি করুন

আপনার কাস্টম লেআউট রিসোর্সগুলো ইনফ্লেট করতে, CarSystemBarViewSupplierUsingLayout এবং CarSystemBarWindowSupplierUsingLayout ক্লাসগুলো ব্যবহার করুন।

আপনার নিজস্ব সরবরাহকারী যুক্ত করার জন্য একটি ড্যাগার মডিউল তৈরি করুন। @StringKey অবশ্যই আপনার <SystemBar> XML ট্যাগের id এর সাথে মিলতে হবে।

CarSystemBarModule ওভাররাইড করতে, এই কোড নমুনাটি দেখুন:

import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;

import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;

@Module
public abstract class MySystemBarModule extends CarSystemBarModule {

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
        return new CarSystemBarViewSupplierUsingLayout(
            R.layout.my_custom_status_bar, // provisioned layout
            R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
        );
    }

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
        return new CarSystemBarWindowSupplierUsingLayout(
            R.layout.my_navigation_bar_window, // Can reuse existing window layouts
            R.id.my_custom_bar_window // The ID that will be assigned to the window
        );
    }
}

সিস্টেম-স্তরের কনফিগারেশন তৈরি করতে একটি RRO ব্যবহার করুন।

আপনার RRO-এর res/values/config.xml ফাইলে এমন কয়েকটি সিস্টেম-স্তরের কনফিগারেশন সেট করুন যা সিস্টেম বারগুলিকে প্রভাবিত করে।

লিগ্যাসি সিস্টেম বারগুলি নিষ্ক্রিয় করুন

Scalable UI-এর সাথে দ্বন্দ্ব এড়াতে, নিম্নলিখিত ফ্ল্যাগগুলিকে false এ সেট করে লিগ্যাসি সিস্টেম বার কনফিগারেশনগুলি নিষ্ক্রিয় করুন:

<resources>
    <bool name="config_enableTopSystemBar">false</bool>
    <bool name="config_enableBottomSystemBar">false</bool>
    <bool name="config_enableLeftSystemBar">false</bool>
    <bool name="config_enableRightSystemBar">false</bool>
</resources>

গোপনীয়তা সূচকের অবস্থান

config_privacyIndicatorLocation স্ট্রিং রিসোর্সটি নির্দিষ্ট করে যে কোন সিস্টেম বার প্রাইভেসি ইন্ডিকেটরগুলো হোস্ট করে। এর মান অবশ্যই একটি <SystemBar> এর id নাম হতে হবে।

<resources>
    <!-- "my_custom_status_bar" corresponds to the android:id name of a SystemBar -->
    <string name="config_privacyIndicatorLocation">my_custom_status_bar</string>
</resources>

ড্র্যাগ ইভেন্ট লিসেনার

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

সুপারিশকৃত: এক্সএমএল-চালিত আবিষ্কার (স্কেলেবল ইউআই)

আপনার ওভারলে XML-এর ভিতরে <SystemBar> ট্যাগে সরাসরি dragOpenNotification এবং dragCloseNotification অ্যাট্রিবিউটগুলো ব্যবহার করুন:

<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" dragOpenNotification="true">
    <Variant id="@+id/default_variant">
        <Bounds top="0px" left="0px" right="100%" height="100px"/>
        <Visibility isVisible="true"/>
    </Variant>
</SystemBar>

লিগ্যাসি: রিসোর্স অ্যারে (ফলব্যাক)

আপনি যদি একটি নন-স্কেলেবল UI বিল্ড রক্ষণাবেক্ষণ করেন অথবা ব্যাকওয়ার্ড-কম্প্যাটিবল ডিভাইসগুলির জন্য লিসেনার নির্দিষ্ট করার প্রয়োজন হয়, তাহলে আপনার RRO-এর res/values/config.xml এ লিগ্যাসি string-array পদ্ধতিটি ব্যবহার করুন। এই string-array রিসোর্সগুলি নির্দিষ্ট করে যে কোন সিস্টেম বারগুলি ড্র্যাগ ইভেন্টের জন্য লিসেন করবে। উদাহরণস্বরূপ, নোটিফিকেশন প্যানেল খোলার জন্য। প্রতিটি <item> হলো একটি সিস্টেম বারের id নাম।

  • config_registerHvacDragCloseListener
  • config_notificationDragOpenListener
  • config_notificationDragCloseListener

উদাহরণস্বরূপ:

<resources>
    <string-array name="config_notificationDragOpenListener" translatable="false">
        <item>my_custom_status_bar</item>
    </string-array>
</resources>

নির্মাণ এবং স্থাপন করুন

একটি স্ট্যাটাস বার তৈরি এবং স্থাপন করতে:

  1. আপনার পরিবর্তিত SystemUI ওভাররাইড অ্যাপ্লিকেশনটি দিয়ে ডিভাইসটি ফ্ল্যাশ করুন।

  2. আপনার RRO প্রজেক্ট কম্পাইল করতে অ্যান্ড্রয়েড বিল্ড সিস্টেম ( m ) ব্যবহার করুন।

  3. আপনার অ্যান্ড্রয়েড অটোমোটিভ ডিভাইসে তৈরি করা RRO APK-টি স্থাপন করুন। adb install ব্যবহার করুন অথবা আপনার RRO সহ একটি সম্পূর্ণ বিল্ড ফ্ল্যাশ করুন।