টাইলে ডায়নামিক আপডেট দেখানো

Tiles 1.2 থেকে শুরু করে, আপনি ডায়নামিক এক্সপ্রেশন ব্যবহার করে প্ল্যাটফর্ম ডেটা আপডেট স্ট্রিম করতে পারবেন। তারপরে, আপনার টাইলসে থাকা অ্যানিমেশনের সাথে এইসব আপডেট যোগ করতে পারবেন। আপনার অ্যাপ প্রতি সেকেন্ডে এই ভ্যালু আপডেট করে।

ডায়নামিক এক্সপ্রেশন ব্যবহার করলে, কন্টেন্ট পরিবর্তন হলে আপনাকে সম্পূর্ণ টাইল রিফ্রেশ করতে হবে না। আপনার টাইলসে আরও আকর্ষণীয় অভিজ্ঞতা তৈরি করতে, ডায়নামিক অবজেক্ট অ্যানিমেট করুন।

ডেটা সোর্সের সাথে ডায়নামিক এক্সপ্রেশন অ্যাসোসিয়েট করা

androidx.wear.protolayout এবং androidx.wear.protolayout.material নেমস্পেসে এমন অনেক ক্লাস আছে যেগুলির ফিল্ড ডায়নামিক এক্সপ্রেশন গ্রহণ করে। বিভিন্ন উদাহরণে নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত:

আপনার টাইলের কোনও এলিমেন্টের সম্ভাব্য মান হিসেবে ডায়নামিক এক্সপ্রেশন ব্যবহার করতে, এলিমেন্টের সংশ্লিষ্ট *Prop ডায়নামিক প্রপার্টির ধরন ব্যবহার করুন এবং ডায়নামিক প্রপার্টির ধরনের বিল্ডার ক্লাসের setDynamicValue() মেথডে ডেটা সোর্স পাস করুন।

টাইল এইসব ডায়নামিক প্রপার্টির ধরন সাপোর্ট করে:

  • ডিসপ্লে-নিরপেক্ষ পিক্সেলে পরিমাপ করা লিনিয়ার ডাইমেনশনের জন্য, DimensionBuilders.DpProp ব্যবহার করুন।
  • কোণীয় ডাইমেনশনের জন্য, যা ডিগ্রিতে পরিমাপ করা হয়, DimensionBuilders.DegreesProp ব্যবহার করুন।
  • স্ট্রিং ভ্যালুর জন্য, TypeBuilders.StringProp ব্যবহার করুন।
  • কালার ভ্যালুর জন্য, ColorBuilders.ColorProp ব্যবহার করুন।
  • ফ্লোটিং-পয়েন্ট ভ্যালুর জন্য, TypeBuilders.FloatProp ব্যবহার করুন।

আপনি যদি এমন কোনও ডায়নামিক এক্সপ্রেশন ব্যবহার করেন যা ফিজিক্যাল ডাইমেনশনকে প্রভাবিত করে—রং ছাড়া টাইলের মধ্যে যেকোনও ভ্যালু—তাহলে আপনাকে অবশ্যই সম্পর্কিত সীমাবদ্ধতার একটি সেটও নির্দিষ্ট করতে হবে, যেমন স্ট্রিং ফর্ম্যাট। এইসব সীমাবদ্ধতা সিস্টেম রেন্ডারারকে আপনার টাইলের মধ্যে কোনও ভ্যালু সর্বাধিক কতটা জায়গা নিতে পারে তা নির্ধারণ করতে দেয়। সাধারণত, আপনি setLayoutConstraintsForDynamic* দিয়ে শুরু হওয়া কোনও পদ্ধতি কল করে, এলিমেন্ট লেভেলে এইসব সীমাবদ্ধতা নির্দিষ্ট করেন, ডায়নামিক এক্সপ্রেশন লেভেলে নয়।

নিচের কোড স্নিপেট থেকে কীভাবে ৩ ডিজিট ব্যবহার করে হার্ট রেট সংক্রান্ত আপডেট দেখানো যায় তা জানতে পারবেন, এর ফলব্যাক ভ্যালু হল --:

