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

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

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

  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 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 .
,

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

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

  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 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. ( অ্যান্ড্রয়েড 11 কিউপিআর 3, অ্যান্ড্রয়েড 11 গাড়ি, অ্যান্ড্রয়েড 12 )
    app:defaultFocus ফোকাসযোগ্য বংশধর ভিউয়ের আইডি নির্দিষ্ট করতে ব্যবহার করা যেতে পারে, যা ব্যবহারকারী যখন এই FocusArea ন্যাজ দেয় তখন ফোকাস করা উচিত।
  2. ( অ্যান্ড্রয়েড 11 কিউপিআর 3, অ্যান্ড্রয়েড 11 গাড়ি, অ্যান্ড্রয়েড 12 )
    app:defaultFocusOverridesHistory এই FocusArea অন্য কোনও দৃশ্যের দিকে মনোনিবেশ করার জন্য ইতিহাসের সাথে ইতিহাসের সাথে দৃষ্টি নিবদ্ধ করেও ফোকাস গ্রহণ করার জন্য true সেট করা যেতে পারে।
  3. ( অ্যান্ড্রয়েড 12 )
    app:nudgeLeftShortcut , app:nudgeRightShortcut , app:nudgeUpShortcut , এবং app:nudgeDownShortcut একটি ফোকাসযোগ্য বংশোদ্ভূত দৃশ্যের আইডি নির্দিষ্ট করতে, যা যখন কোনও প্রদত্ত দিকনির্দেশে ব্যবহারকারী যখন মনোনিবেশ করা উচিত তখন ফোকাস করা উচিত। আরও জানতে, নীচের ন্যাজ শর্টকাটগুলির সামগ্রীটি দেখুন।

    ( অ্যান্ড্রয়েড 11 কিউপিআর 3, অ্যান্ড্রয়েড 11 গাড়ি, অ্যান্ড্রয়েড 12 এ অবমূল্যায়ন করা হয়েছে ) app:nudgeShortcut এবং app:nudgeShortcutDirection কেবল একটি এনজেড শর্টকাটকে সমর্থন করেছে।

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

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

সংক্ষিপ্ত শর্টকাট
চিত্র 3। ন্যাজ শর্টকাট

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

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

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

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

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

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

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

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

<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>

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

সাহসী সংস্থানগুলির জন্য ডিফল্ট মান
চিত্র 4। সাহসী সংস্থানগুলির জন্য ডিফল্ট মান

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

