অ্যাপস ডেভেলপ করুন

নিম্নলিখিত উপাদান অ্যাপ্লিকেশন বিকাশকারীদের জন্য.

আপনার অ্যাপ সমর্থন রোটারি করতে, আপনাকে অবশ্যই:

  1. সংশ্লিষ্ট কার্যকলাপ বিন্যাসে একটি FocusParkingView রাখুন।
  2. দৃষ্টিভঙ্গিগুলি নিশ্চিত করুন যা ফোকাসযোগ্য (বা নয়)৷
  3. FocusParkingView ব্যতীত আপনার সমস্ত ফোকাসযোগ্য ভিউ মোড়ানোর জন্য FocusArea ব্যবহার করুন।

আপনি রোটারি-সক্ষম অ্যাপগুলি বিকাশের জন্য আপনার পরিবেশ সেট আপ করার পরে এই প্রতিটি কাজ নীচে বিশদভাবে দেওয়া আছে।

একটি ঘূর্ণমান নিয়ামক সেট আপ করুন

আপনি রোটারি-সক্ষম অ্যাপ্লিকেশানগুলি বিকাশ শুরু করার আগে, আপনার হয় একটি রোটারি কন্ট্রোলার বা একটি স্ট্যান্ড-ইন প্রয়োজন৷ আপনি নীচে বর্ণিত বিকল্প আছে.

এমুলেটর

source build/envsetup.sh && lunch car_x86_64-userdebug
m -j
emulator -wipe-data -no-snapshot -writable-system

এছাড়াও আপনি aosp_car_x86_64-userdebug ব্যবহার করতে পারেন।

এমুলেটেড রোটারি কন্ট্রোলার অ্যাক্সেস করতে:

  1. টুলবারের নীচে তিনটি বিন্দুতে আলতো চাপুন:

    অনুকরণ করা ঘূর্ণমান নিয়ামক অ্যাক্সেস
    চিত্র 1. অনুকরণ করা ঘূর্ণমান নিয়ামক অ্যাক্সেস
  2. বর্ধিত নিয়ন্ত্রণ উইন্ডোতে কার রোটারি নির্বাচন করুন:

    গাড়ি রোটারি নির্বাচন করুন
    চিত্র 2. কার রোটারি নির্বাচন করুন

ইউএসবি কীবোর্ড

  • আপনার ডিভাইসে একটি USB কীবোর্ড প্লাগ করুন যা Android Automotive OS (AAOS) চালায়, কিছু ক্ষেত্রে, এটি অন-স্ক্রীন কীবোর্ডকে দেখাতে বাধা দেয়।
  • একটি userdebug বা eng বিল্ড ব্যবহার করুন.
  • কী ইভেন্ট ফিল্টারিং সক্ষম করুন:
    adb shell settings put secure android.car.ROTARY_KEY_EVENT_FILTER 1
    
  • প্রতিটি কর্মের জন্য সংশ্লিষ্ট কী খুঁজে পেতে নীচের সারণীটি দেখুন:
    চাবি ঘূর্ণমান কর্ম
    প্র বামাবর্তে ঘোরাতে
    ঘড়ির কাঁটার দিকে ঘোরান
    নাজ বাম
    ডি ডান দিকে নাজ
    ডব্লিউ নাজ আপ
    এস নিচে নাজ
    F বা কমা কেন্দ্র বোতাম
    R বা Esc ব্যাক বোতাম

ADB কমান্ড

আপনি রোটারি ইনপুট ইভেন্ট ইনজেকশন করতে car_service কমান্ড ব্যবহার করতে পারেন। এই কমান্ডগুলি Android Automotive OS (AAOS) বা এমুলেটরে চালিত ডিভাইসগুলিতে চালানো যেতে পারে।

car_service কমান্ড রোটারি ইনপুট
adb shell cmd car_service inject-rotary বামাবর্তে ঘোরাতে
adb shell cmd car_service inject-rotary -c true ঘড়ির কাঁটার দিকে ঘোরান
adb shell cmd car_service inject-rotary -dt 100 50 ঘড়ির কাঁটার বিপরীত দিকে একাধিকবার ঘোরান (100 ms আগে এবং 50 ms আগে)
adb shell cmd car_service inject-key 282 নাজ বাম
adb shell cmd car_service inject-key 283 ডান দিকে নাজ
adb shell cmd car_service inject-key 280 নাজ আপ
adb shell cmd car_service inject-key 281 নিচে নাজ
adb shell cmd car_service inject-key 23 কেন্দ্র বোতামে ক্লিক করুন
adb shell input keyevent inject-key 4 ব্যাক বাটনে ক্লিক করুন

OEM ঘূর্ণমান নিয়ামক

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

ফোকাসপার্কিংভিউ

FocusParkingView হল Car UI লাইব্রেরিতে (car-ui-library) একটি স্বচ্ছ দৃশ্য। RotaryService রোটারি কন্ট্রোলার নেভিগেশন সমর্থন করার জন্য এটি ব্যবহার করে। FocusParkingView লেআউটের প্রথম ফোকাসযোগ্য দৃশ্য হতে হবে। এটি অবশ্যই সমস্ত FocusArea বাইরে স্থাপন করা উচিত। প্রতিটি উইন্ডোতে একটি FocusParkingView থাকতে হবে। আপনি যদি ইতিমধ্যেই car-ui-লাইব্রেরি বেস লেআউট ব্যবহার করে থাকেন, যাতে একটি FocusParkingView রয়েছে, তাহলে আপনাকে আর একটি FocusParkingView যোগ করতে হবে না। RotaryPlayground FocusParkingView এর একটি উদাহরণ নীচে দেখানো হয়েছে।

<FrameLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <com.android.car.ui.FocusParkingView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
   <FrameLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"/>
</FrameLayout>

