عرض التحديثات الديناميكية في المربّعات

اعتبارًا من الإصدار 1.2 من ميزة "المربّعات"، يمكنك بثّ تعديلات بيانات المنصة باستخدام التعبيرات الديناميكية. ويمكنك بعد ذلك ربط هذه التعديلات برسوم متحركة في مربّعاتك. يتلقّى تطبيقك تعديلات على هذه القيمة كل ثانية.

باستخدام التعبيرات الديناميكية، لن تحتاج إلى إعادة تحميل المربّع بالكامل عند تغيُّر محتواه. لإنشاء تجربة أكثر جاذبية في مربّعاتك، أضِف صورًا متحركة إلى هذه العناصر الديناميكية.

ربط التعبيرات الديناميكية بمصادر البيانات

تحتوي النطاقان androidx.wear.protolayout وandroidx.wear.protolayout.material على العديد من الفئات التي تقبل حقولها تعبيرات ديناميكية. تشمل العديد من الأمثلة ما يلي:

لاستخدام تعبير ديناميكي كقيمة محتملة لعنصر في مربّعك، استخدِم نوع السمة الديناميكية *Prop المناسب للعنصر وأدخِل مصدر البيانات إلى setDynamicValue() طريقة فئة أداة إنشاء نوع السمة الديناميكية.

تتيح المربّعات أنواع المواقع الديناميكية التالية:

عند استخدام تعبير ديناميكي يؤثر في الأبعاد المادية، أي أي قيمة في فسيفساء باستثناء اللون، يجب أيضًا تحديد مجموعة من القيود ذات الصلة، مثل تنسيق سلسلة. تسمح هذه القيود لبرنامج عرض النظام بتحديد الحد الأقصى للمساحة التي يمكن أن تشغلها قيمة معيّنة ضمن مربّع البيانات. وعادةً ما يتم تحديد هذه القيود على مستوى العنصر، وليس على مستوى التعبير الديناميكي، من خلال استدعاء طريقة تبدأ بالرمز setLayoutConstraintsForDynamic*.

يوضّح المقتطف التالي من الرمز البرمجي كيفية عرض آخر المعلومات عن معدل ضربات القلب باستخدام 3 أرقام، مع قيمة احتياطية هي --:

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. أنشئ مجموعة من المفاتيح التي تمثّل القيم المختلفة لحالة الشاشة المصغّرة. ينشئ هذا المثال مفاتيح لمقدار استهلاك المياه وملاحظة:

    Kotlin

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

    Java

    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() وأنشئ عمليات ربط أولية من كل مفتاح إلى قيمة بيانات ديناميكية معيّنة:

    Kotlin

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

    Java

    @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() لمحاولة عرض صورة متحركة من القيمة السابقة إلى القيمة الحالية:

    Kotlin

    DynamicInt32.from(KEY_WATER_INTAKE).animate()

    Java

    DynamicInt32.from(KEY_WATER_INTAKE).animate();
  4. يمكنك أيضًا تعديل الحالة بقيم جديدة عند الحاجة. ويمكن أن يكون جزءًا من LoadAction مربّع المعلومات.

    في هذا المثال، تم تعديل قيمة استهلاك المياه إلى 400:

    Kotlin

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

    Java

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