اعتبارًا من الإصدار 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 حدًا أقصى لعدد التعبيرات التي يمكن أن يحتوي عليها مربّع واحد. إذا كان المربّع يحتوي على عدد كبير جدًا من التعبيرات الديناميكية، يتم تجاهل القيم الديناميكية، ويعود النظام إلى القيم الثابتة التي تقدّمها لأنواع المواقع الديناميكية ذات الصلة.
دمج البيانات الديناميكية في عنصر حالة
يمكنك تجميع أحدث مجموعة من التعديلات من مصادر البيانات في حالة، ثم تمريرها إلى مربّعك لعرض القيم.
لاستخدام معلومات الحالة في مربّعاتك، يُرجى إكمال الخطوات التالية:
أنشئ مجموعة من المفاتيح التي تمثّل القيم المختلفة لحالة الشاشة المصغّرة. ينشئ هذا المثال مفاتيح لمقدار استهلاك المياه وملاحظة:
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");
في عملية تنفيذ
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() ); }
عند إنشاء التنسيق، استخدِم عنصرًا من النوع
Dynamic*
في المكان الذي تريد عرض هذه البيانات فيه من الحالة. يمكنك أيضًا استدعاءanimate()
لمحاولة عرض صورة متحركة من القيمة السابقة إلى القيمة الحالية:Kotlin
DynamicInt32.from(KEY_WATER_INTAKE).animate()
Java
DynamicInt32.from(KEY_WATER_INTAKE).animate();
يمكنك أيضًا تعديل الحالة بقيم جديدة عند الحاجة. ويمكن أن يكون جزءًا من
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();
أفلام مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما تكون لغة JavaScript غير مفعّلة.
- الانتقال إلى مساحات أسماء ProtoLayout
- بدء استخدام المربّعات
- اعتبارات أخرى