এখানে আপনার একটি FocusParkingView প্রয়োজনের কারণ রয়েছে:

  1. অন্য উইন্ডোতে ফোকাস সেট করা হলে Android স্বয়ংক্রিয়ভাবে ফোকাস সাফ করে না। আপনি যদি আগের উইন্ডোতে ফোকাস সাফ করার চেষ্টা করেন, তাহলে অ্যান্ড্রয়েড সেই উইন্ডোতে একটি ভিউ রিফোকাস করে, যার ফলে দুটি উইন্ডো একই সাথে ফোকাস করা হয়। প্রতিটি উইন্ডোতে একটি FocusParkingView যোগ করলে এই সমস্যার সমাধান হতে পারে। এই দৃশ্যটি স্বচ্ছ এবং এর ডিফল্ট ফোকাস হাইলাইট অক্ষম করা হয়েছে, যাতে এটি ফোকাস করা হোক বা না হোক ব্যবহারকারীর কাছে অদৃশ্য। এটি ফোকাস নিতে পারে যাতে RotaryService ফোকাস হাইলাইটটি সরাতে এটিতে ফোকাস পার্ক করতে পারে।
  2. বর্তমান উইন্ডোতে শুধুমাত্র একটি FocusArea থাকলে, FocusArea এ কন্ট্রোলার ঘোরানোর ফলে RotaryService ফোকাসটিকে ডানদিকের ভিউ থেকে বাম দিকের ভিউতে নিয়ে যায় (এবং এর বিপরীতে)। প্রতিটি উইন্ডোতে এই ভিউ যোগ করলে সমস্যার সমাধান করা যায়। যখন RotaryService নির্ধারণ করে যে ফোকাস টার্গেট হল একটি FocusParkingView , তখন এটি নির্ধারণ করতে পারে যে একটি মোড়ক ঘটতে চলেছে কোন সময়ে এটি ফোকাস না সরানোর মাধ্যমে মোড়ানো এড়িয়ে যায়৷
  3. যখন রোটারি কন্ট্রোল একটি অ্যাপ চালু করে, তখন অ্যান্ড্রয়েড প্রথম ফোকাসযোগ্য দৃশ্যে ফোকাস করে, যা সর্বদা FocusParkingViewFocusParkingView ফোকাস করার জন্য সর্বোত্তম দৃশ্য নির্ধারণ করে এবং তারপর ফোকাস প্রয়োগ করে।

ফোকাসযোগ্য দৃশ্য

RotaryService অ্যান্ড্রয়েড ফ্রেমওয়ার্কের ভিউ ফোকাসের বিদ্যমান ধারণার উপর ভিত্তি করে তৈরি করে, যখন ফোনে ফিজিক্যাল কীবোর্ড এবং ডি-প্যাড ছিল। বিদ্যমান android:nextFocusForward অ্যাট্রিবিউটটি রোটারির জন্য পুনরায় ব্যবহার করা হয়েছে ( FocusArea কাস্টমাইজেশন দেখুন), কিন্তু android:nextFocusLeft , android:nextFocusRight , android:nextFocusUp , এবং android:nextFocusDown নয়।

RotaryService শুধুমাত্র ফোকাসযোগ্য দৃশ্যের উপর ফোকাস করে। কিছু ভিউ, যেমন Button s, সাধারণত ফোকাসযোগ্য। অন্যান্য, যেমন TextView s এবং ViewGroup , সাধারণত হয় না। ক্লিকযোগ্য ভিউ স্বয়ংক্রিয়ভাবে ফোকাসযোগ্য এবং ভিউ স্বয়ংক্রিয়ভাবে ক্লিকযোগ্য হয় যখন তাদের একটি ক্লিক শ্রোতা থাকে। যদি এই স্বয়ংক্রিয় যুক্তির ফলে পছন্দসই ফোকাসযোগ্যতা পাওয়া যায়, তাহলে আপনাকে দৃশ্যের ফোকাসযোগ্যতা স্পষ্টভাবে সেট করতে হবে না। যদি স্বয়ংক্রিয় যুক্তির ফলে কাঙ্ক্ষিত ফোকাসেবিলিটি না হয়, তাহলে android:focusable অ্যাট্রিবিউটটিকে true বা false এ সেট করুন অথবা View.setFocusable(boolean) দিয়ে ভিউয়ের ফোকাসযোগ্যতা প্রোগ্রামেটিকভাবে সেট করুন। RotaryService এর উপর ফোকাস করার জন্য, একটি ভিউ অবশ্যই নিম্নলিখিত প্রয়োজনীয়তাগুলি পূরণ করবে:

  • ফোকাসযোগ্য
  • সক্রিয়
  • দৃশ্যমান
  • প্রস্থ এবং উচ্চতার জন্য অ-শূন্য মান আছে

যদি একটি দৃশ্য এই সমস্ত প্রয়োজনীয়তা পূরণ না করে, উদাহরণস্বরূপ একটি ফোকাসযোগ্য কিন্তু অক্ষম বোতাম, ব্যবহারকারী এটিতে ফোকাস করতে ঘূর্ণমান নিয়ন্ত্রণ ব্যবহার করতে পারবেন না। আপনি যদি অক্ষম দৃশ্যগুলিতে ফোকাস করতে চান তবে android:state_enabled এর পরিবর্তে একটি কাস্টম স্থিতি ব্যবহার করার কথা বিবেচনা করুন যাতে Android এটিকে নিষ্ক্রিয় বিবেচনা করা উচিত বলে নির্দেশ না করে ভিউটি কীভাবে প্রদর্শিত হয় তা নিয়ন্ত্রণ করুন৷ আপনার অ্যাপ ব্যবহারকারীকে জানাতে পারে কেন ট্যাপ করার সময় ভিউ অক্ষম করা হয়। পরবর্তী অধ্যায় ব্যাখ্যা করে কিভাবে এটি করতে হয়।

কাস্টম অবস্থা

