আপনার অ্যাপ্লিকেশন ভাঁজ সচেতন করুন

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

উইন্ডো তথ্য

Jetpack WindowManager-এ WindowInfoTracker ইন্টারফেস উইন্ডো লেআউট তথ্য প্রকাশ করে। ইন্টারফেসের windowLayoutInfo() পদ্ধতিটি WindowLayoutInfo ডেটার একটি স্ট্রীম ফেরত দেয় যা একটি ভাঁজযোগ্য ডিভাইসের ভাঁজ অবস্থা সম্পর্কে আপনার অ্যাপকে জানায়। WindowInfoTracker getOrCreate() পদ্ধতি WindowInfoTracker এর একটি উদাহরণ তৈরি করে।

WindowManager Kotlin Flows এবং Java কলব্যাক ব্যবহার করে WindowLayoutInfo ডেটা সংগ্রহের জন্য সমর্থন প্রদান করে।

কোটলিন প্রবাহ

WindowLayoutInfo ডেটা সংগ্রহ শুরু এবং বন্ধ করার জন্য, আপনি একটি পুনঃসূচনাযোগ্য লাইফসাইকেল-সচেতন কোরোটিন ব্যবহার করতে পারেন যেখানে লাইফসাইকেলটি অন্তত STARTED হলে এবং লাইফসাইকেল STOPPED হয়ে গেলে repeatOnLifecycle কোড ব্লক কার্যকর করা হয়। লাইফসাইকেল আবার STARTED হলে কোড ব্লকের এক্সিকিউশন স্বয়ংক্রিয়ভাবে পুনরায় চালু হয়। নিম্নলিখিত উদাহরণে, কোড ব্লক WindowLayoutInfo ডেটা সংগ্রহ করে এবং ব্যবহার করে:

class DisplayFeaturesActivity : AppCompatActivity() {

    private lateinit var binding: ActivityDisplayFeaturesBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityDisplayFeaturesBinding.inflate(layoutInflater)
        setContentView(binding.root)

        lifecycleScope.launch(Dispatchers.Main) {
            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
                WindowInfoTracker.getOrCreate(this@DisplayFeaturesActivity)
                    .windowLayoutInfo(this@DisplayFeaturesActivity)
                    .collect { newLayoutInfo ->
                        // Use newLayoutInfo to update the layout.
                    }
            }
        }
    }
}

জাভা কলব্যাক

androidx.window:window-java নির্ভরতা-এ অন্তর্ভুক্ত কলব্যাক সামঞ্জস্যপূর্ণ স্তর আপনাকে Kotlin ফ্লো ব্যবহার না করেই WindowLayoutInfo আপডেট সংগ্রহ করতে সক্ষম করে। আর্টিফ্যাক্টটিতে WindowInfoTrackerCallbackAdapter ক্লাস অন্তর্ভুক্ত রয়েছে, যা WindowLayoutInfo আপডেটগুলি পেতে কলব্যাকগুলিকে নিবন্ধন (এবং নিবন্ধনমুক্ত) সমর্থন করার জন্য একটি WindowInfoTracker অ্যাডাপ্ট করে, উদাহরণস্বরূপ:

public class SplitLayoutActivity extends AppCompatActivity {

    private WindowInfoTrackerCallbackAdapter windowInfoTracker;
    private ActivitySplitLayoutBinding binding;
    private final LayoutStateChangeCallback layoutStateChangeCallback =
            new LayoutStateChangeCallback();

   @Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       binding = ActivitySplitLayoutBinding.inflate(getLayoutInflater());
       setContentView(binding.getRoot());

       windowInfoTracker =
                new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.getOrCreate(this));
   }

   @Override
   protected void onStart() {
       super.onStart();
       windowInfoTracker.addWindowLayoutInfoListener(
                this, Runnable::run, layoutStateChangeCallback);
   }

   @Override
   protected void onStop() {
       super.onStop();
       windowInfoTracker
           .removeWindowLayoutInfoListener(layoutStateChangeCallback);
   }

   class LayoutStateChangeCallback implements Consumer<WindowLayoutInfo> {
       @Override
       public void accept(WindowLayoutInfo newLayoutInfo) {
           SplitLayoutActivity.this.runOnUiThread( () -> {
               // Use newLayoutInfo to update the layout.
           });
       }
   }
}

RxJava সমর্থন

