টাইলসে গতিশীল আপডেট দেখান

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. আপনার টাইলের অবস্থার বিভিন্ন মানকে উপস্থাপন করে এমন এক সেট কী (key) তৈরি করুন। এই উদাহরণটি জল গ্রহণ এবং একটি qqq নোটের জন্য কী তৈরি করে:

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

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

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

{% হুবহু %} {% endverbatim %} {% হুবহু %} {% endverbatim %}