একটি কাস্টম অবস্থা যোগ করতে:

  1. আপনার ভিউতে একটি কাস্টম অ্যাট্রিবিউট যোগ করতে। উদাহরণস্বরূপ, CustomView ভিউ ক্লাসে একটি state_rotary_enabled কাস্টম অবস্থা যোগ করতে, ব্যবহার করুন:
    <declare-styleable name="CustomView">
        <attr name="state_rotary_enabled" format="boolean" />
    </declare-styleable>
    
  2. এই অবস্থা ট্র্যাক করতে, অ্যাক্সেসর পদ্ধতি সহ আপনার ভিউতে একটি ইনস্ট্যান্স ভেরিয়েবল যোগ করুন:
    private boolean mRotaryEnabled;
    public boolean getRotaryEnabled() { return mRotaryEnabled; }
    public void setRotaryEnabled(boolean rotaryEnabled) {
        mRotaryEnabled = rotaryEnabled;
    }
    
  3. আপনার ভিউ তৈরি হলে আপনার অ্যাট্রিবিউটের মান পড়তে:
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
    mRotaryEnabled = a.getBoolean(R.styleable.CustomView_state_rotary_enabled);
    
  4. আপনার ভিউ ক্লাসে, onCreateDrawableState() পদ্ধতিটি ওভাররাইড করুন এবং তারপরে উপযুক্ত অবস্থা যোগ করুন। যেমন:
    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        if (mRotaryEnabled) extraSpace++;
        int[] drawableState = super.onCreateDrawableState(extraSpace);
        if (mRotaryEnabled) {
            mergeDrawableStates(drawableState, { R.attr.state_rotary_enabled });
        }
        return drawableState;
    }
    
  5. আপনার ভিউয়ের ক্লিক হ্যান্ডলারকে তার অবস্থার উপর নির্ভর করে ভিন্নভাবে পারফর্ম করুন। উদাহরণস্বরূপ, ক্লিক হ্যান্ডলার কিছুই করতে পারে না বা mRotaryEnabled false হলে এটি একটি টোস্ট পপ আপ করতে পারে।
  6. বোতামটিকে নিষ্ক্রিয় দেখাতে, আপনার দৃশ্যের পটভূমিতে আঁকার যোগ্য, android:state_enabled এর পরিবর্তে app:state_rotary_enabled ব্যবহার করুন। আপনার যদি এটি ইতিমধ্যে না থাকে তবে আপনাকে যোগ করতে হবে:
    xmlns:app="http://schemas.android.com/apk/res-auto"
    
  7. যদি আপনার ভিউ কোনো লেআউটে অক্ষম করা থাকে, তাহলে android:enabled="false" app:state_rotary_enabled="false" দিয়ে প্রতিস্থাপন করুন এবং তারপরে উপরের মতো app নামস্থান যোগ করুন।
  8. যদি আপনার ভিউ প্রোগ্রাম্যাটিকভাবে অক্ষম করা থাকে, তাহলে setEnabled() এর কলগুলিকে setRotaryEnabled() এ কল দিয়ে প্রতিস্থাপন করুন।

নির্বাচিত এলাকা

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

FocusArea হল car-ui-লাইব্রেরিতে LinearLayout এর একটি সাবক্লাস। যখন এই বৈশিষ্ট্যটি সক্ষম করা হয়, তখন FocusArea একটি হাইলাইট আঁকে যখন এর বংশধরদের মধ্যে একটি ফোকাস করা হয়। আরও জানতে, ফোকাস হাইলাইট কাস্টমাইজেশন দেখুন।

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

একটি FocusArea অন্য FocusArea নেস্ট করবেন না । এটি করা অনির্ধারিত নেভিগেশন আচরণের দিকে নিয়ে যায়। নিশ্চিত করুন যে সমস্ত ফোকাসযোগ্য দৃশ্য একটি FocusArea এর মধ্যে নেস্ট করা হয়েছে।

RotaryPlayground FocusArea একটি উদাহরণ নীচে দেখানো হয়েছে:

<com.android.car.ui.FocusArea
       android:layout_margin="16dp"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">
       <EditText
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:singleLine="true">
       </EditText>
   </com.android.car.ui.FocusArea>

FocusArea নিম্নরূপ কাজ করে:

  1. ঘোরানো এবং নাজ অ্যাকশন পরিচালনা করার সময়, RotaryService ভিউ হায়ারার্কিতে FocusArea উদাহরণ খোঁজে।
  2. একটি ঘূর্ণন ইভেন্ট গ্রহণ করার সময়, RotaryService ফোকাসকে অন্য ভিউতে নিয়ে যায় যা একই FocusArea এ ফোকাস নিতে পারে।
  3. একটি নাজ ইভেন্ট গ্রহণ করার সময়, RotaryService ফোকাসকে অন্য ভিউতে নিয়ে যায় যা অন্য (সাধারণত সংলগ্ন) FocusArea এ ফোকাস নিতে পারে।

আপনি যদি আপনার লেআউটে কোনো FocusAreas অন্তর্ভুক্ত না করেন, তাহলে রুট ভিউটিকে একটি অন্তর্নিহিত ফোকাস এলাকা হিসেবে গণ্য করা হয়। ব্যবহারকারী অ্যাপে নেভিগেট করতে ধাক্কা দিতে পারে না। পরিবর্তে, তারা সমস্ত ফোকাসযোগ্য দৃশ্যের মাধ্যমে ঘুরবে, যা ডায়ালগের জন্য পর্যাপ্ত হতে পারে।

ফোকাস এরিয়া কাস্টমাইজেশন

রোটারি নেভিগেশন কাস্টমাইজ করতে দুটি স্ট্যান্ডার্ড ভিউ অ্যাট্রিবিউট ব্যবহার করা যেতে পারে:

  • android:nextFocusForward অ্যাপ ডেভেলপারদের একটি ফোকাস এলাকায় ঘূর্ণন ক্রম নির্দিষ্ট করার অনুমতি দেয়। এটি কীবোর্ড নেভিগেশনের জন্য ট্যাব অর্ডার নিয়ন্ত্রণ করতে ব্যবহৃত একই বৈশিষ্ট্য। একটি লুপ তৈরি করতে এই বৈশিষ্ট্যটি ব্যবহার করবেন না । পরিবর্তে, একটি লুপ তৈরি করতে app:wrapAround (নীচে দেখুন) ব্যবহার করুন।
  • android:focusedByDefault অ্যাপ ডেভেলপারদের উইন্ডোতে ডিফল্ট ফোকাস ভিউ নির্দিষ্ট করতে দেয়। একই FocusArea এ এই অ্যাট্রিবিউট এবং app:defaultFocus (নীচে দেখুন) ব্যবহার করবেন না

