لبدء توفير مربّعات معلومات من تطبيقك، أدرِج التبعيات التالية فيملفbuild.gradle
الخاص بتطبيقك.
رائع
dependencies { // Use to implement support for wear tiles implementation "androidx.wear.tiles:tiles:1.4.1" // Use to utilize standard components and layouts in your tiles implementation "androidx.wear.protolayout:protolayout:1.2.1" // Use to utilize components and layouts with Material Design in your tiles implementation "androidx.wear.protolayout:protolayout-material:1.2.1" // Use to include dynamic expressions in your tiles implementation "androidx.wear.protolayout:protolayout-expression:1.2.1" // Use to preview wear tiles in your own app debugImplementation "androidx.wear.tiles:tiles-renderer:1.4.1" // Use to fetch tiles from a tile provider in your tests testImplementation "androidx.wear.tiles:tiles-testing:1.4.1" }
Kotlin
dependencies { // Use to implement support for wear tiles implementation("androidx.wear.tiles:tiles:1.4.1") // Use to utilize standard components and layouts in your tiles implementation("androidx.wear.protolayout:protolayout:1.2.1") // Use to utilize components and layouts with Material Design in your tiles implementation("androidx.wear.protolayout:protolayout-material:1.2.1") // Use to include dynamic expressions in your tiles implementation("androidx.wear.protolayout:protolayout-expression:1.2.1") // Use to preview wear tiles in your own app debugImplementation("androidx.wear.tiles:tiles-renderer:1.4.1") // Use to fetch tiles from a tile provider in your tests testImplementation("androidx.wear.tiles:tiles-testing:1.4.1") }
المفاهيم الرئيسية
لا يتم إنشاء التطبيقات المصغّرة بالطريقة نفسها التي يتم بها إنشاء تطبيقات Android، وتستخدِم مفاهيم مختلفة:
- نماذج التنسيق: يمكنك تحديد الترتيب العام للعناصر المرئية على الشاشة. ويتم تنفيذ ذلك من خلال الدالة
primaryLayout()
. - عناصر التنسيق: تمثّل عنصرًا رسوميًا فرديًا، مثل زر أو بطاقة، أو عدة عناصر من هذا النوع مجمّعة معًا باستخدام عمود أو buttonGroup أو ما شابه ذلك. ويتم تضمينها في نموذج تنسيق.
- الموارد: تتألف عناصر
ResourceBuilders.Resources
من خريطة لزوجات المفاتيح والقيم لموارد Android (الصور) المطلوبة لمحاولة عرض تنسيق، وإصدار. - المخطط الزمني: كائن
TimelineBuilders.Timeline
هو قائمة بمثيل واحد أو أكثر من كائن تنسيق. يمكنك توفير آليات وتعبيرات مختلفة للإشارة إلى الحالات التي يجب فيها أن يبدّل المشغّل عنصر تنسيق واحدًا إلى آخر، مثل إيقاف عرض تنسيق في وقت محدّد. - الحالة: هي بنية بيانات من النوع
StateBuilders.State
يتم تمريرها بين المربّع والتطبيق، ما يتيح للعنصرَين التواصل مع بعضهما. على سبيل المثال، إذا تم النقر على زر في المربّع، تحتفظ الحالة بمعرّف الزر. يمكنك أيضًا تبديل أنواع البيانات باستخدام خريطة. - الشريحة: عنصر
TileBuilders.Tile
يمثّل شريحة، ويتألّف من مخطط زمني ورقم تعريف إصدار الموارد وفاصل الحداثة والحالة. - Protolayout: يظهر هذا المصطلح في اسم فئات مختلفة مرتبطة بالبلاط ويشير إلى مكتبة Protolayout في Wear OS، وهي مكتبة رسومات يتم استخدامها في مساحات العرض المختلفة في Wear OS.
إنشاء مربّع
لتوفير مربّع معلومات من تطبيقك، عليك تنفيذ خدمة من النوع TileService
وتسجيلها في بيان التطبيق. بناءً على ذلك، يطلب النظام
اللوحات اللازمة أثناء طلبات البيانات إلى onTileRequest()
والموارد أثناء طلبات البيانات إلى
onTileResourcesRequest()
.
class MyTileService : TileService() { override fun onTileRequest(requestParams: RequestBuilders.TileRequest) = Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline( Timeline.fromLayoutElement( materialScope(this, requestParams.deviceConfiguration) { primaryLayout( mainSlot = { text("Hello, World!".layoutString, typography = BODY_LARGE) } ) } ) ) .build() ) override fun onTileResourcesRequest(requestParams: ResourcesRequest) = Futures.immediateFuture( Resources.Builder().setVersion(RESOURCES_VERSION).build() ) }
بعد ذلك، أضِف خدمة داخل علامة <application>
في ملف AndroidManifest.xml
.
<service android:name=".snippets.m3.tile.MyTileService" android:label="@string/tile_label" android:description="@string/tile_description" android:icon="@mipmap/ic_launcher" android:exported="true" android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER"> <intent-filter> <action android:name="androidx.wear.tiles.action.BIND_TILE_PROVIDER" /> </intent-filter> <meta-data android:name="androidx.wear.tiles.PREVIEW" android:resource="@drawable/tile_preview" /> </service>
يسجِّل فلتر الأذونات والنوايا هذه الخدمة كمقدّم مربّعات معلومات.
يظهر للمستخدم رمز المربّع وتسميته ووصفه ومصدر المعاينة عند ضبط مربّعات الشاشة على هاتفه أو ساعته. يُرجى العِلم أنّ مرجع المعاينة يتيح استخدام جميع محدّدات الموارد العادية في Android، لذا من الممكن تغيير المعاينة وفقًا لعوامل مثل حجم الشاشة ولغة الجهاز. اطّلِع على قائمة التحقّق من المعاينة للحصول على اقتراحات إضافية.
يمكنك نشر تطبيقك وإضافة الشاشة إلى لوحة العرض الدوّارة للشاشات (تتوفّر طريقة أكثر ملاءمةً للمطوّرين لمعاينة شاشة أيضًا، ولكن في الوقت الحالي، يمكنك إجراء ذلك يدويًا).

للحصول على مثال كامل، اطّلِع على نموذج الرمز على GitHub أو codelab.
إنشاء واجهة مستخدم للمربّعات
يتم إنشاء عناصر واجهة المستخدم في Material 3 Expressive باستخدام نهج منظَّم مدعوم من نمط المُنشئ الآمن من النوع في Kotlin.
التنسيق
لإنشاء التنسيق، اتّبِع الخطوات التالية:
بدء نطاق Material Design: استخدِم الدالة
materialScope()
، مع تقديمcontext
وdeviceConfiguration
المطلوبَين. يمكنك تضمين مَعلمات اختيارية، مثلallowDynamicTheme
وdefaultColorScheme
. يكون الخيارallowDynamicTheme
هوtrue
تلقائيًا، ويمثّل الرمزdefaultColorScheme
الرمزColorScheme
المستخدَم عندما لا تكون الألوان الديناميكية متوفّرة، مثلما لو أوقف المستخدم الميزة، أو عندما لا تكون الميزة متاحة على الجهاز، أو عندما يكون الخيارallowDynamicTheme
هوfalse
).إنشاء واجهة المستخدم ضمن النطاق: يجب تحديد جميع مكوّنات واجهة المستخدم لتخطيط شاشة مستطيلة معيّن ضمن دالة lambda لدالة واحدة من المستوى الأعلى materialScope(). وظائف المكوّنات هذه، مثل
primaryLayout()
وtextEdgeButton()
، هي وظائف تمديد فيMaterialScope
ولا تتوفّر إلا عند استدعائها في نطاق المستلِم هذا.materialScope( context = context, deviceConfiguration = requestParams.deviceConfiguration, // requestParams is passed to onTileRequest defaultColorScheme = myFallbackColorScheme ) { // inside the MaterialScope, you can call functions like primaryLayout() primaryLayout( titleSlot = { text(text = "Title".layoutString) }, mainSlot = { text(text = "Main Content".layoutString) }, bottomSlot = { textEdgeButton(text = "Action".layoutString) } ) }
ألعاب المقامرة
في الإصدار 3 من التطبيق، يستخدم تنسيق مربّعات التطبيقات أسلوبًا مستوحى من تطبيق Compose يستخدِم ثلاث مَواضع مختلفة. من أعلى إلى أسفل، تشمل هذه العناصر ما يلي:
- الرمز
titleSlot
، وهو عادةً لعنوان أو عنوان رئيسي mainSlot
، للمحتوى الأساسيbottomSlot
، يُستخدَم غالبًا للإجراءات أو المعلومات التكميلية. ويظهر زرّ الحافة أيضًا في هذا المربّع.

في ما يلي محتوى كل خانة:
-
titleSlot
(اختياري): عادةً ما تكون بضع كلمات تم إنشاؤها بواسطةtext()
. mainSlot
(سمة إلزامية): المكوّنات المنظَّمة في بنى مثل الصفوف والأعمدة ومجموعات الأزرار يمكن أيضًا دمج هذه المكوّنات بشكل متكرّر داخل بعضها البعض، على سبيل المثال، يمكن أن يحتوي عمود على صفوف.-
bottomSlot
(اختياري): يتم عادةً ملء هذا الحقل إما بزر ملتصق بالجانب أو تصنيف نصي.
وبما أنّه لا يمكن الانتقال بين المربّعات، لا تتوفّر عناصر لعرض الصفحات أو الانتقال بينها أو التعامل مع قوائم طويلة من المحتوى. احرص على أن يظل المحتوى مرئيًا عند زيادة حجم الخط أو عندما يصبح النص أطول بسبب الترجمة.
مكونات واجهة المستخدم
توفّر مكتبة protolayout-material3
عددًا كبيرًا من المكوّنات
المصمّمة وفقًا لمواصفات Material 3 Expressive واقتراحات واجهة
المستخدِم.
الأزرار
- textButton(): زر يتضمّن خانة واحدة لمحتوى نصي (قصير)
- iconButton(): زر يحتوي على خانة واحدة لتمثيل رمز
- avatarButton(): زر أفاتار على شكل قرص يقدّم ما يصل إلى ثلاث مَواضع لعرض محتوى يمثّل تصنيفًا متراكمًا عموديًا وتصنيفًا ثانويًا وصورة (أفاتار) بجانبه
- imageButton(): زر صورة قابل للنقر لا يقدّم أماكن إضافية للعناصر، بل يقدّم صورة فقط (مثل backgroundImage كخلفية)
- compactButton(): زر مكثّف يقدّم ما يصل إلى خانتَين لعرض محتوى مُكدَّس أفقيًا يمثّل رمزًا ونصًا بجانبه
- button(): زرّ على شكل قرص يقدّم ما يصل إلى ثلاث خانات لعرض محتوى يمثّل تصنيفًا وتصنيفًا ثانويًا مُرصَّفين عموديًا، ورمزًا بجانبه
أزرار الحافة
- iconEdgeButton(): زر على الحافة يقدّم خانة واحدة لعرض رمز أو محتوى صغير مستدير بشكل مشابه
- textEdgeButton(): زرّ على الحافة يقدّم خانة واحدة لعرض نص أو محتوى طويل وواسع بشكل مشابه
بيانات بطاقات الائتمان
- titleCard(): بطاقة عنوان تتضمّن خانة واحدة أو ثلاث خانات، وتكون عادةً مستندة إلى النص
- appCard(): بطاقة تطبيق تتيح ما يصل إلى خمس خانات، وتكون عادةً مستندة إلى نص
- textDataCard(): بطاقة بيانات تقدّم ما يصل إلى ثلاث خانات مُكدَّسة عموديًا، وتكون عادةً مستندة إلى نص أو رقم
- iconDataCard(): بطاقة بيانات تقدّم ما يصل إلى ثلاث خانات مُكدَّسة عموديًا، وتكون عادةً مستندة إلى نص أو أرقام، مع رمز
- graphicDataCard(): بطاقة بيانات الرسومات التي تقدّم خانة لبيانات الرسومات، مثل مؤشر التقدّم، وما يصل إلى خانتَين مُكدّستَين عموديًا، عادةً للأوصاف النصية
مؤشرات التقدّم
- circularProgressIndicator(): يشير إلى التقدّم نحو هدف باستخدام عنصر شعاعي
- segmentedCircularProgressIndicator(): يشير إلى مستوى التقدّم نحو هدف معيّن باستخدام عنصر شعاعي يتضمّن مراحل مختلفة
تجميع عناصر التنسيق
- buttonGroup(): تنسيق مكوّن يضع عناصره الثانوية في تسلسل أفقي
- primaryLayout(): تنسيق ملء الشاشة الذي يمثّل نمط تنسيق M3 рекомендованный مقترَحًا سريع الاستجابة ويهتم بوضع العناصر، بالإضافة إلى الهوامش والوسائد المقترَحة التي يتم تطبيقها
التصميم
في Material 3 Expressive، يتم تحديد نظام الألوان من خلال 29 دورًا قياسيًا للّون، ويتم تنظيمها في ست مجموعات: الأساسي والثانوي والثالث والأخطاء والسطح والحدود.

يربط ColorScheme
كل دور من هذه الأدوار الـ 29 بلون ملائم، ولأنّه جزء من MaterialScope
ويجب إنشاء المكوّنات داخله، فإنه يأخذ تلقائيًا الألوان من المخطّط. تتيح هذه الطريقة لجميع عناصر واجهة المستخدم
الالتزام تلقائيًا بمعايير Material Design.
للسماح للمستخدمين باختيار نظام ألوان تحدّده بنفسك، مثل نظام يعكس
ألوان علامتك التجارية، ونظام يوفّره النظام، إما من واجهة الساعة
الحالية للمستخدم أو من نظام اختاره المستخدم، يمكنك بدء MaterialScope
على النحو التالي:
val myColorScheme =
ColorScheme(
primary = ...
onPrimary = ...
// 27 more
)
materialScope(
defaultColorScheme = myColorScheme
) {
// If the user selects "no theme" in settings, myColorScheme is used.
// Otherwise, the system-provided theme is used.
}
لفرض ظهور مربّعاتك بالألوان التي تقدّمها، أوقِف ميزة التوافق
مع المظهر الديناميكي من خلال ضبط allowDynamicTheme
على false
:
materialScope(
allowDynamicTheme = false,
defaultColorScheme = myColorScheme
) {
// myColorScheme is *always* used.
}
اللون
يستخدم كل مكوّن فردي مجموعة فرعية من الأدوار الـ 29 للألوان التي يحدّدها ColorScheme
. على سبيل المثال، تستخدِم الأزرار ما يصل إلى أربعة ألوان، يتم أخذها تلقائيًا
من المجموعة "الأساسية" للعنصر ColorScheme
النشط:
الرمز المميّز للمكوّن ButtonColors |
دور ColorScheme |
---|---|
containerColor | أساسي |
iconColor | onPrimary |
labelColor | onPrimary |
secondaryLabelColor | onPrimary (opacity 0.8) |
قد تحتاج إلى الابتعاد عن الرموز التلقائية للألوان لعناصر محددة في واجهة المستخدم. على سبيل المثال، قد تريد استخدام textEdgeButton
واحد لتطبيق
ألوان من المجموعة "الثانوية" أو "الثالثية" بدلاً من المجموعة "الأساسية"، وذلك لشدّ الانتباه وتحقيق تباين أفضل.
يمكنك تخصيص ألوان المكوّنات بعدة طرق:
استخدام دالة مساعدة للألوان المحدّدة مسبقًا: استخدِم دوالّ مساعدة مثل
filledTonalButtonColors()
لتطبيق أنماط الأزرار العادية لتطبيق Material 3 Expressive. تنشئ هذه الدوالّ مثيلات pre-configuredButtonColors
التي تربط الأنماط الشائعة، مثل الملء أو الألوان أو المخططات، بالدور المناسب منColorScheme
النشط ضمنMaterialScope
. يتيح لك ذلك تطبيق أنماط متّسقة بدون تحديد كل لون يدويًا لأنواع الأزرار الشائعة.textEdgeButton( colors = filledButtonColors() // default /* OR colors = filledTonalButtonColors() */ /* OR colors = filledVariantButtonColors() */ // ... other parameters )
بالنسبة إلى البطاقات، استخدِم عائلة الدوالّ
filledCardColors()
المماثلة.يمكنك أيضًا تعديل عنصر
ButtonColors
الذي تعرضه الدوالّ المساعِدة باستخدام طريقةcopy()
إذا كنت بحاجة إلى تغيير رمزين فقط:textEdgeButton( colors = filledButtonColors() .copy( containerColor = colorScheme.tertiary, labelColor = colorScheme.onTertiary ) // ... other parameters )
توفير أدوار ألوان بديلة بشكل صريح: أنشئ عنصر
ButtonColors
خاصًا بك، ثم أعِد توجيهه إلى المكوّن. بالنسبة إلى البطاقات، استخدِم عنصرCardColors
المكافئ.textEdgeButton( colors = ButtonColors( // the materialScope makes colorScheme available containerColor = colorScheme.secondary, iconColor = colorScheme.secondaryDim, labelColor = colorScheme.onSecondary, secondaryLabelColor = colorScheme.onSecondary ) // ... other parameters )
تحديد ألوان ثابتة (يُرجى استخدامها بحذر) على الرغم من أنّه يُنصح بشكل عام بتحديد الألوان حسب دورها الدلالي (مثل
colorScheme.primary
)، يمكنك أيضًا تقديم قيم ألوان مباشرة. يجب استخدام هذا الأسلوب بقدرٍ معقول، لأنّه قد يؤدي إلى حدوث تناقضات مع المظهر العام، خاصةً إذا كان المظهر يتغيّر بشكل ديناميكي.textEdgeButton( colors = filledButtonColors().copy( containerColor = android.graphics.Color.RED.argb, // Using named colors labelColor = 0xFFFFFF00.argb // Using a hex code for yellow ) // ... other parameters )
أسلوب الخط
لإنشاء اتساق مرئي على منصة Wear OS وتحسين الأداء، يتم عرض كل النص على المربّعات باستخدام خط يقدّمه النظام. ويعني ذلك أنّه لا يمكن استخدام خطوط مخصّصة في المربّعات. في الإصدار 6 من نظام التشغيل Wear OS والإصدارات الأحدث، يكون هذا خطًا خاصًا بالمصنّع الأصلي للجهاز. في معظم الحالات، سيكون الخط متغيّرًا، ما يوفّر تجربة أكثر تعبيرًا وإمكانية تحكّم أكثر دقة.
لإنشاء نمط نص، يتم عادةً استخدام طريقة text()
مع الثوابت الطباعية. يتيح لك هذا المكوّن الاستفادة من
أدوار أسلوب الخط المحدّدة مسبقًا في Material 3 Expressive، ما يساعد مربّع البطاقات في
الالتزام بأفضل الممارسات المتّبعة في أسلوب الخط لسهولة القراءة والتسلسل الهرمي.
تقدّم المكتبة مجموعة من 18 متغيّرًا ثابتًا للخطّ الدلالي، مثل
BODY_MEDIUM. وتؤثر هذه الثوابت أيضًا في محاور الخط غير الحجم.
text(
text = "Hello, World!".layoutString,
typography = BODY_MEDIUM,
)
لمزيد من التحكّم، يمكنك تقديم إعدادات إضافية. في الإصدار 6 من Wear OS والإصدارات
الأحدث، من المرجّح استخدام خط متغيّر يمكنك تعديله على طول محوري
الميل والوزن والعرض والاستدارة. يمكنك التحكّم في هذه المحاور
باستخدام المَعلمة settings
:
text(
text = "Hello, World".layoutString,
italic = true,
// Use elements defined in androidx.wear.protolayout.LayoutElementBuilders.FontSetting
settings =
listOf(weight(500), width(100F), roundness(100)),
)
أخيرًا، إذا كنت بحاجة إلى التحكّم في الحجم أو مسافة بين الأحرف (غير مستحسن)،
استخدِم basicText() بدلاً من text()، وأنشئ قيمة لسمة
fontStyle
باستخدام fontStyle().
الشكل والهامش
يمكنك تغيير نصف قطر الزاوية لكل مكوّن تقريبًا باستخدام سمةshape
. تأتي القيم من السمة MaterialScope
shapes
:
textButton(
height = expand(),
width = expand(),
shape = shapes.medium, // OR another value like shapes.full
colors = filledVariantButtonColors(),
labelContent = { text("Hello, World!".layoutString) },
)
بعد تغيير شكل أحد المكوّنات، إذا كنت تعتقد أنّه يترك مساحة
كبيرة جدًا أو صغيرة جدًا حول حافة الشاشة، يمكنك ضبط الهوامش باستخدام المَعلمة
margin
في primaryLayout()
:
primaryLayout(
mainSlot = {
textButton(
shape = shapes.small,
/* ... */
)
},
// margin constants defined in androidx.wear.protolayout.material3.PrimaryLayoutMargins
margins = MAX_PRIMARY_LAYOUT_MARGIN,
)
أقواس
يمكن استخدام العناصر الفرعية التالية للحاويات Arc
:
ArcLine
: لعرض خط منحني حول القوس-
ArcText
: لعرض نص منحني في شكل قوس -
ArcAdapter
: لعرض عنصر تنسيق أساسي في القوس، يتم رسمه عند نقطة مماسة للقوس.
لمزيد من المعلومات، اطّلِع على المستندات المرجعية لكل نوع من أنواع العناصر.
مفاتيح التعديل
يمكن تطبيق عوامل تعديل اختيارية على كل عنصر تنسيق متاح. استخدِم مفاتيح التعديل هذه للأغراض التالية:
- تغيير المظهر المرئي للتنسيق على سبيل المثال، أضِف خلفية أو حدودًا أو مساحة تملأ الفراغ بين عناصر التنسيق.
- أضِف بيانات وصفية عن التنسيق. على سبيل المثال، أضِف مُعدِّلًا للدلالات إلى عنصر التنسيق لاستخدامه مع تطبيقات قراءة الشاشة.
- إضافة وظائف على سبيل المثال، أضِف مُعدِّلًا قابلاً للنقر إلى عنصر التنسيق لجعل مربّع العرض تفاعليًا. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة التفاعل مع المربّعات.
على سبيل المثال، يمكننا تخصيص المظهر التلقائي والبيانات الوصفية لعنصر Image
،
كما هو موضّح في نموذج الرمز البرمجي التالي:
Kotlin
private fun myImage(): LayoutElement = Image.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .setModifiers(Modifiers.Builder() .setBackground(Background.Builder().setColor(argb(0xFFFF0000)).build()) .setPadding(Padding.Builder().setStart(dp(12f)).build()) .setSemantics(Semantics.builder() .setContentDescription("Image description") .build() ).build() ).build()
Java
private LayoutElement myImage() { return new Image.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .setModifiers(new Modifiers.Builder() .setBackground(new Background.Builder().setColor(argb(0xFFFF0000)).build()) .setPadding(new Padding.Builder().setStart(dp(12f)).build()) .setSemantics(new Semantics.Builder() .setContentDescription("Image description") .build() ).build() ).build(); }
العناصر التي يمكن توسيع نطاقها
Spannable
هو نوع خاص من الحاويات يعرض العناصر بشكل مشابه
للنص. يكون هذا مفيدًا عندما تريد تطبيق نمط مختلف على سلسلة فرعية واحدة فقط في كتلة نص أكبر، وهو أمر غير ممكن باستخدام العنصر
Text
.
حاوية Spannable
مليئة بعناصر Span
. ولا يُسمح بعناصر فرعية أخرى أو
مثيلات Spannable
متداخلة.
هناك نوعان من Span
الأطفال:
على سبيل المثال، يمكنك استخدام مائل على كلمة "world" في مربّع "مرحبًا بك" وإدراج صورة بين الكلمات، كما هو موضّح في نموذج الرمز البرمجي التالي:
Kotlin
private fun mySpannable(): LayoutElement = Spannable.Builder() .addSpan(SpanText.Builder() .setText("Hello ") .build() ) .addSpan(SpanImage.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .build() ) .addSpan(SpanText.Builder() .setText("world") .setFontStyle(FontStyle.Builder() .setItalic(true) .build()) .build() ).build()
Java
private LayoutElement mySpannable() { return new Spannable.Builder() .addSpan(new SpanText.Builder() .setText("Hello ") .build() ) .addSpan(new SpanImage.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .build() ) .addSpan(new SpanText.Builder() .setText("world") .setFontStyle(newFontStyle.Builder() .setItalic(true) .build()) .build() ).build(); }
العمل مع المراجع
لا يمكن للقوائم الوصول إلى أي من موارد تطبيقك. وهذا يعني أنّه
لا يمكنك تمرير معرّف صورة Android إلى عنصر تخطيط Image
والتوقع أن يتم
حلّ المشكلة. بدلاً من ذلك، يمكنك إلغاء طريقة onTileResourcesRequest()
و
تقديم أي موارد يدويًا.
هناك طريقتان لتقديم الصور ضمن onTileResourcesRequest()
الطريقة:
- قدِّم موردًا قابلاً للرسم باستخدام
setAndroidResourceByResId()
. - قدِّم صورة ديناميكية ك
ByteArray
باستخدامsetInlineResource()
.
Kotlin
override fun onTileResourcesRequest( requestParams: ResourcesRequest ) = Futures.immediateFuture( Resources.Builder() .setVersion("1") .addIdToImageMapping("image_from_resource", ImageResource.Builder() .setAndroidResourceByResId(AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.image_id) .build() ).build() ) .addIdToImageMapping("image_inline", ImageResource.Builder() .setInlineResource(InlineImageResource.Builder() .setData(imageAsByteArray) .setWidthPx(48) .setHeightPx(48) .setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565) .build() ).build() ).build() )
Java
@Override protected ListenableFuture<Resources> onTileResourcesRequest( @NonNull ResourcesRequest requestParams ) { return Futures.immediateFuture( new Resources.Builder() .setVersion("1") .addIdToImageMapping("image_from_resource", new ImageResource.Builder() .setAndroidResourceByResId(new AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.image_id) .build() ).build() ) .addIdToImageMapping("image_inline", new ImageResource.Builder() .setInlineResource(new InlineImageResource.Builder() .setData(imageAsByteArray) .setWidthPx(48) .setHeightPx(48) .setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565) .build() ).build() ).build() ); }
قائمة التحقّق من صورة معاينة المربّع
يعرض النظام صورة معاينة المربّع المرجع إليها في ملف بيان تطبيق Android ، وذلك في محرِّر لوحة العرض الدوّارة للمربّعات. يظهر هذا المحرِّر على كلٍّ من أجهزة Wear OS وتطبيق "مساعد الساعة" على الهواتف.
لمساعدة المستخدمين في الاستفادة إلى أقصى حد من صورة المعاينة هذه، يُرجى التحقّق مما يلي من التفاصيل حول مربّعك:
- أن تعكس أحدث تصميم يجب أن تمثّل المعاينة بدقة أحدث تصميم للبلاطة.
- استخدام مظهر ألوان ثابت استخدِم المظهر اللوني الثابت للمربّع، وليس المظهر الديناميكي.
- أن تتضمّن رمز التطبيق تأكَّد من ظهور رمز تطبيقك في أعلى صورة المعاينة.
- تعرض حالة التحميل/تسجيل الدخول. يجب أن تعرض المعاينة حالة "تم التحميل" أو "تم تسجيل الدخول" بشكلٍ كامل، مع تجنُّب أي محتوى فارغ أو محتوى نائب.
- الاستفادة من قواعد حلّ الموارد للتخصيص (اختياري) ننصحك باستخدام قواعد درجة دقة الموارد في Android لتقديم معاينات تتوافق مع إعدادات شاشة الجهاز أو لغته أو لغته المحلية. ويُعدّ ذلك مفعّلاً بشكلٍ خاص إذا كان مظهر مربّع التطبيق يختلف من جهاز لآخر.