از نسخه ۱.۲ به بعد، میتوانید بهروزرسانیهای دادههای پلتفرم را با استفاده از عبارات پویا (dynamic expressions ) استریم کنید. سپس میتوانید این بهروزرسانیها را با انیمیشنهای موجود در کاشیهای خود مرتبط کنید. برنامه شما هر ثانیه بهروزرسانیهایی را برای این مقدار دریافت میکند.
با استفاده از عبارات پویا، نیازی نیست وقتی محتوای یک کاشی تغییر میکند، کل آن را رفرش کنید. برای ایجاد یک تجربه جذابتر در کاشیهای خود، آن اشیاء پویا را متحرک کنید.
عبارات پویا را با منابع داده مرتبط کنید
فضاهای نام 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* شروع میشود، مشخص میکنید.
قطعه کد زیر نحوه نمایش بهروزرسانیهای ضربان قلب را با استفاده از ۳ رقم، با مقدار جایگزین -- نشان میدهد:
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 محدودیتی برای تعداد عباراتی که یک کاشی میتواند داشته باشد، قائل است . اگر یک کاشی شامل عبارات پویای زیادی باشد، مقادیر پویا نادیده گرفته میشوند و سیستم به مقادیر ایستایی که شما به انواع ویژگیهای پویای مربوطه ارائه میدهید، برمیگردد.
ادغام دادههای پویا در یک شیء وضعیت
شما میتوانید آخرین مجموعه بهروزرسانیها از منابع داده را در یک وضعیت (state) تجمیع کنید، که آن را برای رندر کردن مقادیر به کاشی خود منتقل میکنید.
برای استفاده از اطلاعات ایالت در کاشیهای خود، این مراحل را انجام دهید:
مجموعهای از کلیدها را ایجاد کنید که نشاندهندهی مقادیر مختلف حالت کاشی شما باشند. این مثال کلیدهایی برای ورودی آب و یک یادداشت 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یک کاشی باشد.در این مثال، مقدار ورودی آب به
400بهروزرسانی میشود:val loadAction = loadAction( dynamicDataMapOf( KEY_WATER_INTAKE mapTo 400, KEY_NOTE mapTo "Outstanding" ) )
برای شما توصیه میشود
- توجه: متن لینک زمانی نمایش داده میشود که جاوا اسکریپت غیرفعال باشد.
- مهاجرت به فضاهای نام ProtoLayout
- شروع کار با کاشیها
- ملاحظات دیگر