FocusArea এছাড়াও ঘূর্ণমান নেভিগেশন কাস্টমাইজ করার জন্য কিছু বৈশিষ্ট্য সংজ্ঞায়িত করে। অন্তর্নিহিত ফোকাস এলাকাগুলি এই বৈশিষ্ট্যগুলির সাথে কাস্টমাইজ করা যাবে না৷

  1. ( Android 11 QPR3, Android 11 Car, Android 12 )
    app:defaultFocus একটি ফোকাসযোগ্য ডিসেন্ডেন্ট ভিউয়ের আইডি নির্দিষ্ট করতে ব্যবহার করা যেতে পারে, যেটি ফোকাস করা উচিত যখন ব্যবহারকারী এই FocusArea ধাক্কা দেয়।
  2. ( Android 11 QPR3, Android 11 Car, Android 12 )
    app:defaultFocusOverridesHistory true সেট করা যেতে পারে যাতে উপরে উল্লেখিত ভিউ ফোকাস নেয়, এমনকি যদি ইতিহাসের সাথে এই FocusArea অন্য একটি ভিউ ফোকাস করা হয়।
  3. ( অ্যান্ড্রয়েড 12 )
    একটি ফোকাসযোগ্য ডিসেন্ডেন্ট ভিউয়ের আইডি নির্দিষ্ট করতে app:nudgeLeftShortcut , app:nudgeRightShortcut , app:nudgeUpShortcut , এবং app:nudgeDownShortcut ব্যবহার করুন, যেটি ব্যবহারকারী যখন একটি নির্দিষ্ট দিকে ধাক্কা দেয় তার উপর ফোকাস করা উচিত। আরও জানতে, নিচের শর্টকাটের জন্য কন্টেন্ট দেখুন।

    ( Android 11 QPR3, Android 11 Car, Android 12-এ বাতিল করা হয়েছে ) app:nudgeShortcut এবং app:nudgeShortcutDirection শুধুমাত্র একটি নাজ শর্টকাট সমর্থিত।

  4. ( Android 11 QPR3, Android 11 Car, Android 12 )
    এই FocusArea মোড়ানো ঘূর্ণন সক্ষম করতে, app:wrapAround true সেট করা যেতে পারে। এটি সাধারণত ব্যবহৃত হয় যখন দৃশ্যগুলি একটি বৃত্ত বা ডিম্বাকৃতিতে সাজানো হয়।
  5. ( Android 11 QPR3, Android 11 Car, Android 12 )
    এই FocusArea হাইলাইটের প্যাডিং সামঞ্জস্য করতে, app:highlightPaddingStart , app:highlightPaddingEnd , app:highlightPaddingTop , app:highlightPaddingBottom , app:highlightPaddingHorizontal , এবং app:highlightPaddingVertical ব্যবহার করুন।
  6. ( Android 11 QPR3, Android 11 Car, Android 12 )
    একটি নাজ টার্গেট খুঁজে পেতে এই FocusArea অনুভূত সীমাগুলি সামঞ্জস্য করতে, app:startBoundOffset , app:endBoundOffset , app:topBoundOffset , app:bottomBoundOffset , app:horizontalBoundOffset এবং app:verticalBoundOffset ব্যবহার করুন।
  7. ( Android 11 QPR3, Android 11 Car, Android 12 )
    প্রদত্ত দিকনির্দেশে একটি সংলগ্ন FocusArea (বা এলাকা) আইডি স্পষ্টভাবে নির্দিষ্ট করতে, app:nudgeLeft , app:nudgeRight , app:nudgeUp , এবং app:nudgeDown ব্যবহার করুন। ডিফল্টরূপে ব্যবহৃত জ্যামিতিক অনুসন্ধান যখন পছন্দসই লক্ষ্য খুঁজে পায় না তখন এটি ব্যবহার করুন।

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

নজ শর্টকাট
চিত্র 3. নজ শর্টকাট

নাজ শর্টকাট ব্যতীত, ব্যবহারকারীকে FAB-এ পৌঁছানোর জন্য সম্পূর্ণ তালিকার মধ্য দিয়ে ঘুরতে হবে।

ফোকাস হাইলাইট কাস্টমাইজেশন

উপরে উল্লিখিত হিসাবে, RotaryService Android ফ্রেমওয়ার্কের ভিউ ফোকাসের বিদ্যমান ধারণার উপর ভিত্তি করে তৈরি করে। যখন ব্যবহারকারী ঘোরান এবং নাজ করেন, তখন RotaryService ফোকাসকে চারদিকে নিয়ে যায়, একটি ভিউকে ফোকাস করে এবং অন্যটি আনফোকাস করে। অ্যান্ড্রয়েডে, যখন একটি ভিউ ফোকাস করা হয়, যদি ভিউ:

  • নিজস্ব ফোকাস হাইলাইট নির্দিষ্ট করেছে, অ্যান্ড্রয়েড ভিউ এর ফোকাস হাইলাইট আঁকে।
  • একটি ফোকাস হাইলাইট নির্দিষ্ট করে না, এবং ডিফল্ট ফোকাস হাইলাইট অক্ষম করা হয় না, Android দৃশ্যের জন্য ডিফল্ট ফোকাস হাইলাইট আঁকে।

স্পর্শের জন্য ডিজাইন করা অ্যাপগুলি সাধারণত উপযুক্ত ফোকাস হাইলাইটগুলি নির্দিষ্ট করে না৷

ডিফল্ট ফোকাস হাইলাইট Android ফ্রেমওয়ার্ক দ্বারা সরবরাহ করা হয় এবং OEM দ্বারা ওভাররাইড করা যেতে পারে। অ্যাপ ডেভেলপাররা এটি পান যখন তারা যে থিমটি ব্যবহার করছেন তা Theme.DeviceDefault থেকে প্রাপ্ত হয়।

