แสดงการอัปเดตแบบไดนามิกในการ์ด

ตั้งแต่ Tiles 1.2 เป็นต้นไป คุณสามารถสตรีมการอัปเดตข้อมูลแพลตฟอร์มโดยใช้ Expression แบบไดนามิก จากนั้นคุณจะเชื่อมโยงการอัปเดตเหล่านี้กับภาพเคลื่อนไหวใน Tiles ได้ แอปจะได้รับการอัปเดตค่านี้ทุกวินาที

การใช้ Expression แบบไดนามิกจะช่วยให้คุณไม่จำเป็นต้องรีเฟรชทั้ง Tile เมื่อเนื้อหาเปลี่ยนแปลง หากต้องการสร้างประสบการณ์การใช้งานที่น่าสนใจยิ่งขึ้นใน Tiles ให้สร้างภาพเคลื่อนไหวให้กับออบเจ็กต์แบบไดนามิกเหล่านั้น

เชื่อมโยง Expression แบบไดนามิกกับแหล่งข้อมูล

เนมสเปซ androidx.wear.protolayout และ androidx.wear.protolayout.material มีคลาสมากมายที่มีช่องที่รับ Expression แบบไดนามิก ตัวอย่างบางส่วนมีดังนี้

หากต้องการใช้ Expression แบบไดนามิกเป็นค่าที่เป็นไปได้สำหรับองค์ประกอบใน Tile ให้ใช้ประเภทพร็อพเพอร์ตี้แบบไดนามิก *Prop ที่เกี่ยวข้องขององค์ประกอบ และส่งแหล่งข้อมูลไปยังเมธอด setDynamicValue() ของคลาส Builder ของประเภทพร็อพเพอร์ตี้แบบไดนามิก

Tiles รองรับประเภทพร็อพเพอร์ตี้แบบไดนามิกต่อไปนี้

เมื่อใช้ Expression แบบไดนามิกที่ส่งผลต่อขนาดทางกายภาพ (ค่าใดก็ได้ใน Tile ยกเว้นสี) คุณต้องระบุชุดข้อจำกัดที่เกี่ยวข้องด้วย เช่น รูปแบบสตริง ข้อจำกัดเหล่านี้ช่วยให้ตัวแสดงผลของระบบกำหนดพื้นที่สูงสุดที่ค่าหนึ่งๆ สามารถใช้ได้ภายใน Tile โดยปกติแล้ว คุณจะระบุข้อจำกัดเหล่านี้ที่ระดับองค์ประกอบ ไม่ใช่ที่ระดับ Expression แบบไดนามิก โดยเรียกใช้เมธอดที่ขึ้นต้นด้วย 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()
    )

ใช้ Expression จำนวนเล็กน้อยภายใน Tile เดียว

Wear OS จำกัดจำนวน Expression ที่ Tile เดียวสามารถ มีได้ หาก Tile มี Expression แบบไดนามิกทั้งหมดมากเกินไป ระบบจะละเว้นค่าแบบไดนามิก และกลับไปใช้ค่าคงที่ที่คุณระบุไว้สำหรับประเภทพร็อพเพอร์ตี้แบบไดนามิกที่เกี่ยวข้อง

รวมข้อมูลแบบไดนามิกไว้ในออบเจ็กต์สถานะ

คุณสามารถรวมชุดการอัปเดตล่าสุดจากแหล่งข้อมูลไว้ใน สถานะ, ซึ่งคุณจะส่งไปยัง Tile เพื่อแสดงค่า

หากต้องการใช้ข้อมูลสถานะใน Tiles ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างชุดคีย์ที่แสดงค่าต่างๆ ของสถานะ Tile ตัวอย่างนี้สร้างคีย์สำหรับการดื่มน้ำและบันทึกย่อ 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 ของ Tile

    ในตัวอย่างนี้ ค่าการดื่มน้ำจะอัปเดตเป็น 400

    val loadAction =
        loadAction(
            dynamicDataMapOf(
                KEY_WATER_INTAKE mapTo 400,
                KEY_NOTE mapTo "Outstanding"
            )
        )