Materyal Tasarım 2

Jetpack Compose, dijital arayüzler oluşturmak için kapsamlı bir tasarım sistemi olan Materyal Tasarım'ın bir uygulamasını sunar. Materyal Tasarım bileşenleri (düğmeler, kartlar, anahtarlar vb.) Materyal Tema temelinde geliştirilmiştir. Bu, projenizle ilgili Materyal Tasarım'ı ürününüzün markasını daha iyi yansıtacak şekilde özelleştirebilirsiniz. Malzeme Temada color [renk], tipografi ve şekil özellikleri bulunur. Bu özellikleri özelleştirdiğinizde, değişiklikleriniz uygulamanızı oluşturmak için kullandığınız bileşenlere otomatik olarak yansıtılır.

Jetpack Compose bu kavramları MaterialTheme bileşeniyle uygular:

MaterialTheme(     colors = // ...     typography = // ...     shapes = // ... ) {     // app content }

Uygulamanızı temalandırmak için MaterialTheme parametresine ilettiğiniz parametreleri yapılandırın.

Kontrast oluşturan iki ekran görüntüsü. İlk ekran görüntüsünde varsayılan MaterialTheme stili, ikinci ekran görüntüsünde ise değiştirilmiş stil kullanılmıştır.

Şekil 1. İlk ekran görüntüsünde, yapılandırılmayan bir uygulama gösteriliyor MaterialTheme ve bu nedenle varsayılan stilleri kullanır. İkinci ekran görüntüsünde, stili özelleştirmek için MaterialTheme parametrelerini ileten bir uygulama gösterilmektedir.

Renk

Renkler, basit bir veri tutma sınıfı olan Color sınıfıyla Oluştur'da modellenir.

val Red = Color(0xffff0000) val Blue = Color(red = 0f, green = 0f, blue = 1f)

Bunları istediğiniz gibi düzenleyebilirsiniz (üst düzey sabitler, tekil içinde veya satır içi olarak). Ancak renkleri temanızda belirtmenizi ve oradan almanızı önemle tavsiye ederiz. Bu yaklaşım, koyu temayı ve iç içe yerleştirilmiş temaları kolayca desteklemelerini sağlayabilirsiniz.

Temanın renk paleti örneği

Şekil 2. Material renk sistemi.

Compose, malzeme rengi sistemini modellemek için Colors sınıfını sağlar. Colors, açık veya koyu renk grupları oluşturmak için oluşturucu işlevleri sağlar:

private val Yellow200 = Color(0xffffeb46) private val Blue200 = Color(0xff91a4fc) // ...  private val DarkColors = darkColors(     primary = Yellow200,     secondary = Blue200,     // ... ) private val LightColors = lightColors(     primary = Yellow500,     primaryVariant = Yellow400,     secondary = Blue700,     // ... )

Colors öğelerinizi tanımladıktan sonra bunları bir MaterialTheme öğesine iletebilirsiniz:

MaterialTheme(     colors = if (darkTheme) DarkColors else LightColors ) {     // app content }

Tema renklerini kullanma

MaterialTheme composable'a sağlanan Colors öğesini şu şekilde alabilirsiniz: MaterialTheme.colors kullanılıyor.

Text(     text = "Hello theming",     color = MaterialTheme.colors.primary )

Yüzey ve içerik rengi

Birçok bileşen bir çift renk ve içerik rengini kabul eder:

Surface(     color = MaterialTheme.colors.surface,     contentColor = contentColorFor(color),     // ... ) { /* ... */ }  TopAppBar(     backgroundColor = MaterialTheme.colors.primarySurface,     contentColor = contentColorFor(backgroundColor),     // ... ) { /* ... */ }

Bu, bir composable'ın rengini belirlemenizin yanı sıra, içerik,yani içindeki composable'lar için bir varsayılan renk. Birçok bileşen varsayılan olarak bu içerik rengini kullanır. Örneğin, Text renk, Icon, kendi arka plan rengini ayarlamak için de bu rengi kullanır renk tonu.

Aynı banner'ın farklı renklere sahip iki örneği

Şekil 3. Farklı arka plan renkleri ayarlandığında farklı metin ve simge renkleri elde edilir.

contentColorFor() yöntemi, tüm tema renkleri için uygun "açık" rengi alır. Örneğin, Surface'ta primary arka plan rengi ayarlarsanız bu işlev, onPrimary'i içerik rengi olarak ayarlamak için kullanılır. Temadan farklı bir arka plan rengi ayarlarsanız ayrıca uygun içerik rengine sahip olursunuz. Hiyerarşide belirli bir konumdaki mevcut arka plan için tercih edilen içerik rengini almak üzere LocalContentColor öğesini kullanın.

İçerik alfa

Önem derecesini iletmek için içeriği ne kadar vurguladığınızı genellikle değiştirmek istersiniz ve görsel bir hiyerarşi sağlamanızı sağlar. Materyal Tasarım'daki metin okunabilirliği öneriler için farklı önem düzeylerini aktarmak için farklı opaklık seviyeleri kullanma.

Jetpack Compose bunu LocalContentAlpha aracılığıyla uygular. Bu CompositionLocal için bir değer sağlayarak bir hiyerarşi için içerik alfasını belirtebilirsiniz. İç içe yerleştirilmiş kompozitler, içeriklerine alfa işlemi uygulamak için bu değeri kullanabilir. Örneğin, Text ve Icon varsayılan olarak LocalContentAlpha için ayarlanmış LocalContentColor kombinasyonunu kullanır. Malzeme, ContentAlpha nesnesi tarafından modellenen bazı standart alfa değerlerini (high, medium, disabled) belirtir.

// By default, both Icon & Text use the combination of LocalContentColor & // LocalContentAlpha. De-emphasize content by setting content alpha CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {     Text(         // ...     ) } CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.disabled) {     Icon(         // ...     )     Text(         // ...     ) }

CompositionLocal hakkında daha fazla bilgi için CompositionLocal rehberi.

Metin vurgularının farklı düzeylerini gösteren bir makale başlığının ekran görüntüsü

Şekil 4. Görsel olarak iletişim kurmak için metne farklı düzeylerde vurgu eklemek hiyerarşik olarak düzenlenmiştir. İlk metin satırı başlıktır ve en önemli bilgileri içerir. Bu nedenle ContentAlpha.high kullanılır. İkinci satır, daha az önemli meta veriler içerir ve bu nedenle ContentAlpha.medium kullanılır.

Koyu tema

Oluşturma'da, MaterialTheme bileşenine farklı Colors grupları sağlayarak açık ve koyu temaları uygularsınız:

@Composable fun MyTheme(     darkTheme: Boolean = isSystemInDarkTheme(),     content: @Composable () -> Unit ) {     MaterialTheme(         colors = if (darkTheme) DarkColors else LightColors,         /*...*/         content = content     ) }

Bu örnekte MaterialTheme, koyu temanın kullanılıp kullanılmayacağını belirten bir parametre kabul eden kendi birleştirilebilir işlevine sarılmıştır. İçinde Bu örnekte, işlevdarkTheme cihaz teması ayarına dikkat edin.

Mevcut Colors'nin açık mı yoksa koyu mu olduğunu kontrol etmek için aşağıdaki gibi bir kod kullanabilirsiniz:

val isLightTheme = MaterialTheme.colors.isLight Icon(     painterResource(         id = if (isLightTheme) {             R.drawable.ic_sun_24         } else {             R.drawable.ic_moon_24         }     ),     contentDescription = "Theme" )

Yükseltme yer paylaşımları

Material'de, koyu temalarda daha yüksek rakımlara sahip yüzeylere arka planlarını aydınlatan yükseklik yer paylaşımları uygulanır. Bir yüzeyin rakımı ne kadar yüksek olursa (bunu yakınlaştırarak) benzer bir ışık kaynağı alırsa yüzey daha hafif hale gelir.

Bu yer paylaşımları, koyu renkler kullanıldığında Surface bileşeni tarafından ve yüzey kullanan diğer tüm Material bileşenleri için otomatik olarak uygulanır:

Surface(     elevation = 2.dp,     color = MaterialTheme.colors.surface, // color will be adjusted for elevation     /*...*/ ) { /*...*/ }

Öğelerde kullanılan incelikli farklı renklerin gösterildiği bir uygulama ekran görüntüsü farklı yükseklik seviyelerinde

Şekil 5. Hem kartlarda hem de alttaki gezinme bölmesinde surface rengi kullanılıyor sahipler. Kartlar ve alt gezinme menüsü, arka planın üzerinde farklı yükseklik seviyelerinde olduğundan renkleri biraz farklıdır. Kartlar arka plandan, alt gezinme menüsü ise kartlardan daha açık renklidir.

Surface içermeyen özel senaryolar için LocalElevationOverlay Şunu içeren bir CompositionLocal: ElevationOverlay kullanan Surface bileşenler:

// Elevation overlays // Implemented in Surface (and any components that use it) val color = MaterialTheme.colors.surface val elevation = 4.dp val overlaidColor = LocalElevationOverlay.current?.apply(     color, elevation )

Yükseklik yer paylaşımlarını devre dışı bırakmak için, birleştirilebilir bir hiyerarşide istediğiniz noktada null sağlayın:

MyTheme {     CompositionLocalProvider(LocalElevationOverlay provides null) {         // Content without elevation overlays     } }

Sınırlı renk vurguları

Materyal, sınırlı renk uygulanmasını öneriyor koyu renk için aksan işaretleri kullanarak primary rengi yerine surface renginin kullanılmasını tercih ederek gerekir. TopAppBar ve BottomNavigation gibi materyal bileşenleri varsayılan olarak bu davranışı uygular.

6. Şekil. Sınırlı renk vurgularına sahip koyu renkli malzeme teması. Üst uygulama çubuğunda, açık temada birincil renk, koyu temada ise yüzey rengi kullanılır.

Özel senaryolar için primarySurface özelliğini kullanın. uzantı mülkü:

Surface(     // Switches between primary in light theme and surface in dark theme     color = MaterialTheme.colors.primarySurface,     /*...*/ ) { /*...*/ }

Yazı biçimi

Material, anlamlı şekilde adlandırılmış az sayıda stil kullanmanızı teşvik ederek bir tür sistemi tanımlar.

Çeşitli stillerde birkaç farklı yazı tipi örneği

Şekil 7. Malzeme türü sistemi.

Oluşturma, Typography, TextStyle ve yazı tipiyle ilgili sınıflarla yazı tipi sistemini uygular. Typography oluşturucu, her stil için varsayılan değerler sunar. Böylece, özelleştirmek istemediğiniz stilleri atlayabilirsiniz:

val raleway = FontFamily(     Font(R.font.raleway_regular),     Font(R.font.raleway_medium, FontWeight.W500),     Font(R.font.raleway_semibold, FontWeight.SemiBold) )  val myTypography = Typography(     h1 = TextStyle(         fontFamily = raleway,         fontWeight = FontWeight.W300,         fontSize = 96.sp     ),     body1 = TextStyle(         fontFamily = raleway,         fontWeight = FontWeight.W600,         fontSize = 16.sp     )     /*...*/ ) MaterialTheme(typography = myTypography, /*...*/) {     /*...*/ }

Her yerde aynı yazı tipini kullanmak istiyorsanız defaultFontFamily parameter öğesini belirtin ve TextStyle öğelerinin fontFamily özelliğini çıkarın:

val typography = Typography(defaultFontFamily = raleway) MaterialTheme(typography = typography, /*...*/) {     /*...*/ }

Metin stillerini kullanma

TextStyle'lere MaterialTheme.typography üzerinden erişilir. Al TextStyle şöyle:

Text(     text = "Subtitle2 styled",     style = MaterialTheme.typography.subtitle2 )

Farklı amaçlar için farklı yazı tiplerini gösteren ekran görüntüsü

Şekil 8. Markanızı ifade etmek için çeşitli yazı tipleri ve stiller kullanın.

Şekil

Materyal, büyük, orta ve küçük bileşenler için şekiller tanımlamanıza olanak tanıyan bir şekil sistemi tanımlar.

Çeşitli Materyal Tasarım şekillerini gösteriyor

9. Şekil. Materyal şekil sistemi.

Compose, şekil sistemini Shapes sınıfını kullanarak bir CornerBasedShape her beden kategorisi için:

val shapes = Shapes(     small = RoundedCornerShape(percent = 50),     medium = RoundedCornerShape(0f),     large = CutCornerShape(         topStart = 16.dp,         topEnd = 0.dp,         bottomEnd = 0.dp,         bottomStart = 16.dp     ) )  MaterialTheme(shapes = shapes, /*...*/) {     /*...*/ }

Birçok bileşen varsayılan olarak bu şekilleri kullanır. Örneğin, Button TextField ve FloatingActionButton varsayılan olarak küçük, AlertDialog varsayılan olarak orta değerine ayarlanır ve ModalDrawer daha büyük olabilir; daha fazla bilgi için şekil şeması referansı .

Şekilleri kullanma

Shape alanına MaterialTheme.shapes üzerinden erişiliyor. Aşağıdaki gibi bir kod kullanarak Shape'leri alın:

Surface(     shape = MaterialTheme.shapes.medium, /*...*/ ) {     /*...*/ }

Bir öğenin hangi durumda olduğunu belirtmek için Materyal şekilleri kullanan bir uygulamanın ekran görüntüsü

Şekil 10. Markayı veya durumu ifade etmek için şekiller kullanın.

Varsayılan stiller

Oluşturulma bölümünde eşdeğer bir kavram yok varsayılan stiller olarak ayarlanır. Material bileşenlerini sarmalayan kendi "aşırı yükleme" birleştirilebilir işlevlerinizi oluşturarak benzer işlevler sağlayabilirsiniz. Örneğin, bir düğme stili oluşturmak için bir düğmeyi kendi birleştirilebilir işlevinize sarmalayın. Değiştirmek istediğiniz parametreleri doğrudan ayarlayın ve diğerlerini içeren birleştirilebilir öğeye parametre olarak gösterin.

@Composable fun MyButton(     onClick: () -> Unit,     modifier: Modifier = Modifier,     content: @Composable RowScope.() -> Unit ) {     Button(         colors = ButtonDefaults.buttonColors(             backgroundColor = MaterialTheme.colors.secondary         ),         onClick = onClick,         modifier = modifier,         content = content     ) }

Tema yer paylaşımları

MaterialTheme bileşenlerini iç içe yerleştirerek, Oluştur'daki Android Görünümler'de tema yer paylaşımlarının eşdeğerini elde edebilirsiniz. MaterialTheme, renkleri, yazı tiplerini ve şekilleri varsayılan olarak geçerli tema değerine ayarlar. Bu nedenle, bir tema bu parametrelerden yalnızca birini ayarlarsa diğer parametreler varsayılan değerlerini korur.

Ayrıca, görüntülemeye dayalı ekranları Oluştur'a taşırken android:theme özelliğinin kullanımlarına dikkat edin. Muhtemelen yeni bir Oluşturma kullanıcı arayüzü ağacının ilgili bölümünde MaterialTheme.

Bu örnekte, ayrıntılar ekranında ekranın büyük kısmı için PinkTheme, ardından ilgili bölüm için BlueTheme kullanılır. Aşağıdaki ekran görüntüsünü ve kodu inceleyin.

Şekil 11. İç içe yerleştirilmiş temalar.

@Composable fun DetailsScreen(/* ... */) {     PinkTheme {         // other content         RelatedSection()     } }  @Composable fun RelatedSection(/* ... */) {     BlueTheme {         // content     } }

Bileşen durumları

Etkileşim kurulabilen (tıklanan, açma/kapatma düğmesi kullanılan vb.) Material bileşenleri farklı görsel durumlarda olabilir. Durumlar arasında etkin, devre dışı, basıldı vb. yer alır.

Kompozitlerde genellikle bir enabled parametresi bulunur. Politikanın false olarak ayarlanması, etkileşimi ve renk ile yükseklik gibi özellikleri görsel olarak iletebilmek için değiştirir. değiştirebilirsiniz.

Şekil 12. enabled = true (sol) ve enabled = false (sağ) düğmesi.

Çoğu durumda renk ve yükseklik gibi değerler için varsayılan değerleri kullanabilirsiniz. Farklı eyaletlerde kullanılan değerleri yapılandırmak isterseniz sınıflar ve kolaylık işlevleri mevcuttur. Aşağıdaki düğme örneğini inceleyin:

Button(     onClick = { /* ... */ },     enabled = true,     // Custom colors for different states     colors = ButtonDefaults.buttonColors(         backgroundColor = MaterialTheme.colors.secondary,         disabledBackgroundColor = MaterialTheme.colors.onBackground             .copy(alpha = 0.2f)             .compositeOver(MaterialTheme.colors.background)         // Also contentColor and disabledContentColor     ),     // Custom elevation for different states     elevation = ButtonDefaults.elevation(         defaultElevation = 8.dp,         disabledElevation = 2.dp,         // Also pressedElevation     ) ) { /* ... */ }

Şekil 13. enabled = true (solda) ve enabled = false öğesini içeren düğme (sağda), ayarlanmış renk ve yükseklik değerleriyle gösterilir.

Dalgalar

Materyal bileşenleri, etkileşim kurulduğunu belirtmek için dalgalar kullanır. Hiyerarşinizde MaterialTheme kullanıyorsanız clickable ve indication gibi değiştiricilerde varsayılanIndication olarak Ripple kullanılır.

Çoğu durumda, varsayılan Ripple metriğinden yararlanabilirsiniz. Proje başlatma belgesinde nasıl yapıldığını görmek için RippleTheme renk ve alfa gibi özellikleri değiştirin.

RippleTheme süresini uzatabilir ve defaultRippleColor ve defaultRippleAlpha yardımcı program işlevlerine dahildir. Ardından, LocalRippleTheme kullanarak özel dalga temanızı hiyerarşinizde sağlayabilirsiniz:

@Composable fun MyApp() {     MaterialTheme {         CompositionLocalProvider(             LocalRippleTheme provides SecondaryRippleTheme         ) {             // App content         }     } }  @Immutable private object SecondaryRippleTheme : RippleTheme {     @Composable     override fun defaultColor() = RippleTheme.defaultRippleColor(         contentColor = MaterialTheme.colors.secondary,         lightTheme = MaterialTheme.colors.isLight     )      @Composable     override fun rippleAlpha() = RippleTheme.defaultRippleAlpha(         contentColor = MaterialTheme.colors.secondary,         lightTheme = MaterialTheme.colors.isLight     ) }

alt_text

Şekil 14. RippleTheme aracılığıyla sağlanan farklı dalga değerlerine sahip düğmeler.

Daha fazla bilgi

Compose'da Materyal tema oluşturma hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara göz atın.

Codelab uygulamaları

Videolar