সামঞ্জস্যপূর্ণ ব্যবহারকারীর অভিজ্ঞতার জন্য, যখনই সম্ভব ডিফল্ট ফোকাস হাইলাইটের উপর নির্ভর করুন। আপনার যদি একটি কাস্টম-আকৃতির (উদাহরণস্বরূপ, গোলাকার বা বড়ি-আকৃতির) ফোকাস হাইলাইটের প্রয়োজন হয়, অথবা আপনি যদি Theme.DeviceDefault থেকে প্রাপ্ত নয় এমন একটি থিম ব্যবহার করছেন, তাহলে আপনার নিজস্ব ফোকাস হাইলাইট নির্দিষ্ট করতে car-ui-লাইব্রেরি সংস্থানগুলি ব্যবহার করুন প্রতিটি দৃশ্য।

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

<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_focused="true" android:state_pressed="true">
      <shape android:shape="oval">
         <solid android:color="@color/car_ui_rotary_focus_pressed_fill_color"/>
         <stroke
            android:width="@dimen/car_ui_rotary_focus_pressed_stroke_width"
            android:color="@color/car_ui_rotary_focus_pressed_stroke_color"/>
      </shape>
   </item>
   <item android:state_focused="true">
      <shape android:shape="oval">
         <solid android:color="@color/car_ui_rotary_focus_fill_color"/>
         <stroke
            android:width="@dimen/car_ui_rotary_focus_stroke_width"
            android:color="@color/car_ui_rotary_focus_stroke_color"/>
      </shape>
   </item>
   <item>
      <ripple...>
         ...
      </ripple>
   </item>
</selector>

( Android 11 QPR3, Android 11 Car, Android 12 ) উপরের নমুনায় বোল্ড রিসোর্স রেফারেন্সগুলি car-ui-লাইব্রেরি দ্বারা সংজ্ঞায়িত সংস্থানগুলি সনাক্ত করে৷ OEM তাদের নির্দিষ্ট করা ডিফল্ট ফোকাস হাইলাইটের সাথে সামঞ্জস্যপূর্ণ হতে ওভাররাইড করে। এটি নিশ্চিত করে যে ফোকাস হাইলাইট রঙ, স্ট্রোক প্রস্থ, এবং তাই পরিবর্তন হবে না যখন ব্যবহারকারী একটি কাস্টম ফোকাস হাইলাইট সহ একটি ভিউ এবং ডিফল্ট ফোকাস হাইলাইট সহ একটি দৃশ্যের মধ্যে নেভিগেট করে। শেষ আইটেমটি স্পর্শের জন্য ব্যবহৃত একটি লহর। সাহসী সংস্থানগুলির জন্য ব্যবহৃত ডিফল্ট মানগুলি নিম্নরূপ প্রদর্শিত হয়:

সাহসী সম্পদের জন্য ডিফল্ট মান
চিত্র 4. সাহসী সম্পদের জন্য ডিফল্ট মান

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

কঠিন পটভূমির রঙ
  • ( Android 11 QPR3, Android 11 Car, Android 12 )
    car_ui_rotary_focus_fill_secondary_color
    car_ui_rotary_focus_stroke_secondary_color
  • ( অ্যান্ড্রয়েড 12 )
    car_ui_rotary_focus_pressed_fill_secondary_color
    car_ui_rotary_focus_pressed_stroke_secondary_color

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

ফোকাসড, চাপা নয়ফোকাসড, চাপা
ফোকাসড, চাপা নয় ফোকাসড, চাপা

রোটারি স্ক্রোলিং

যদি আপনার অ্যাপ RecyclerView s ব্যবহার করে, তাহলে আপনার পরিবর্তে CarUiRecyclerView s ব্যবহার করা উচিত। এটি নিশ্চিত করে যে আপনার UI অন্যদের সাথে সামঞ্জস্যপূর্ণ কারণ একটি OEM-এর কাস্টমাইজেশন সমস্ত CarUiRecyclerView এর ক্ষেত্রে প্রযোজ্য।

আপনার তালিকার উপাদানগুলি যদি সমস্ত ফোকাসযোগ্য হয় তবে আপনাকে অন্য কিছু করতে হবে না। রোটারি নেভিগেশন নতুন ফোকাস করা উপাদানকে দৃশ্যমান করতে তালিকার উপাদান এবং তালিকা স্ক্রোলগুলির মাধ্যমে ফোকাসকে সরিয়ে দেয়।

( Android 11 QPR3, Android 11 Car, Android 12 )
যদি ফোকাসযোগ্য এবং ফোকাসযোগ্য উপাদানগুলির একটি মিশ্রণ থাকে, অথবা যদি সমস্ত উপাদানগুলি ফোকাসযোগ্য না হয়, আপনি ঘূর্ণমান স্ক্রোলিং সক্ষম করতে পারেন, যা ব্যবহারকারীকে অনফোকাসযোগ্য আইটেমগুলি এড়িয়ে না গিয়ে ধীরে ধীরে তালিকার মধ্য দিয়ে স্ক্রোল করতে রোটারি কন্ট্রোলার ব্যবহার করতে দেয়৷ ঘূর্ণমান স্ক্রোলিং সক্ষম করতে, app:rotaryScrollEnabled অ্যাট্রিবিউটটিকে true এ সেট করুন।

( Android 11 QPR3, Android 11 Car, Android 12 )
আপনি CarUiUtilssetRotaryScrollEnabled() পদ্ধতি সহ av CarUiRecyclerView সহ যে কোনও স্ক্রোলযোগ্য ভিউতে রোটারি স্ক্রলিং সক্ষম করতে পারেন। আপনি যদি তা করেন তবে আপনার প্রয়োজন:

  • স্ক্রোলযোগ্য দৃশ্যটিকে ফোকাসযোগ্য করুন যাতে এটি ফোকাস করা যায় যখন এর কোনো ফোকাসযোগ্য বংশধর দৃশ্য দৃশ্যমান হয় না,
  • setDefaultFocusHighlightEnabled(false) কল করে স্ক্রোলযোগ্য ভিউতে ডিফল্ট ফোকাস হাইলাইট অক্ষম করুন যাতে স্ক্রোলযোগ্য ভিউ ফোকাস করা মনে না হয়,
  • setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS) কল করে স্ক্রোলযোগ্য দৃশ্যটি তার বংশধরদের আগে ফোকাস করা হয়েছে তা নিশ্চিত করুন।
  • SOURCE_ROTARY_ENCODER সহ মোশন ইভেন্টের জন্য শুনুন এবং হয় AXIS_VSCROLL বা AXIS_HSCROLL স্ক্রোল করার দূরত্ব এবং দিক নির্দেশ করতে (চিহ্নের মাধ্যমে)।