override fun onTileRequest(requestParams: RequestBuilders.TileRequest) =
    Futures.immediateFuture(
        Tile.Builder()
            .setResourcesVersion(RESOURCES_VERSION)
            .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
            .setTileTimeline(
                Timeline.fromLayoutElement(
                    Text.Builder(
                        this,
                        TypeBuilders.StringProp.Builder("--")
                            .setDynamicValue(
                                PlatformHealthSources.heartRateBpm()
                                    .format()
                                    .concat(DynamicBuilders.DynamicString.constant(" bpm"))
                            )
                            .build(),
                        TypeBuilders.StringLayoutConstraint.Builder("000").build(),
                    )
                        .build()
                )
            )
            .build()
    )

একটি টাইলের মধ্যে অল্প সংখ্যক এক্সপ্রেশন ব্যবহার করা

Wear OS-এ একটি টাইলে থাকতে পারে এমন এক্সপ্রেশনের সংখ্যার উপর সীমা আরোপ করা হয়। কোনও টাইলে মোট ডায়নামিক এক্সপ্রেশন খুব বেশি থাকলে, ডায়নামিক ভ্যালু উপেক্ষা করা হয় এবং আপনি সম্পর্কিত ডায়নামিক প্রপার্টির ধরনকে যে স্ট্যাটিক ভ্যালু প্রদান করেন, সিস্টেম সেই ভ্যালু ব্যবহার করে।

স্টেট অবজেক্টে ডায়নামিক ডেটা একত্রিত করা

আপনি ডেটা সোর্স থেকে পাওয়া লেটেস্ট আপডেটকে স্টেটে কনসোলিডেট করতে পারবেন, যা আপনি ভ্যালু রেন্ডার করার জন্য টাইলে পাস করেন।

আপনার টাইলসে রাজ্যের তথ্য ব্যবহার করতে, এইসব ধাপ সম্পূর্ণ করুন:

  1. আপনার টাইলের স্টেটের বিভিন্ন ভ্যালু বোঝানোর জন্য কীয়ের একটি সেট তৈরি করুন। এই উদাহরণে জল পান করা ও qqq নোটের জন্য কী তৈরি করা হয়েছে:

    companion object {
        val KEY_WATER_INTAKE = intAppDataKey("key_water_intake")
        val KEY_NOTE = stringAppDataKey("key_note")
    }

  2. onTileRequest()-এর আপনার প্রয়োগে, setState() কল করুন এবং প্রতিটি কী থেকে একটি নির্দিষ্ট ডায়নামিক ডেটা ভ্যালুতে প্রাথমিক ম্যাপিং স্থাপন করুন:

    override fun onTileRequest(
        requestParams: RequestBuilders.TileRequest
    ): ListenableFuture<Tile?> {
        // If the tile hasn't had any state set yet, use the default values
        val state =
            if (requestParams.currentState.keyToValueMapping.isNotEmpty())
                requestParams.currentState
            else
                StateBuilders.State.Builder()
                    .setStateMap(
                        dynamicDataMapOf(
                            KEY_WATER_INTAKE mapTo 200,
                            KEY_NOTE mapTo "Good"
                        )
                    )
                    .build()
    
        return Futures.immediateFuture(
            Tile.Builder()
                // Set resources, timeline, and other tile properties.
                .setState(state)
                .build()
        )
    }

  3. আপনি লেআউট তৈরি করার সময়, স্টেটের যে জায়গায় এই ডেটা দেখাতে চান, সেখানে Dynamic* টাইপ অবজেক্ট ব্যবহার করুন। এছাড়াও, আপনি animate()-এ কল করে আগের ভ্যালু থেকে বর্তমান ভ্যালু পর্যন্ত অ্যানিমেশন দেখতে পারেন:

    val waterIntakeValue =
        DynamicBuilders.DynamicInt32.from(KEY_WATER_INTAKE)

  4. প্রয়োজন হলে, আপনি নতুন ভ্যালু দিয়ে স্টেট আপডেট করতে পারবেন। এটি টাইলের LoadAction-এর অংশ হতে পারে।

    এই উদাহরণে, জল খাওয়ার পরিমাণ সংক্রান্ত ভ্যালু 400 হিসেবে আপডেট করা হয়েছে:

    val loadAction =
        loadAction(
            dynamicDataMapOf(
                KEY_WATER_INTAKE mapTo 400,
                KEY_NOTE mapTo "Outstanding"
            )
        )