আপনি যদি ইতিমধ্যেই RxJava (সংস্করণ 2 বা 3 ) ব্যবহার করে থাকেন, তাহলে আপনি এমন আর্টিফ্যাক্টগুলির সুবিধা নিতে পারেন যা আপনাকে Kotlin Flow ব্যবহার না করে WindowLayoutInfo আপডেট সংগ্রহ করতে একটি Observable বা Flowable ব্যবহার করতে সক্ষম করে।

androidx.window:window-rxjava2 এবং androidx.window:window-rxjava3 নির্ভরতার দ্বারা প্রদত্ত সামঞ্জস্যপূর্ণ স্তরের মধ্যে রয়েছে WindowInfoTracker#windowLayoutInfoFlowable() এবং WindowInfoTracker#windowLayoutInfoObservable() পদ্ধতি, যা আপনার অ্যাপকে WindowLayoutInfo , উদাহরণের জন্য আপডেট করতে সক্ষম করে:

class RxActivity: AppCompatActivity {

    private lateinit var binding: ActivityRxBinding

    private var disposable: Disposable? = null
    private lateinit var observable: Observable<WindowLayoutInfo>

   @Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       binding = ActivitySplitLayoutBinding.inflate(getLayoutInflater());
       setContentView(binding.getRoot());

        // Create a new observable
        observable = WindowInfoTracker.getOrCreate(this@RxActivity)
            .windowLayoutInfoObservable(this@RxActivity)
   }

   @Override
   protected void onStart() {
       super.onStart();

        // Subscribe to receive WindowLayoutInfo updates
        disposable?.dispose()
        disposable = observable
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { newLayoutInfo ->
            // Use newLayoutInfo to update the layout
        }
   }

   @Override
   protected void onStop() {
       super.onStop();

        // Dispose the WindowLayoutInfo observable
        disposable?.dispose()
   }
}

ভাঁজযোগ্য ডিসপ্লের বৈশিষ্ট্য

Jetpack WindowManager-এর WindowLayoutInfo ক্লাস একটি ডিসপ্লে উইন্ডোর বৈশিষ্ট্যগুলিকে DisplayFeature উপাদানগুলির একটি তালিকা হিসাবে উপলব্ধ করে।

একটি FoldingFeature হল এক ধরনের DisplayFeature যা নিম্নলিখিতগুলি সহ ভাঁজযোগ্য ডিসপ্লে সম্পর্কে তথ্য প্রদান করে:

  • state : ডিভাইসের ভাঁজ করা অবস্থা, FLAT বা HALF_OPENED
  • orientation : ভাঁজ বা কব্জা, HORIZONTAL বা VERTICAL অভিযোজন
  • occlusionType : ভাঁজ বা কব্জা ডিসপ্লের অংশ লুকিয়ে রাখুক, NONE না FULL
  • isSeparating : ভাঁজ বা কব্জা দুটি যৌক্তিক প্রদর্শন ক্ষেত্র তৈরি করে, সত্য বা মিথ্যা

একটি ভাঁজযোগ্য ডিভাইস যা HALF_OPENED সর্বদা isSeparating সত্য হিসাবে রিপোর্ট করে কারণ স্ক্রীন দুটি প্রদর্শন অঞ্চলে বিভক্ত। এছাড়াও, একটি দ্বৈত-স্ক্রীন ডিভাইসে isSeparating সর্বদা সত্য হয় যখন অ্যাপ্লিকেশনটি উভয় স্ক্রীনে বিস্তৃত হয়।

FoldingFeature bounds প্রোপার্টি ( DisplayFeature থেকে উত্তরাধিকারসূত্রে প্রাপ্ত) একটি ভাঁজ বা কব্জার মতো একটি ভাঁজ বৈশিষ্ট্যের বাউন্ডিং আয়তক্ষেত্রকে প্রতিনিধিত্ব করে। বৈশিষ্ট্যের সাপেক্ষে স্ক্রিনে উপাদানগুলির অবস্থানের জন্য সীমাগুলি ব্যবহার করা যেতে পারে।

কোটলিন

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    lifecycleScope.launch(Dispatchers.Main) {
        lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
            // Safely collects from windowInfoRepo when the lifecycle is STARTED
            // and stops collection when the lifecycle is STOPPED
            WindowInfoTracker.getOrCreate(this@MainActivity)
                .windowLayoutInfo(this@MainActivity)
                .collect { layoutInfo ->
                    // New posture information
                    val foldingFeature = layoutInfo.displayFeatures
                        .filterIsInstance()
                        .firstOrNull()
                    // Use information from the foldingFeature object
                }

        }
    }
}