যখন একটি CarUiRecyclerView এ রোটারি স্ক্রোলিং সক্ষম করা হয় এবং ব্যবহারকারী এমন একটি এলাকায় ঘোরান যেখানে কোনও ফোকাসযোগ্য দৃশ্য নেই, স্ক্রলবারটি ধূসর থেকে নীল হয়ে যায়, যেন স্ক্রলবারটি ফোকাস করা নির্দেশ করে। আপনি যদি চান একটি অনুরূপ প্রভাব বাস্তবায়ন করতে পারেন.

মোশন ইভেন্টগুলি উৎস ব্যতীত মাউসের একটি স্ক্রোল হুইল দ্বারা উত্পন্ন হিসাবে একই।

সরাসরি ম্যানিপুলেশন মোড

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

দুটি উপায়ের একটিতে DM প্রয়োগ করুন। আপনি যদি শুধুমাত্র ঘূর্ণন পরিচালনা করতে চান এবং আপনি যে ভিউ ম্যানিপুলেট করতে চান তা ACTION_SCROLL_FORWARD এবং ACTION_SCROLL_BACKWARD AccessibilityEvent যথাযথভাবে সাড়া দেয়, সহজ পদ্ধতি ব্যবহার করুন। অন্যথায়, উন্নত প্রক্রিয়া ব্যবহার করুন।

সিস্টেম উইন্ডোতে সাধারণ প্রক্রিয়াই একমাত্র বিকল্প; অ্যাপ্লিকেশন উভয় প্রক্রিয়া ব্যবহার করতে পারেন.

সরল মেকানিজম

( Android 11 QPR3, Android 11 Car, Android 12 )
আপনার অ্যাপটিকে DirectManipulationHelper.setSupportsRotateDirectly(View view, boolean enable) । ব্যবহারকারী যখন DM মোডে থাকে তখন RotaryService শনাক্ত করে এবং যখন একটি ভিউ ফোকাস করার সময় ব্যবহারকারী সেন্টার বোতাম টিপে তখন DM মোডে প্রবেশ করে। যখন DM মোডে, ঘূর্ণনগুলি ACTION_SCROLL_FORWARD বা ACTION_SCROLL_BACKWARD সঞ্চালন করে এবং ব্যবহারকারী যখন পিছনের বোতাম টিপে তখন DM মোড থেকে প্রস্থান করে৷ ডিএম মোডে প্রবেশ এবং প্রস্থান করার সময় সাধারণ প্রক্রিয়াটি দৃশ্যের নির্বাচিত অবস্থাকে টগল করে।

ব্যবহারকারী DM মোডে আছে এমন একটি ভিজ্যুয়াল কিউ প্রদান করতে, নির্বাচন করার সময় আপনার ভিউকে আলাদা দেখান। উদাহরণস্বরূপ, যখন android:state_selected true হয় তখন পটভূমি পরিবর্তন করুন।

উন্নত প্রক্রিয়া

অ্যাপটি নির্ধারণ করে কখন RotaryService DM মোডে প্রবেশ করে এবং প্রস্থান করে। একটি সামঞ্জস্যপূর্ণ ব্যবহারকারীর অভিজ্ঞতার জন্য, একটি DM ভিউ ফোকাস করে কেন্দ্র বোতাম টিপলে DM মোডে প্রবেশ করা উচিত এবং পিছনের বোতামটি DM মোড থেকে প্রস্থান করা উচিত। যদি কেন্দ্র বোতাম এবং/অথবা নাজ ব্যবহার না করা হয়, তাহলে তারা DM মোড থেকে প্রস্থান করার বিকল্প উপায় হতে পারে। ম্যাপের মতো অ্যাপের জন্য, ডিএম মোডে প্রবেশ করতে DM প্রতিনিধিত্ব করার জন্য একটি বোতাম ব্যবহার করা যেতে পারে।

উন্নত ডিএম মোড সমর্থন করতে, একটি দৃশ্য:

  1. ( Android 11 QPR3, Android 11 Car, Android 12 ) DM মোডে প্রবেশ করতে একটি KEYCODE_DPAD_CENTER ইভেন্ট শুনতে হবে এবং DM মোড থেকে প্রস্থান করার জন্য একটি KEYCODE_BACK ইভেন্ট শুনতে হবে, প্রতিটি ক্ষেত্রে DirectManipulationHelper.enableDirectManipulationMode() কল করে। এই ঘটনাগুলি শুনতে, নিম্নলিখিতগুলির মধ্যে একটি করুন:
    • একটি OnKeyListener নিবন্ধন করুন।
    • অথবা,
    • ভিউটি প্রসারিত করুন এবং তারপরে এটির dispatchKeyEvent() পদ্ধতি ওভাররাইড করুন।
  2. নাজ ইভেন্টগুলি শুনতে হবে ( KEYCODE_DPAD_UP , KEYCODE_DPAD_DOWN , KEYCODE_DPAD_LEFT , বা KEYCODE_DPAD_RIGHT ) যদি ভিউটি নাজগুলি পরিচালনা করে।
  3. MotionEvent s শুনতে হবে এবং AXIS_SCROLL এ ঘূর্ণন গণনা পেতে হবে যদি ভিউ ঘূর্ণন পরিচালনা করতে চায়। এই কাজ করার বিভিন্ন উপায় আছে:
    1. একটি OnGenericMotionListener নিবন্ধন করুন।
    2. ভিউ প্রসারিত করুন এবং এর dispatchTouchEvent() পদ্ধতি ওভাররাইড করুন।
  4. DM মোডে আটকে থাকা এড়াতে, দৃশ্যটি যে খণ্ড বা কার্যকলাপের অন্তর্গত তা ইন্টারেক্টিভ না হলে DM মোড থেকে বেরিয়ে আসতে হবে।
  5. দৃশ্যটি DM মোডে রয়েছে তা নির্দেশ করার জন্য একটি ভিজ্যুয়াল কিউ প্রদান করা উচিত।

