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

از نسخه ۱.۲ به بعد، می‌توانید به‌روزرسانی‌های داده‌های پلتفرم را با استفاده از عبارات پویا (dynamic expressions ) استریم کنید. سپس می‌توانید این به‌روزرسانی‌ها را با انیمیشن‌های موجود در کاشی‌های خود مرتبط کنید. برنامه شما هر ثانیه به‌روزرسانی‌هایی را برای این مقدار دریافت می‌کند.

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

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

فضاهای نام 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 محدودیتی برای تعداد عباراتی که یک کاشی می‌تواند داشته باشد، قائل است . اگر یک کاشی شامل عبارات پویای زیادی باشد، مقادیر پویا نادیده گرفته می‌شوند و سیستم به مقادیر ایستایی که شما به انواع ویژگی‌های پویای مربوطه ارائه می‌دهید، برمی‌گردد.

ادغام داده‌های پویا در یک شیء وضعیت

شما می‌توانید آخرین مجموعه به‌روزرسانی‌ها از منابع داده را در یک وضعیت (state) تجمیع کنید، که آن را برای رندر کردن مقادیر به کاشی خود منتقل می‌کنید.

برای استفاده از اطلاعات ایالت در کاشی‌های خود، این مراحل را انجام دهید:

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

{% کلمه به کلمه %} {% فعل کمکی %} {% کلمه به کلمه %} {% فعل کمکی %}