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

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

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

ডাটা সোর্সের সাথে ডাইনামিক এক্সপ্রেশন যুক্ত করুন

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

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

টাইলস এই গতিশীল সম্পত্তি ধরনের সমর্থন করে:

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

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

নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে 3 সংখ্যা ব্যবহার করে হার্টের হারের আপডেট প্রদর্শন করা যায়, যার ফলব্যাক মান --

কোটলিন

import androidx.wear.protolayout.material.Text

public 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(),
                StringLayoutConstraint.Builder("000")
                    .build()
                ).build()
            )
        ).build()
    )

জাভা

import androidx.wear.protolayout.material.Text;

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull TileRequest requestParams
) {
    return Futures.immediateFuture(new Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
        .setTileTimeline(Timeline.fromLayoutElement(
            new Text.Builder(
                this,
                new TypeBuilders.StringProp.Builder("--")
                    .setDynamicValue(PlatformHealthSources.heartRateBpm()
                        .format()
                        .concat(DynamicBuilders.DynamicString.constant(" bpm")))
                    .build(),
                new StringLayoutConstraint.Builder("000")
                    .build()
                ).build())
        ).build()
    );
}

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

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

আপনি নিরাপদে একটি টাইলে নিম্নলিখিত অভিব্যক্তিগুলির সেট যোগ করতে পারেন, কারণ সেখানে মোট অভিব্যক্তি নেই৷ অতএব, টাইল সঠিকভাবে আচরণ করে:

কোটলিন

val personHealthInfo = DynamicString.constant("This person has walked ")
    .concat(PlatformHealthSources.dailySteps()
        .div(1000)
        .format())
    .concat("thousands of steps and has a current heart rate ")
    .concat(PlatformHealthSources.heartRateBpm()
        .format())
    .concat(" beats per minute")

জাভা

DynamicString personHealthInfo =
    DynamicString.constant("This person has walked ")
        .concat(PlatformHealthSources.dailySteps()
            .div(1000)
            .format())
        .concat("thousands of steps and has a current heart rate ")
        .concat(PlatformHealthSources.heartRateBpm()
            .format())
        .concat(" beats per minute");

যাইহোক, এই টাইলের অনেকগুলি অভিব্যক্তি থাকতে পারে:

কোটলিন

// Note that this template is applied as many times as the loop iterates.
// The system doesn't reuse dynamic expressions.
val dynamicStringTemplate = PlatformHealthSources.dailySteps()
    .div(1000)
    .format()

for (person in people) {
  // SomeProperty
    .setDynamicValue(
        DynamicBuilders.DynamicString.constant("Steps for ")
            .concat(person)
            .concat(" are ")
            .concat(dynamicStringTemplate)
    )
}

জাভা

// Note that this template is applied as many times as the loop iterates.
// The system doesn't reuse dynamic expressions.
DynamicString dynamicStringTemplate =
    PlatformHealthSources.dailySteps()
        .div(1000)
        .format();

for (int i = 0; i < people.size(); i++) {
  // SomeProperty
    .setDynamicValue(
        DynamicBuilders.DynamicString.constant("Steps for ")
            .concat(people[i])
            .concat(" are ")
            .concat(dynamicStringTemplate)
    );
}

একটি রাষ্ট্র বস্তুর মধ্যে গতিশীল তথ্য একত্রীকরণ

আপনি ডেটা উত্স থেকে আপডেটের সর্বশেষ সেটকে একটি রাজ্যে একত্রিত করতে পারেন, যা আপনি মান রেন্ডারিংয়ের জন্য আপনার টাইলের কাছে দিয়ে যান৷

আপনার টাইলগুলিতে রাষ্ট্রীয় তথ্য ব্যবহার করতে, এই পদক্ষেপগুলি সম্পূর্ণ করুন:

  1. কীগুলির একটি সেট স্থাপন করুন যা আপনার টাইলের অবস্থার বিভিন্ন মান উপস্থাপন করে। এই উদাহরণটি জল খাওয়ার জন্য কী এবং একটি নোট তৈরি করে:

    কোটলিন

    companion object {
        val KEY_WATER_INTAKE = AppDataKey<DynamicInt32>("water_intake")
        val KEY_NOTE = AppDataKey<DynamicString>("note")
    }
    

    জাভা

    private static final AppDataKey<DynamicInt32> KEY_WATER_INTAKE =
        new AppDataKey<DynamicInt32>("water_intake");
    private static final AppDataKey<DynamicString> KEY_NOTE =
        new AppDataKey<DynamicString>("note");
    
  2. আপনার onTileRequest() এর বাস্তবায়নে, setState() কল করুন এবং প্রতিটি কী থেকে একটি নির্দিষ্ট গতিশীল ডেটা মানতে প্রাথমিক ম্যাপিং স্থাপন করুন:

    কোটলিন

    override fun onTileRequest(requestParams: TileRequest):
            ListenableFuture<Tile> {
        val state = State.Builder()
            .addKeyToValueMapping(KEY_WATER_INTAKE,
                DynamicDataBuilders.DynamicDataValue.fromInt(200))
            .addKeyToValueMapping(KEY_NOTE,
                DynamicDataBuilders.DynamicDataValue.fromString("Note about day"))
        .build()
        // ...
    
        return Futures.immediateFuture(Tile.Builder()
            // Set resources, timeline, and other tile properties.
            .setState(state)
            .build()
        )
    

    জাভা

    @Override
    protected ListenableFuture<Tile> onTileRequest(
                ListenableFuture<Tile> {
        State state = new State.Builder()
            .addKeyToValueMapping(KEY_WATER_INTAKE,
                DynamicDataBuilders.DynamicDataValue.fromInt(200))
            .addKeyToValueMapping(KEY_NOTE,
                DynamicDataBuilders.DynamicDataValue.fromString("Note about day"))
        .build();
        // ...
    
        return Futures.immediateFuture(Tile.Builder()
            // Set resources, timeline, and other tile properties.
            .setState(state)
            .build()
        );
    }
    
  3. আপনি যখন আপনার লেআউট তৈরি করেন, এমন জায়গায় যেখানে আপনি রাজ্য থেকে এই ডেটা দেখাতে চান, একটি Dynamic* টাইপ অবজেক্ট ব্যবহার করুন। পূর্ববর্তী মান থেকে বর্তমান মান পর্যন্ত একটি অ্যানিমেশন দেখানোর জন্য আপনি animate() কল করতে পারেন:

    কোটলিন

    DynamicInt32.from(KEY_WATER_INTAKE).animate()
    

    জাভা

    DynamicInt32.from(KEY_WATER_INTAKE).animate();
    
  4. যখন প্রয়োজন, আপনি নতুন মান সহ রাষ্ট্র আপডেট করতে পারেন। এটি একটি টাইলের LoadAction অংশ হতে পারে।

    এই উদাহরণে, জল গ্রহণের মান 400 এ আপডেট করা হয়েছে:

    কোটলিন

    val loadAction = LoadAction.Builder()
        .setRequestState(
            State.Builder()
                .addKeyToValueMapping(
                    KEY_WATER_INTAKE,
                    DynamicDataBuilders.DynamicDataValue.fromInt(400)
                )
                .build()
        )
        .build()
    

    জাভা

    LoadAction loadAction = new LoadAction.Builder()
        .setRequestState(
            new State.Builder()
                .addKeyToValueMapping(
                    KEY_WATER_INTAKE,
                    DynamicDataBuilders.DynamicDataValue.fromInt(400)
                ).build()
        ).build();
    
{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}