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

از «کاشی‌های ۱.۲» به بعد، می‌توانید به‌روزرسانی‌های داده‌های پلاتفرم را بااستفاده از عبارت‌های پویا جاری‌سازی کنید. سپس می‌توانید این به‌روزرسانی‌ها را با پویانمایی‌های موجود در کاشی‌هایتان مرتبط کنید. برنامه شما هر ثانیه برای این مقدار به‌روزرسانی دریافت می‌کند.

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

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

فضاهای نام 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"
            )
        )