জাভা

private WindowInfoTrackerCallbackAdapter windowInfoTracker;
private final LayoutStateChangeCallback layoutStateChangeCallback =
                new LayoutStateChangeCallback();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    windowInfoTracker =
            new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.getOrCreate(this));
}

@Override
protected void onStart() {
    super.onStart();
    windowInfoTracker.addWindowLayoutInfoListener(
            this, Runnable::run, layoutStateChangeCallback);
}

@Override
protected void onStop() {
    super.onStop();
    windowInfoTracker.removeWindowLayoutInfoListener(layoutStateChangeCallback);
}

class LayoutStateChangeCallback implements Consumer<WindowLayoutInfo> {
    @Override
    public void accept(WindowLayoutInfo newLayoutInfo) {
        // Use newLayoutInfo to update the Layout
        List<DisplayFeature> displayFeatures = newLayoutInfo.getDisplayFeatures();
        for (DisplayFeature feature : displayFeatures) {
            if (feature instanceof FoldingFeature) {
                // Use information from the feature object
            }
        }
    }
}

ট্যাবলেটপ মোড

FoldingFeature অবজেক্টে অন্তর্ভুক্ত তথ্য ব্যবহার করে, আপনার অ্যাপ ট্যাবলেটপ মোডের মতো ভঙ্গি সমর্থন করতে পারে, যেখানে ফোনটি একটি পৃষ্ঠে বসে থাকে, কব্জাটি একটি অনুভূমিক অবস্থানে থাকে এবং ভাঁজযোগ্য স্ক্রিনটি অর্ধেক খোলা থাকে।

ট্যাবলেটপ মোড ব্যবহারকারীদের তাদের হাতে ফোন না ধরেই তাদের ফোন চালানোর সুবিধা দেয়। ট্যাবলেটপ মোড মিডিয়া দেখা, ফটো তোলা এবং ভিডিও কল করার জন্য দুর্দান্ত।

ট্যাবলেটপ মোডে একটি ভিডিও প্লেয়ার অ্যাপ

ডিভাইসটি ট্যাবলেটপ মোডে আছে কিনা তা নির্ধারণ করতে FoldingFeature.State এবং FoldingFeature.Orientation ব্যবহার করুন:

কোটলিন


fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean {
    contract { returns(true) implies (foldFeature != null) }
    return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
            foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
}

জাভা


boolean isTableTopPosture(FoldingFeature foldFeature) {
    return (foldFeature != null) &&
           (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) &&
           (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL);
}

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

উদাহরণ

বই মোড

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

হ্যান্ডস-ফ্রি ছবি তোলার সময় আপনি যদি ভিন্ন আকৃতির অনুপাত ক্যাপচার করতে চান তবে এটি ফটোগ্রাফির জন্যও ব্যবহার করা যেতে পারে।

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

কোটলিন

fun isBookPosture(foldFeature : FoldingFeature?) : Boolean {
    contract { returns(true) implies (foldFeature != null) }
    return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
            foldFeature.orientation == FoldingFeature.Orientation.VERTICAL
}

জাভা

boolean isBookPosture(FoldingFeature foldFeature) {
    return (foldFeature != null) &&
           (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) &&
           (foldFeature.getOrientation() == FoldingFeature.Orientation.VERTICAL);
}

জানালার আকার পরিবর্তন

একটি ডিভাইস কনফিগারেশন পরিবর্তনের ফলে একটি অ্যাপের ডিসপ্লে এরিয়া পরিবর্তিত হতে পারে—উদাহরণস্বরূপ, যখন ডিভাইসটি ভাঁজ করা হয় বা খোলা হয়, ঘোরানো হয় বা মাল্টি-উইন্ডো মোডে একটি উইন্ডোর আকার পরিবর্তন করা হয়।

Jetpack WindowManager WindowMetricsCalculator ক্লাস আপনাকে বর্তমান এবং সর্বাধিক উইন্ডো মেট্রিক্স পুনরুদ্ধার করতে সক্ষম করে। এপিআই লেভেল 30 এ প্রবর্তিত প্ল্যাটফর্ম WindowMetrics মত, WindowManager WindowMetrics উইন্ডোর সীমানা প্রদান করে, কিন্তু API এপিআই লেভেল 14-এ পিছিয়ে সামঞ্জস্যপূর্ণ।

উইন্ডো সাইজের ক্লাস দেখুন।

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

নমুনা

কোডল্যাব

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}