Uygulamanızdan kart sağlamaya başlamak için uygulamanızın build.gradle dosyasına aşağıdaki bağımlılıkları ekleyin.
Eski
dependencies { // Use to implement support for wear tiles implementation "androidx.wear.tiles:tiles:1.6.2" // Use to utilize standard components and layouts in your tiles implementation "androidx.wear.protolayout:protolayout:1.4.2" // Use to utilize components and layouts with Material Design in your tiles implementation "androidx.wear.protolayout:protolayout-material:1.4.2" // Use to include dynamic expressions in your tiles implementation "androidx.wear.protolayout:protolayout-expression:1.4.2" // Use to preview wear tiles in your own app debugImplementation "androidx.wear.tiles:tiles-renderer:1.6.2" // Use to fetch tiles from a tile provider in your tests testImplementation "androidx.wear.tiles:tiles-testing:1.6.2" }
Kotlin
dependencies { // Use to implement support for wear tiles implementation("androidx.wear.tiles:tiles:1.6.2") // Use to utilize standard components and layouts in your tiles implementation("androidx.wear.protolayout:protolayout:1.4.2") // Use to utilize components and layouts with Material Design in your tiles implementation("androidx.wear.protolayout:protolayout-material:1.4.2") // Use to include dynamic expressions in your tiles implementation("androidx.wear.protolayout:protolayout-expression:1.4.2") // Use to preview wear tiles in your own app debugImplementation("androidx.wear.tiles:tiles-renderer:1.6.2") // Use to fetch tiles from a tile provider in your tests testImplementation("androidx.wear.tiles:tiles-testing:1.6.2") }
Temel kavramlar
Kartlar, Android uygulamalarıyla aynı şekilde oluşturulmaz ve farklı kavramlardan yararlanır:
- Düzen şablonları: Ekrandaki görsel öğelerin genel düzenini tanımlar. Bu işlem,
primaryLayout()işleviyle gerçekleştirilir. - Düzen öğeleri: Düğme veya kart gibi tek bir grafik öğesini ya da sütun, buttonGroup veya benzeri bir öğe kullanılarak gruplandırılmış bu tür birkaç öğeyi temsil eder. Bunlar bir düzen şablonuna yerleştirilir.
- Kaynaklar:
ResourceBuilders.Resourcesnesneleri, bir düzeni oluşturmak için gereken Android kaynaklarının (resimler) anahtar/değer çiftlerinin eşlemesinden ve bir sürümden oluşur. - Zaman çizelgesi:
TimelineBuilders.Timelinenesnesi, bir düzen nesnesinin bir veya daha fazla örneğinin listesidir. Oluşturucunun bir düzen nesnesinden diğerine ne zaman geçmesi gerektiğini belirtmek için çeşitli mekanizmalar ve ifadeler sağlayabilirsiniz (ör. belirli bir zamanda bir düzenin gösterilmesini durdurma). - Durum: İki bileşenin birbiriyle iletişim kurmasını sağlamak için kart ile uygulama arasında iletilen
StateBuilders.Statetüründe bir veri yapısıdır. Örneğin, karttaki bir düğmeye dokunulursa durum, düğmenin kimliğini içerir. Veri türlerini bir harita kullanarak da değiştirebilirsiniz. - Tile: Zaman çizelgesi, kaynak sürüm kimliği, güncellik aralığı ve durum bilgisinden oluşan bir karo nesnesini temsil eden
TileBuilders.Tilenesnesi. - Protolayout: Bu terim, kartlarla ilgili çeşitli sınıfların adında görünür ve çeşitli Wear OS yüzeylerinde kullanılan bir grafik kitaplığı olan Wear OS Protolayout kitaplığını ifade eder.
Kutucuk oluşturma
Material3TileService kullan (önerilir)
Material 3 kutuları (androidx.wear.tiles:tiles:1.6.0 ve sonraki sürümler) oluştururken alt düzey TileService sınıfı yerine her zaman Material3TileService sınıfını genişletin. Material3TileService, kart geliştirmeyi basitleştiren,
Kotlin öncelikli bir mimari sunar:
- Yerleşik Kotlin eş yordamları:
ListenableFuturekullanmak veonTileRequest()işlevini geçersiz kılmak yerine tek bir askıya almaMaterialScope.tileResponse(requestParams: TileRequest): Tileişlevi uygulayın. - Önceden yapılandırılmış
MaterialScope:tileResponse(), alıcısı olarakMaterialScopeile çalışır (allowDynamicThemevedefaultColorSchemegibi oluşturucu parametreleri aracılığıyla yapılandırılır). Bu nedenle, düzeninizi gereksiz birmaterialScope()çağrısına sarmalamanız gerekmez. - Tek çağrılı kaynak kaydı: Satır içi resim kaynaklarını otomatik olarak kaydetmek ve hem karo düzenini hem de kaynakları tek bir sistem bağlayıcı çağrısında döndürmek için
ProtoLayoutScopeiçerir.Material3TileService, kaynakları otomatik olarak işlediğinden (finalonTileResourcesRequest())onTileResourcesRequest()'yi geçersiz kılmayın.
class MyTileService : Material3TileService() { override suspend fun MaterialScope.tileResponse(requestParams: TileRequest): Tile = tile( timeline = Timeline.fromLayoutElement( primaryLayout( mainSlot = { text("Hello, World!".layoutString, typography = BODY_LARGE) } ) ) ) }
Temel TileService mimarisi
Material3TileService, temel TileService sınıfını temel alır. Bu kılavuzdaki diğer örneklerde, alt düzey kavramları göstermek için bu sınıf kullanılır.
Uygulamanızdan kart sağlamak için TileService türünde bir hizmet uygulayın ve bunu manifest dosyanıza kaydedin. Buna göre sistem, onTileRequest() çağrıları sırasında gerekli karoları ve onTileResourcesRequest() çağrıları sırasında gerekli kaynakları ister.
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()) }
Ardından, AndroidManifest.xml dosyanızın <application> etiketinin içine bir hizmet ekleyin.
<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>
İzin ve intent filtresi, bu hizmeti karo sağlayıcı olarak kaydeder.
Kullanıcı, telefonunda veya kol saatinde kartları yapılandırırken simge, etiket, açıklama ve önizleme kaynağı gösterilir. Önizleme kaynağı, Android'in tüm standart kaynak niteleyicilerini destekler. Bu nedenle, önizlemeyi ekran boyutu ve cihaz dili gibi faktörlere göre değiştirebilirsiniz. Diğer öneriler için önizleme yapılacaklar listesine bakın.
Uygulamanızı dağıtın ve kartı, kartlar rulosuna ekleyin (kartı önizlemenin geliştiriciler için daha kolay bir yolu da vardır ancak şimdilik bunu manuel olarak yapın).
Eksiksiz bir örnek için GitHub'daki kod örneğine veya kod laboratuvarına bakın.
Kartlar için kullanıcı arayüzü oluşturma
Material 3 Expressive kullanıcı arayüzü öğeleri, Kotlin'in tip güvenli oluşturucu kalıbı tarafından desteklenen yapılandırılmış bir yaklaşım kullanılarak oluşturulur.
Düzen
Etkili ve duyarlı kart düzenleri oluşturmanın ardındaki tasarım ilkeleriyle ilgili rehberlik için Kartlar için yaygın düzenler başlıklı makaleyi inceleyin.
Düzeninizi oluşturmak için aşağıdakileri yapın:
Materyal Tasarım kapsamı başlatma: Gerekli
contextvedeviceConfigurationdeğerlerini sağlayarakmaterialScope()işlevini çağırın.allowDynamicThemevedefaultColorSchemegibi isteğe bağlı parametreler ekleyebilirsiniz.allowDynamicThemevarsayılan olaraktruedeğerine sahiptir vedefaultColorScheme, dinamik renkler kullanılamadığında (ör. kullanıcı özelliği kapattığında) veya cihaz tarafından desteklenmediğinde ya daallowDynamicTheme,falseolduğunda kullanılanColorSchemedeğerini temsil eder. Özel birTileServiceiçindebackgroundImage()gibiImageResourceAPI'lerini kullanırken bunun yerinematerialScopeWithResources()yöntemini çağırın.Kullanıcı arayüzünüzü kapsam içinde oluşturun: Belirli bir Kart düzeni için tüm kullanıcı arayüzü bileşenleri, tek bir üst düzey materialScope() çağrısının lambda'sı içinde tanımlanmalıdır.
primaryLayout()vetextEdgeButton()gibi bu bileşen işlevleri,MaterialScopeüzerinde uzantı işlevleridir ve yalnızca bu alıcı kapsamında çağrıldığında kullanılabilir.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( labelContent = { text("Action".layoutString) }, onClick = clickable() ) } ) }
Slot
M3'te kart düzeni, üç farklı yuvadan yararlanan, Compose'dan ilham alan bir yaklaşım kullanır. Yukarıdan aşağıya doğru bunlar şunlardır:
titleSlot, genellikle birincil başlık veya üstbilgi için kullanılır.- Temel içerik için
mainSlot. - Genellikle işlemler veya ek bilgiler için kullanılan
bottomSlot. Kenar düğmesi de burada görünür.
Her bir alanın içeriği aşağıdaki gibidir:
titleSlot(isteğe bağlı): Genellikletext()tarafından oluşturulan birkaç kelime.mainSlot(zorunlu): Satırlar, sütunlar ve düğme grupları gibi yapılarda düzenlenmiş bileşenler. Bu bileşenler birbirinin içine de yerleştirilebilir. Örneğin, bir sütun satır içerebilir.bottomSlot(isteğe bağlı): Genellikle kenara dayalı düğme veya metin etiketiyle doldurulur.
Karolar kaydırılamadığı için sayfalama, kaydırma veya uzun içerik listelerini işleme bileşenleri yoktur. Yazı tipi boyutu büyüdüğünde veya çeviri nedeniyle metin uzadığında içeriğin görünür kalmasına dikkat edin.
Kullanıcı arayüzü bileşenleri
protolayout-material3 kitaplığı, Material 3 Expressive spesifikasyonlarına ve kullanıcı arayüzü önerilerine göre tasarlanmış çok sayıda bileşen sunar.
Düğmeler
Düğmeler öncelikle eylem odaklıdır. Belirli eylemleri tetiklemek için kullanılırlar. Her bir düğmenin içeriği (ör. simge veya kısa metin), işlemi tanımlar.
- textButton(): (Kısa) metin içeriği için tek bir yuvası olan düğme
- iconButton(): Bir simgeyi temsil eden tek bir alan içeren düğme
- avatarButton(): Dikey olarak yığılmış etiketi ve ikincil etiketi temsil eden içeriği ve yanındaki resmi (avatar) barındırmak için üç adede kadar alan sunan hap şeklindeki avatar düğmesi
- imageButton(): Ek alan sunmayan, yalnızca resim içeren tıklanabilir resim düğmesi (ör. arka plan olarak
backgroundImage) - compactButton(): Bir simgeyi ve yanındaki metni temsil eden, yatay olarak yığılmış içeriği barındırmak için iki adede kadar alan sunan kompakt düğme
- button(): dikey olarak yığılmış etiketi ve ikincil etiketi temsil eden içeriği ve yanındaki simgeyi almak için üç adede kadar alan sunan hap şeklinde düğme
Kenar Düğmeleri
Kenar düğmesi, saatin yuvarlak ekranının alt kısmına sabitlenmiş özel, tam genişlikte bir düğmedir. Mevcut kart ekranında yapılacak en önemli işlemi temsil eder.
- iconEdgeButton(): Simge veya benzer şekilde yuvarlak, küçük içerik barındırmak için tek bir yuva sunan kenar düğmesi
- textEdgeButton(): Metin veya benzer uzunlukta ve genişlikte içerik barındırmak için tek bir alan sunan kenar düğmesi
Kartlar
Kartlar öncelikle bilgi odaklıdır. İlişkili, yapılandırılmış veri koleksiyonlarını gösterirler. Etkileşimli kartlar oluşturabilirsiniz ancak bu kartlar genellikle bilgilerin özetini gösterir. Kullanıcılar daha fazla ayrıntı görmek veya ilgili bir işlem yapmak için bu kartlara dokunabilir.
- titleCard(): Genellikle metin tabanlı bir ila üç alan sunan başlık kartı
- appCard(): Genellikle metin tabanlı, en fazla beş alan sunan uygulama kartı
- textDataCard(): Genellikle metin veya sayı tabanlı, dikey olarak yığılmış üç adede kadar alan sunan bilgi kartı
- iconDataCard(): Genellikle metin veya sayı tabanlı, simge içeren ve dikey olarak üst üste yerleştirilmiş üç adede kadar alan sunan veri kartı
- graphicDataCard(): İlerleme göstergesi gibi grafik verileri için bir alan ve genellikle metin açıklamaları için dikey olarak yığılmış en fazla iki alan sunan grafik veri kartı
İlerleme Durumu Göstergeleri
- circularProgressIndicator(): Radyal bir öğe kullanarak hedefe doğru ilerleme durumunu gösterir.
- segmentedCircularProgressIndicator(): Farklı aşamalara sahip dairesel bir öğe kullanarak bir hedefe doğru ilerlemeyi gösterir.
Grup düzeni öğeleri
- buttonGroup(): Alt öğelerini yatay bir sıraya yerleştiren bileşen düzeni
- primaryLayout(): Önerilen duyarlı bir M3 düzen stilini temsil eden ve önerilen kenar boşlukları ve dolgularla birlikte öğelerin yerleşimini yöneten tam ekran düzeni
Tema uygulama
Material 3 Expressive'de renk sistemi, altı grupta düzenlenen 29 standart renk rolüyle tanımlanır: birincil, ikincil, üçüncül, hata, yüzey ve ana hat.
ColorScheme, bu 29 rolün her birini karşılık gelen bir renkle eşler. MaterialScope'nin bir parçası olduğu ve bileşenlerin içinde oluşturulması gerektiği için otomatik olarak şemadaki renkleri alır. Bu yaklaşım, tüm kullanıcı arayüzü öğelerinin otomatik olarak Materyal Tasarım standartlarına uymasını sağlar.
Kullanıcıların, tanımladığınız bir renk şeması (ör. marka renklerinizi yansıtan bir şema) ile sistem tarafından sağlanan bir şema (kullanıcının mevcut kadranından türetilen veya kullanıcı tarafından seçilen bir şema) arasında seçim yapmasına izin vermek için MaterialScope öğesini aşağıdaki gibi ilk kullanıma hazırlayın:
val myColorScheme = ColorScheme( primary = Color.rgb(0, 0, 255).argb, // Blue onPrimary = Color.rgb(255, 255, 255).argb, // White // 27 more ) materialScope( context = context, deviceConfiguration = requestParams.deviceConfiguration, defaultColorScheme = myColorScheme ) { // If the user selects "no theme" in settings, myColorScheme is used. // Otherwise, the system-provided theme is used. }
Bu seçeneği tercih ederseniz her temada en iyi görünürlük için doğru şekilde renklendirilebilecek tek renkli bir karo simgesi sağlayın.
Kartlarınızın, sağladığınız renk şemasında görünmesini zorunlu kılmak için allowDynamicTheme değerini false olarak ayarlayarak dinamik tema desteğini devre dışı bırakın:
materialScope( context = context, deviceConfiguration = requestParams.deviceConfiguration, allowDynamicTheme = false, defaultColorScheme = myColorScheme ) { // myColorScheme is *always* used. }
Renk
Her bir bileşen, ColorScheme tarafından tanımlanan 29 renk rolünün bir alt kümesini kullanır. Örneğin, düğmelerde en fazla dört renk kullanılır. Bu renkler varsayılan olarak etkin ColorScheme öğesinin "birincil" grubundan alınır:
ButtonColors bileşen jetonu |
ColorScheme rolü |
|---|---|
| containerColor | birincil |
| iconColor | onPrimary |
| labelColor | onPrimary |
| secondaryLabelColor | onPrimary (opaklık 0,8) |
Wear OS tasarımlarınıza renk uygulama hakkında ayrıntılı bilgi için renk tasarım kılavuzunu inceleyin.
Belirli kullanıcı arayüzü öğeleri için varsayılan renk jetonlarından sapmanız gerekebilir. Örneğin, bir textEdgeButton öğesinin öne çıkması ve daha iyi kontrast sağlaması için "birincil" yerine "ikincil" veya "üçüncül" gruptaki renkleri kullanmasını isteyebilirsiniz.
Bileşen renklerini çeşitli şekillerde özelleştirebilirsiniz:
Önceden tanımlanmış renkler için yardımcı işlev kullanın. Material 3 Expressive için standart düğme stillerini uygulamak üzere
filledTonalButtonColors()gibi yardımcı işlevleri kullanın. Bu işlevler,MaterialScopeiçindeki etkinColorScheme'ten uygun rollere dolgulu, tonlu veya ana hatlı gibi yaygın stilleri eşleyen önceden yapılandırılmışButtonColorsörnekleri oluşturur. Bu sayede, yaygın düğme türleri için her rengi manuel olarak tanımlamadan tutarlı stiller uygulayabilirsiniz.textEdgeButton( colors = filledButtonColors(), // default /* OR colors = filledTonalButtonColors() */ /* OR colors = filledVariantButtonColors() */ // ... other parameters )
Kartlar için eşdeğer
filledCardColors()işlev ailesini kullanın.Yalnızca bir veya iki jetonu değiştirmeniz gerekiyorsa yardımcı işlevler tarafından döndürülen
ButtonColorsnesnesinicopy()yöntemini kullanarak da değiştirebilirsiniz:textEdgeButton( colors = filledButtonColors() .copy( containerColor = colorScheme.tertiary, labelColor = colorScheme.onTertiary ), // ... other parameters )
Yedek renk rollerini açıkça belirtin. Kendi
ButtonColorsnesnenizi oluşturun ve bileşene iletin. Kartlar için eşdeğerCardColorsnesnesini kullanın.textEdgeButton( colors = ButtonColors( // the materialScope makes colorScheme available containerColor = colorScheme.secondary, iconColor = colorScheme.secondaryDim, labelColor = colorScheme.onSecondary, secondaryLabelColor = colorScheme.onSecondary ), // ... other parameters )
Sabit renkler belirtin (dikkatli kullanın). Renkleri genellikle semantik rollerine göre (ör.
colorScheme.primary) belirtmeniz önerilir ancak doğrudan renk değerleri de sağlayabilirsiniz. Bu yaklaşım, özellikle tema dinamik olarak değişiyorsa genel temayla tutarsızlıklara yol açabileceğinden dikkatli kullanılmalıdır.textEdgeButton( colors = filledButtonColors().copy( containerColor = android.graphics.Color.RED.argb, // Using named colors labelColor = 0xFFFFFF00.toInt().argb // Using a hex code for yellow ), // ... other parameters )
Yazı biçimi
Tasarımlarınızda tipografiyi etkili bir şekilde kullanma hakkında daha fazla bilgi için tipografi tasarım kılavuzuna bakın.
Wear OS platformunda görsel tutarlılık oluşturmak ve performansı optimize etmek için kartlardaki tüm metinler, sistem tarafından sağlanan bir yazı tipi kullanılarak oluşturulur. Yani kartlar özel yazı tiplerini desteklemez. Wear OS 6 ve sonraki sürümlerde OEM'e özgü bir yazı tipidir. Çoğu durumda bu, daha etkileyici bir deneyim ve daha ayrıntılı kontrol sunan değişken bir yazı tipi olur.
Metin stili oluşturmak için genellikle tipografik sabitlerle birlikte text() yöntemini kullanırsınız. Bu bileşen, Material 3 Expressive'deki önceden tanımlanmış tipografi rollerini kullanmanıza olanak tanır. Bu sayede, kartınız okunabilirlik ve hiyerarşi için belirlenmiş tipografik en iyi uygulamalara uyar.
Kitaplıkta, BODY_MEDIUM gibi 18 semantik tipografi sabiti bulunur. Bu sabitler, boyut dışındaki yazı tipi eksenlerini de etkiler.
text( text = "Hello, World!".layoutString, typography = BODY_MEDIUM, )
Daha fazla kontrol için ek ayarlar sağlayabilirsiniz. Wear OS 6 ve sonraki sürümlerde, italik, kalınlık, genişlik ve yuvarlaklık eksenleri boyunca değiştirebileceğiniz değişken bir yazı tipi kullanılabilir. Bu eksenleri settings parametresini kullanarak kontrol edebilirsiniz:
text( text = "Hello, World".layoutString, italic = true, // Use elements defined in androidx.wear.protolayout.LayoutElementBuilders.FontSetting settings = listOf( weight(500), width(100F), roundness(100) ), )
Son olarak, boyutu veya harf aralığını kontrol etmeniz gerekiyorsa (önerilmez) text() yerine basicText() kullanın ve fontStyle() kullanarak fontStyle özelliği için bir değer oluşturun.
Şekil ve kenar boşlukları
shape özelliğini kullanarak neredeyse her bileşenin köşe yarıçapını değiştirebilirsiniz. Değerler, MaterialScope özelliğinden shapes alınır:
textButton( height = expand(), width = expand(), shape = shapes.medium, // OR another value like shapes.full colors = filledVariantButtonColors(), labelContent = { text("Hello, World!".layoutString) }, )
Bir bileşenin şeklini değiştirdikten sonra ekranın kenarında çok fazla veya çok az boşluk kaldığını düşünüyorsanız primaryLayout() öğesinin margin parametresini kullanarak kenar boşluklarını ayarlayın:
primaryLayout( mainSlot = { textButton( shape = shapes.small, /* ... */ ) }, // margin constants defined in androidx.wear.protolayout.material3.PrimaryLayoutMargins margins = MAX_PRIMARY_LAYOUT_MARGIN, )
Yaylar
Aşağıdaki Arc kapsayıcı alt öğeleri desteklenir:
ArcLine: Yay etrafında eğri bir çizgi oluşturur.ArcText: Yayda kavisli metin oluşturur.ArcAdapter: Yayda, yaya teğet olarak çizilen temel bir düzen öğesi oluşturur.
Daha fazla bilgi için her bir öğe türünün referans belgelerine bakın.
Değiştiriciler
Mevcut her düzen öğesine isteğe bağlı olarak değiştiriciler uygulanabilir. Bu değiştiricileri aşağıdaki amaçlarla kullanın:
- Düzenin görsel görünümünü değiştirme Örneğin, düzen öğenize arka plan, kenarlık veya dolgu ekleyebilirsiniz.
- Düzenle ilgili meta veriler ekleyin. Örneğin, ekran okuyucularla kullanmak için düzen öğenize bir semantik değiştirici ekleyin.
- İşlev ekleyin. Örneğin, karonuzu etkileşimli hale getirmek için düzen öğenize tıklanabilir bir değiştirici ekleyin. Daha fazla bilgi için Kartlarla etkileşim kurma başlıklı makaleyi inceleyin.
Örneğin, aşağıdaki kod örneğinde gösterildiği gibi bir Image öğesinin varsayılan görünümünü ve meta verilerini özelleştirebiliriz:
private fun myImage(): LayoutElement = Image.Builder() .setWidth(dp(24f)) .setHeight(dp(24f)) .setResourceId("image_id") .setModifiers( Modifiers.Builder() .setBackground(Background.Builder().setColor(argb(0xFFFF0000.toInt())).build()) .setPadding(ModifiersBuilders.Padding.Builder().setStart(dp(12f)).build()) .setSemantics(Semantics.Builder().setContentDescription("Image description").build()) .build() ) .build()
Spannable'lar
Spannable, öğeleri metne benzer şekilde düzenleyen özel bir kapsayıcı türüdür. Bu, daha büyük bir metin bloğundaki yalnızca bir alt dizeye farklı bir stil uygulamak istediğinizde kullanışlıdır. Bu, Text öğesiyle mümkün değildir.
Spannable kapsayıcısı Span alt öğeyle doldurulur. Diğer alt öğelere veya iç içe yerleştirilmiş Spannable örneklerine izin verilmez.
İki tür Span alt öğesi vardır:
Örneğin, "Hello World" kutusundaki "dünya" kelimesini italik yapabilir ve aşağıdaki kod örneğinde gösterildiği gibi kelimelerin arasına bir resim ekleyebilirsiniz:
private fun mySpannable(): LayoutElement = LayoutElementBuilders.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()
Kaynaklarla çalışma
Kartların, uygulamanızın kaynaklarına erişimi yoktur. Yani, bir Android resim kimliğini Image düzen öğesine iletip çözümlenmesini bekleyemezsiniz. Bunun yerine onTileResourcesRequest() yöntemini geçersiz kılın ve kaynakları manuel olarak sağlayın.
onTileResourcesRequest() yönteminde resim sağlamanın iki yolu vardır:
setAndroidResourceByResId()kullanarak bir drawable kaynak sağlayın.setInlineResource()kullanarak dinamik bir resmiByteArrayolarak sağlayın.
override fun onTileResourcesRequest( requestParams: ResourcesRequest ) = Futures.immediateFuture( Resources.Builder() .setVersion("1") .addIdToImageMapping( "image_from_resource", ResourceBuilders.ImageResource.Builder() .setAndroidResourceByResId( ResourceBuilders.AndroidImageResourceByResId.Builder() .setResourceId(R.drawable.ic_walk) .build() ).build() ) .addIdToImageMapping( "image_inline", ResourceBuilders.ImageResource.Builder() .setInlineResource( ResourceBuilders.InlineImageResource.Builder() .setData(imageAsByteArray) .setWidthPx(48) .setHeightPx(48) .setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565) .build() ).build() ).build() )
Kart önizleme resmi kontrol listesi
Sistem, yeni bir kutu eklemek için kutu bant düzenleyicide Android uygulama manifestinde referans verilen kutu önizleme resmini gösterir. Bu düzenleyici hem Wear OS cihazlarda hem de telefonlardaki kol saati tamamlayıcı uygulamasında görünür.
Kullanıcıların bu önizleme resminden en iyi şekilde yararlanabilmesi için kartınızla ilgili aşağıdaki ayrıntıları doğrulayın:
- En yeni tasarımı yansıtır. Önizleme, kartınızın en güncel tasarımını doğru şekilde yansıtmalıdır.
- Önerilen boyutları kullanır. Mümkün olan en iyi görüntü kalitesini ve iyi bir kullanıcı deneyimi sağlamak için önizleme resminin boyutları 400 piksele 400 piksel olmalıdır.
- Statik bir renk teması kullanır. Dinamik bir renk teması yerine kartın statik renk temasını kullanın.
- Uygulama simgesi içerir. Uygulamanızın simgesinin önizleme resminin üst kısmında göründüğünü onaylayın.
- Yüklenen/giriş yapılan durumu gösterir. Önizleme, tamamen işlevsel bir "yüklendi" veya "giriş yapıldı" durumunu göstermeli, boş veya yer tutucu içeriklerden kaçınmalıdır.
- Özelleştirme için kaynak çözümleme kurallarından yararlanın (isteğe bağlı). Cihazın ekran boyutu, dil veya yerel ayarlarıyla eşleşen önizlemeler sağlamak için Android'in kaynak çözümleme kurallarını kullanabilirsiniz. Bu, özellikle kartınızın görünümü cihazlar arasında farklılık gösteriyorsa kullanışlıdır.