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.
Ş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.
Ş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.
Ş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( // ... ) }
MaterialTheme
, varsayılan olarak LocalContentAlpha
yerine ContentAlpha.high
değerini alır.CompositionLocal
hakkında daha fazla bilgi için
CompositionLocal rehberi.
Ş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 /*...*/ ) { /*...*/ }
Ş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.
Ş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 )
Ş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.
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, /*...*/ ) { /*...*/ }
Ş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 ) }
Ş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
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Compose'da özel tasarım sistemleri
- Oluştur'da 2. Malzeme'den 3. Malzeme'ye geçme
- Oluşturma bölümünde erişilebilirlik