ตั้งแต่ Tiles 1.2 เป็นต้นไป คุณสามารถสตรีมการอัปเดตข้อมูลแพลตฟอร์มโดยใช้ Expression แบบไดนามิก จากนั้นคุณจะเชื่อมโยงการอัปเดตเหล่านี้กับภาพเคลื่อนไหวใน Tiles ได้ แอปจะได้รับการอัปเดตค่านี้ทุกวินาที
การใช้ Expression แบบไดนามิกจะช่วยให้คุณไม่จำเป็นต้องรีเฟรชทั้ง Tile เมื่อเนื้อหาเปลี่ยนแปลง หากต้องการสร้างประสบการณ์การใช้งานที่น่าสนใจยิ่งขึ้นใน Tiles ให้สร้างภาพเคลื่อนไหวให้กับออบเจ็กต์แบบไดนามิกเหล่านั้น
เชื่อมโยง Expression แบบไดนามิกกับแหล่งข้อมูล
เนมสเปซ androidx.wear.protolayout และ androidx.wear.protolayout.material
มีคลาสมากมายที่มีช่องที่รับ Expression แบบไดนามิก ตัวอย่างบางส่วนมีดังนี้
- ค่าความยาวหลายค่า รวมถึงความยาวของออบเจ็กต์
Arcและ ความยาวของออบเจ็กต์CircularProgressIndicator - สีใดก็ได้ เช่น สีเนื้อหาของออบเจ็กต์
Button - ค่าสตริงมากมาย รวมถึงเนื้อหาของออบเจ็กต์
Textเนื้อหาของออบเจ็กต์LayoutElementsBuilders.Textและ คำอธิบายเนื้อหาของออบเจ็กต์CircularProgressIndicator
หากต้องการใช้ Expression แบบไดนามิกเป็นค่าที่เป็นไปได้สำหรับองค์ประกอบใน Tile ให้ใช้ประเภทพร็อพเพอร์ตี้แบบไดนามิก *Prop ที่เกี่ยวข้องขององค์ประกอบ และส่งแหล่งข้อมูลไปยังเมธอด setDynamicValue() ของคลาส Builder ของประเภทพร็อพเพอร์ตี้แบบไดนามิก
Tiles รองรับประเภทพร็อพเพอร์ตี้แบบไดนามิกต่อไปนี้
- สำหรับขนาดเชิงเส้นที่วัดเป็นพิกเซลอิสระของจอแสดงผล ให้ใช้
DimensionBuilders.DpProp - สำหรับขนาดเชิงมุมที่วัดเป็นองศา ให้ใช้
DimensionBuilders.DegreesProp - สำหรับค่าสตริง ให้ใช้
TypeBuilders.StringProp - สำหรับค่าสี ให้ใช้
ColorBuilders.ColorProp. - สำหรับค่าทศนิยม ให้ใช้
TypeBuilders.FloatProp
เมื่อใช้ 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 ให้ทำตามขั้นตอนต่อไปนี้
สร้างชุดคีย์ที่แสดงค่าต่างๆ ของสถานะ Tile ตัวอย่างนี้สร้างคีย์สำหรับการดื่มน้ำและบันทึกย่อ 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ของ Tileในตัวอย่างนี้ ค่าการดื่มน้ำจะอัปเดตเป็น
400val loadAction = loadAction( dynamicDataMapOf( KEY_WATER_INTAKE mapTo 400, KEY_NOTE mapTo "Outstanding" ) )
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- ย้ายข้อมูลไปยังเนมสเปซ ProtoLayout
- เริ่มต้นใช้งาน Tiles
- ปัจจัยอื่นๆ ที่ควรพิจารณา