ตั้งแต่ Tiles 1.2 เป็นต้นไป คุณสามารถสตรีมการอัปเดตข้อมูลแพลตฟอร์มโดยใช้นิพจน์ แบบไดนามิก จากนั้นคุณจะเชื่อมโยงการอัปเดตเหล่านี้กับภาพเคลื่อนไหวในไทล์ได้ แอปจะได้รับการอัปเดตค่านี้ทุกวินาที
การใช้นิพจน์แบบไดนามิกทำให้คุณไม่จำเป็นต้องรีเฟรชทั้งไทล์เมื่อเนื้อหาของไทล์มีการเปลี่ยนแปลง หากต้องการสร้างประสบการณ์การใช้งานที่น่าสนใจยิ่งขึ้นในวิดเจ็ต ให้สร้างภาพเคลื่อนไหว ให้กับออบเจ็กต์แบบไดนามิกเหล่านั้น
เชื่อมโยงนิพจน์แบบไดนามิกกับแหล่งข้อมูล
เนมสเปซ androidx.wear.protolayout และ androidx.wear.protolayout.material
มีคลาสหลายคลาสซึ่งฟิลด์ของคลาสยอมรับนิพจน์แบบไดนามิก ตัวอย่าง
มีดังนี้
- ค่าความยาวหลายค่า รวมถึงความยาวของออบเจ็กต์
Arcและ ความยาวของออบเจ็กต์CircularProgressIndicator - สีใดก็ได้ เช่น สีเนื้อหาของ
Buttonออบเจ็กต์ - ค่าสตริงหลายค่า รวมถึงเนื้อหาของออบเจ็กต์
Text, เนื้อหาของออบเจ็กต์LayoutElementsBuilders.Textและเนื้อหา คำอธิบายของออบเจ็กต์CircularProgressIndicator
หากต้องการใช้นิพจน์แบบไดนามิกเป็นค่าที่เป็นไปได้สำหรับองค์ประกอบในไทล์ ให้ใช้*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 จำกัดจำนวนนิพจน์ที่การ์ดเดียวมีได้ หากไทล์มีนิพจน์แบบไดนามิกรวมมากเกินไป ระบบจะ ไม่สนใจค่าแบบไดนามิก และจะกลับไปใช้ค่าคงที่ที่คุณระบุให้กับ ประเภทพร็อพเพอร์ตี้แบบไดนามิกที่เกี่ยวข้อง
รวมข้อมูลแบบไดนามิกลงในออบเจ็กต์สถานะ
คุณสามารถรวมชุดการอัปเดตล่าสุดจากแหล่งข้อมูลไว้ในสถานะ ซึ่งคุณส่งไปยังไทล์เพื่อการแสดงค่าได้
หากต้องการใช้ข้อมูลสถานะในวิดเจ็ต ให้ทำตามขั้นตอนต่อไปนี้
สร้างชุดคีย์ที่แสดงค่าต่างๆ ของสถานะไทล์ ตัวอย่างนี้สร้างคีย์สำหรับการดื่มน้ำและโน้ต qqq
companion object { val KEY_WATER_INTAKE = intAppDataKey("key_water_intake") val KEY_NOTE = stringAppDataKey("key_note") }
ในการติดตั้งใช้งาน
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() ) }
เมื่อสร้างเลย์เอาต์ ในตำแหน่งที่คุณต้องการแสดงข้อมูลนี้ จากสถานะ ให้ใช้ออบเจ็กต์ประเภท
Dynamic*นอกจากนี้ คุณยังเรียกใช้animate()เพื่อ แสดงภาพเคลื่อนไหวจากค่าก่อนหน้าไปยังค่าปัจจุบันได้ด้วยval waterIntakeValue = DynamicBuilders.DynamicInt32.from(KEY_WATER_INTAKE)
นอกจากนี้ คุณยังอัปเดตสถานะด้วยค่าใหม่ได้เมื่อต้องการ ซึ่งอาจเป็นส่วนหนึ่งของ
LoadActionของไทล์ในตัวอย่างนี้ ค่าการดื่มน้ำจะอัปเดตเป็น
400val loadAction = loadAction( dynamicDataMapOf( KEY_WATER_INTAKE mapTo 400, KEY_NOTE mapTo "Outstanding" ) )
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- ย้ายข้อมูลไปยังเนมสเปซ ProtoLayout
- เริ่มต้นใช้งานไทล์
- ข้อควรพิจารณาอื่นๆ