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

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

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

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

เนมสเปซ androidx.wear.protolayout และ androidx.wear.protolayout.material มีคลาสหลายคลาสซึ่งฟิลด์ของคลาสยอมรับนิพจน์แบบไดนามิก ตัวอย่าง มีดังนี้

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

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

  • สำหรับขนาดเชิงเส้นที่วัดเป็นพิกเซลอิสระของจอแสดงผล ให้ใช้ DimensionBuilders.DpProp
  • สําหรับมิติข้อมูลเชิงมุมที่วัดเป็นองศา ให้ใช้ DimensionBuilders.DegreesProp
  • สำหรับค่าสตริง ให้ใช้ TypeBuilders.StringProp
  • สำหรับค่าสี ให้ใช้ ColorBuilders.ColorProp
  • สําหรับค่าทศนิยม ให้ใช้ TypeBuilders.FloatProp

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