একটি মানচিত্র প্যান এবং জুম করতে DM মোড ব্যবহার করে এমন একটি কাস্টম ভিউয়ের একটি নমুনা নীচে দেওয়া হয়েছে:

/** Whether this view is in DM mode. */
private boolean mInDirectManipulationMode;

/** Initializes the view. Called by the constructors. */ private void init() { setOnKeyListener((view, keyCode, keyEvent) -> { boolean isActionUp = keyEvent.getAction() == KeyEvent.ACTION_UP; switch (keyCode) { // Always consume KEYCODE_DPAD_CENTER and KEYCODE_BACK events. case KeyEvent.KEYCODE_DPAD_CENTER: if (!mInDirectManipulationMode && isActionUp) { mInDirectManipulationMode = true; DirectManipulationHelper.enableDirectManipulationMode(this, true); setSelected(true); // visually indicate DM mode } return true; case KeyEvent.KEYCODE_BACK: if (mInDirectManipulationMode && isActionUp) { mInDirectManipulationMode = false; DirectManipulationHelper.enableDirectManipulationMode(this, false); setSelected(false); } return true; // Consume controller nudge events only when in DM mode. // When in DM mode, nudges pan the map. case KeyEvent.KEYCODE_DPAD_UP: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(0f, -10f); return true; case KeyEvent.KEYCODE_DPAD_DOWN: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(0f, 10f); return true; case KeyEvent.KEYCODE_DPAD_LEFT: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(-10f, 0f); return true; case KeyEvent.KEYCODE_DPAD_RIGHT: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(10f, 0f); return true; // Don't consume other key events. default: return false; } });
// When in DM mode, rotation zooms the map. setOnGenericMotionListener(((view, motionEvent) -> { if (!mInDirectManipulationMode) return false; float scroll = motionEvent.getAxisValue(MotionEvent.AXIS_SCROLL); zoom(10 * scroll); return true; })); }
@Override public void onPause() { if (mInDirectManipulationMode) { // To ensure that the user doesn't get stuck in DM mode, disable DM mode // when the fragment is not interactive (e.g., a dialog shows up). mInDirectManipulationMode = false; DirectManipulationHelper.enableDirectManipulationMode(this, false); } super.onPause(); }

আরো উদাহরণ RotaryPlayground প্রকল্পে পাওয়া যাবে।

অ্যাক্টিভিটিভিউ

একটি ActivityView ব্যবহার করার সময়:

  • ActivityView ফোকাসযোগ্য হওয়া উচিত নয়।
  • ( Android 11 QPR3, Android 11 Car, Android 11-এ বাতিল করা হয়েছে )
    ActivityView এর বিষয়বস্তুতে প্রথম ফোকাসযোগ্য ভিউ হিসেবে একটি FocusParkingView থাকা আবশ্যক এবং এর app:shouldRestoreFocus অ্যাট্রিবিউটটি false হতে হবে।
  • ActivityView এর বিষয়বস্তুতে android:focusByDefault ভিউ থাকা উচিত নয়।

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

বোতাম যেগুলো চেপে ধরে থাকলে কাজ করে

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

mButton.setOnKeyListener((v, keyCode, event) ->
{
    if (keyCode != KEYCODE_DPAD_CENTER) {
        return false;
    }
    if (event.getAction() == ACTION_DOWN) {
        mButton.setPressed(true);
        mHandler.post(mRunnable);
    } else {
        mButton.setPressed(false);
        mHandler.removeCallbacks(mRunnable);
    }
    return true;
});

যেখানে mRunnable একটি পদক্ষেপ নেয় (যেমন রিওয়াইন্ডিং) এবং বিলম্বের পরে চালানোর জন্য নিজেই সময়সূচী করে।

টাচ মোড

ব্যবহারকারীরা একটি ঘূর্ণমান নিয়ামক ব্যবহার করে একটি গাড়িতে হেড ইউনিটের সাথে দুটি উপায়ে যোগাযোগ করতে পারে, হয় রোটারি কন্ট্রোলার ব্যবহার করে বা স্ক্রীন স্পর্শ করে। ঘূর্ণমান নিয়ামক ব্যবহার করার সময়, ফোকাসযোগ্য দৃশ্যগুলির একটি হাইলাইট করা হয়। স্ক্রীন স্পর্শ করার সময়, কোন ফোকাস হাইলাইট প্রদর্শিত হয় না৷ ব্যবহারকারী যেকোনো সময় এই ইনপুট মোডগুলির মধ্যে স্যুইচ করতে পারেন:

  • ঘূর্ণমান → স্পর্শ। যখন ব্যবহারকারী স্ক্রীন স্পর্শ করে, ফোকাস হাইলাইট অদৃশ্য হয়ে যায়।
  • স্পর্শ → ঘূর্ণমান. যখন ব্যবহারকারী কেন্দ্র বোতামটি নাজেন, ঘোরান বা চাপেন, তখন ফোকাস হাইলাইট প্রদর্শিত হয়।

ইনপুট মোডে ব্যাক এবং হোম বোতামের কোন প্রভাব নেই।

অ্যান্ড্রয়েডের টাচ মোডের বিদ্যমান ধারণায় রোটারি পিগিব্যাক। ব্যবহারকারী কোন ইনপুট মোড ব্যবহার করছেন তা নির্ধারণ করতে আপনি View.isInTouchMode() ব্যবহার করতে পারেন। পরিবর্তনের জন্য আপনি OnTouchModeChangeListener ব্যবহার করতে পারেন। যদিও এটি বর্তমান ইনপুট মোডের জন্য আপনার ইউজার ইন্টারফেসকে কাস্টমাইজ করতে ব্যবহার করা যেতে পারে, তবে কোনো বড় পরিবর্তন এড়িয়ে চলুন কারণ সেগুলি বিরক্তিকর হতে পারে।

সমস্যা সমাধান

স্পর্শের জন্য ডিজাইন করা একটি অ্যাপে, নেস্টেড ফোকাসযোগ্য ভিউ থাকা সাধারণ ব্যাপার। উদাহরণস্বরূপ, একটি ImageButton চারপাশে একটি FrameLayout থাকতে পারে, উভয়ই ফোকাসযোগ্য। এটি স্পর্শের জন্য কোন ক্ষতি করে না তবে এটি ঘূর্ণমান ব্যবহারকারীর জন্য একটি দুর্বল অভিজ্ঞতার কারণ হতে পারে কারণ ব্যবহারকারীকে পরবর্তী ইন্টারেক্টিভ ভিউতে যাওয়ার জন্য কন্ট্রোলারটিকে দুবার ঘোরাতে হবে। একটি ভাল ব্যবহারকারীর অভিজ্ঞতার জন্য, Google আপনাকে বাইরের দৃশ্য বা অভ্যন্তরীণ দৃশ্য ফোকাসযোগ্য করার পরামর্শ দেয়, তবে উভয়ই নয়।

রোটারি কন্ট্রোলারের মাধ্যমে চাপ দেওয়ার সময় যদি একটি বোতাম বা সুইচ ফোকাস হারায়, তাহলে এই শর্তগুলির মধ্যে একটি প্রযোজ্য হতে পারে:

  • বোতাম টিপানোর কারণে বোতাম বা সুইচটি নিষ্ক্রিয় করা হচ্ছে (সংক্ষিপ্ত বা অনির্দিষ্টকালের জন্য)। উভয় ক্ষেত্রেই, এটি মোকাবেলা করার দুটি উপায় রয়েছে:
    • android:enabled স্টেটটিকে true হিসাবে ছেড়ে দিন এবং কাস্টম স্টেটে বর্ণিত বোতাম বা সুইচ ধূসর করতে একটি কাস্টম স্থিতি ব্যবহার করুন।
    • বোতাম বা সুইচের চারপাশে একটি ধারক ব্যবহার করুন এবং বোতাম বা সুইচের পরিবর্তে ধারকটিকে ফোকাসযোগ্য করে তুলুন। (ক্লিক শ্রোতা অবশ্যই পাত্রে থাকতে হবে।)
  • বোতাম বা সুইচ প্রতিস্থাপন করা হচ্ছে। উদাহরণ স্বরূপ, বোতাম টিপলে বা সুইচ টগল করা হলে গৃহীত পদক্ষেপগুলি উপলব্ধ অ্যাকশনগুলির একটি রিফ্রেশ ট্রিগার করতে পারে যার ফলে বিদ্যমান বোতামগুলিকে প্রতিস্থাপন করতে নতুন বোতামগুলি ঘটতে পারে৷ এটি মোকাবেলা করার দুটি উপায় আছে:
    • একটি নতুন বোতাম বা সুইচ তৈরি করার পরিবর্তে, বিদ্যমান বোতাম বা সুইচের আইকন এবং/অথবা পাঠ্য সেট করুন।
    • উপরের মত, বোতাম বা সুইচের চারপাশে একটি ফোকাসযোগ্য পাত্র যোগ করুন।

রোটারি খেলার মাঠ

RotaryPlayground হল রোটারির জন্য একটি রেফারেন্স অ্যাপ। আপনার অ্যাপ্লিকেশানগুলিতে ঘূর্ণমান বৈশিষ্ট্যগুলিকে কীভাবে একীভূত করতে হয় তা শিখতে এটি ব্যবহার করুন৷ RotaryPlayground এমুলেটর বিল্ড এবং Android Automotive OS (AAOS) চালিত ডিভাইসগুলির জন্য বিল্ডে অন্তর্ভুক্ত।

  • RotaryPlayground সংগ্রহস্থল: packages/apps/Car/tests/RotaryPlayground/
  • সংস্করণ: Android 11 QPR3, Android 11 Car, এবং Android 12

RotaryPlayground অ্যাপটি বাম দিকে নিম্নলিখিত ট্যাবগুলি দেখায়:

  • তাস. ফোকাস এলাকার চারপাশে নেভিগেট করার পরীক্ষা করুন, ফোকাসযোগ্য উপাদান এবং টেক্সট ইনপুট এড়িয়ে যান।
  • সরাসরি ম্যানিপুলেশন। পরীক্ষা উইজেট যা সহজ এবং উন্নত সরাসরি ম্যানিপুলেশন মোড সমর্থন করে। এই ট্যাবটি বিশেষভাবে অ্যাপ উইন্ডোর মধ্যে সরাসরি ম্যানিপুলেশনের জন্য।
  • Sys UI ম্যানিপুলেশন। পরীক্ষা উইজেট যা সিস্টেম উইন্ডোতে সরাসরি ম্যানিপুলেশন সমর্থন করে যেখানে শুধুমাত্র সাধারণ সরাসরি ম্যানিপুলেশন মোড সমর্থিত।
  • গ্রিড। স্ক্রলিং সহ জেড-প্যাটার্ন রোটারি নেভিগেশন পরীক্ষা করুন।
  • বিজ্ঞপ্তি। হেড-আপ বিজ্ঞপ্তিগুলির মধ্যে এবং বাইরে নডিং পরীক্ষা করুন।
  • স্ক্রল করুন। ফোকাসযোগ্য এবং ফোকাসযোগ্য বিষয়বস্তুর মিশ্রণের মাধ্যমে পরীক্ষা স্ক্রলিং।
  • ওয়েবভিউ। WebView লিঙ্কগুলির মাধ্যমে নেভিগেট করার পরীক্ষা করুন।
  • কাস্টম FocusArea FocusArea কাস্টমাইজেশন পরীক্ষা করুন:
    • চারপাশে মোড়ানো.
    • android:focusedByDefault এবং app:defaultFocus
    • .
    • সুস্পষ্ট নাজ লক্ষ্যবস্তু.
    • নজ শর্টকাট.
    • কোন ফোকাসযোগ্য দৃশ্য ছাড়া FocusArea .