نمایش به روز رسانی های پویا در کاشی ها

با شروع در Tiles 1.2، می‌توانید به‌روزرسانی‌های داده‌های پلتفرم را با استفاده از عبارات پویا پخش کنید. سپس می توانید این به روز رسانی ها را با انیمیشن های موجود در کاشی های خود مرتبط کنید. برنامه شما هر ثانیه به‌روزرسانی‌هایی با این مقدار دریافت می‌کند.

با استفاده از عبارات پویا، وقتی محتوای کاشی تغییر می کند، نیازی به بازخوانی کل کاشی ندارید. برای ایجاد یک تجربه جذاب تر در کاشی های خود، آن اشیاء پویا را متحرک کنید.

عبارات پویا را با منابع داده مرتبط کنید

فضاهای نام androidx.wear.protolayout و androidx.wear.protolayout.material شامل کلاس های زیادی هستند که فیلدهای آنها عبارات پویا را می پذیرند. چندین مثال شامل موارد زیر است:

برای استفاده از یک عبارت پویا به عنوان مقدار ممکن برای یک عنصر در کاشی خود، از نوع ویژگی *Prop dynamic مربوط به عنصر استفاده کنید و منبع داده را به متد setDynamicValue() کلاس سازنده نوع خاصیت دینامیک ارسال کنید.

کاشی ها از این نوع ویژگی های پویا پشتیبانی می کنند:

وقتی از یک عبارت پویا استفاده می‌کنید که بر ابعاد فیزیکی تأثیر می‌گذارد - هر مقدار در کاشی به جز رنگ - باید مجموعه‌ای از محدودیت‌های مرتبط مانند قالب رشته را نیز مشخص کنید. این محدودیت ها به رندر سیستم اجازه می دهد حداکثر فضایی را که یک مقدار می تواند در کاشی شما اشغال کند را تعیین کند. معمولاً با فراخوانی متدی که با 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 به روز می شود:

    کاتلین

    state.addKeyToValueMapping(KEY_WATER_INTAKE,
            DynamicDataBuilders.DynamicDataValue.fromInt(400))
    

    جاوا

    state.addKeyToValueMapping(KEY_WATER_INTAKE,
            DynamicDataBuilders.DynamicDataValue.fromInt(400));
    
{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}