সলিড ব্যাকগ্রাউন্ড রঙ
  • ( অ্যান্ড্রয়েড 11 কিউপিআর 3, অ্যান্ড্রয়েড 11 গাড়ি, অ্যান্ড্রয়েড 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 এস ব্যবহার করে তবে আপনার পরিবর্তে CarUiRecyclerView এস ব্যবহার করা উচিত। এটি নিশ্চিত করে যে আপনার ইউআই অন্যের সাথে সামঞ্জস্যপূর্ণ কারণ একটি OEM এর কাস্টমাইজেশন সমস্ত CarUiRecyclerView ক্ষেত্রে প্রযোজ্য।

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

( অ্যান্ড্রয়েড 11 কিউপিআর 3, অ্যান্ড্রয়েড 11 গাড়ি, অ্যান্ড্রয়েড 12 )
যদি ফোকাসযোগ্য এবং অপ্রয়োজনীয় উপাদানগুলির মিশ্রণ থাকে, বা যদি সমস্ত উপাদানগুলি অপ্রয়োজনীয় হয় তবে আপনি রোটারি স্ক্রোলিং সক্ষম করতে পারেন, যা ব্যবহারকারীকে রোটারি কন্ট্রোলারকে ধীরে ধীরে অবিচ্ছিন্ন আইটেমগুলি এড়িয়ে যাওয়া ছাড়াই তালিকার মাধ্যমে স্ক্রোল করতে ব্যবহার করতে দেয়। রোটারি স্ক্রোলিং সক্ষম করতে, app:rotaryScrollEnabled বৈশিষ্ট্যটি true

( অ্যান্ড্রয়েড 11 কিউপিআর 3, অ্যান্ড্রয়েড 11 গাড়ি, অ্যান্ড্রয়েড 12 )
আপনি CarUiUtils -এ setRotaryScrollEnabled() পদ্ধতি সহ এভি CarUiRecyclerView সহ যে কোনও স্ক্রোলেবল ভিউতে রোটারি স্ক্রোলিং সক্ষম করতে পারেন। আপনি যদি এটি করেন তবে আপনার দরকার:

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

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

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

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

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

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

সিস্টেম উইন্ডোজের একমাত্র বিকল্প হ'ল সহজ প্রক্রিয়া; অ্যাপ্লিকেশনগুলি উভয় প্রক্রিয়া ব্যবহার করতে পারে।

সাধারণ প্রক্রিয়া

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

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

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

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

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

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

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

/** 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 ফোকাসযোগ্য হওয়া উচিত নয়।
  • ( অ্যান্ড্রয়েড 11 কিউপিআর 3, অ্যান্ড্রয়েড 11 গাড়ি, অ্যান্ড্রয়েড 11 এ অবমূল্যায়িত )
    ActivityView বিষয়বস্তুতে অবশ্যই প্রথম ফোকাসযোগ্য ভিউ হিসাবে একটি FocusParkingView থাকতে হবে এবং এর app:shouldRestoreFocus বৈশিষ্ট্যটি অবশ্যই false হতে হবে।
  • ActivityView বিষয়বস্তুতে কোনও android:focusByDefault ভিউ।

ব্যবহারকারীর জন্য, ক্রিয়াকলাপভিউগুলি নেভিগেশনে কোনও প্রভাব ফেলতে হবে না যে ফোকাস অঞ্চলগুলি ক্রিয়াকলাপভিউগুলি স্প্যান করতে পারে না। অন্য কথায়, আপনার কোনও একক ফোকাস অঞ্চল থাকতে পারে না যা কোনও ActivityView ভিতরে এবং বাইরে সামগ্রী রয়েছে। আপনি যদি আপনার ActivityView কোনও ফোকাসারিয়া যুক্ত না করেন তবে 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 থাকতে পারে, উভয়ই ফোকাসযোগ্য। এটি স্পর্শের জন্য কোনও ক্ষতি করে না তবে এটি রোটারির জন্য একটি দুর্বল ব্যবহারকারীর অভিজ্ঞতা অর্জন করতে পারে কারণ ব্যবহারকারীকে পরবর্তী ইন্টারেক্টিভ ভিউতে যেতে দু'বার নিয়ন্ত্রণকারীকে ঘোরাতে হবে। একটি ভাল ব্যবহারকারীর অভিজ্ঞতার জন্য, গুগল আপনাকে বাইরের দৃশ্য বা অভ্যন্তরীণ দৃশ্যকে ফোকাসযোগ্য করার পরামর্শ দেয় তবে উভয়ই নয়।

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

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

রোটারপ্লেগ্রাউন্ড

RotaryPlayground রোটারির জন্য একটি রেফারেন্স অ্যাপ। কীভাবে আপনার অ্যাপ্লিকেশনগুলিতে রোটারি বৈশিষ্ট্যগুলি সংহত করতে হয় তা শিখতে এটি ব্যবহার করুন। RotaryPlayground এমুলেটর বিল্ডগুলিতে এবং অ্যান্ড্রয়েড অটোমোটিভ ওএস (এএওএস) চালানো ডিভাইসগুলির জন্য বিল্ডগুলিতে অন্তর্ভুক্ত রয়েছে।

  • RotaryPlayground সংগ্রহস্থল: packages/apps/Car/tests/RotaryPlayground/
  • সংস্করণ: অ্যান্ড্রয়েড 11 কিউপিআর 3, অ্যান্ড্রয়েড 11 গাড়ি এবং অ্যান্ড্রয়েড 12

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

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