Jetpack Compose, web sitesi tasarımı için kapsamlı bir tasarım sistemi olan Materyal Tasarım'ın dijital arayüzler oluşturmaktır. 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. Bunları özelleştirdiğinizde özelliklerini kullandığınızda, değişiklikleriniz kullandığınız bileşenlere otomatik olarak yansıtılır. en iyi uygulamaları görelim.
Jetpack Compose bu kavramları MaterialTheme
ile uygular
composable:
MaterialTheme( colors = // ... typography = // ... shapes = // ... ) { // app content }
Uygulamanıza tema eklemek için MaterialTheme
hizmetine 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 parametreleri MaterialTheme
öğesine ileten bir uygulamadır.
Renk
Renkler, Compose'da Color
sınıfıyla modellenir.
veri bekletme sınıfı.
val Red = Color(0xffff0000) val Blue = Color(red = 0f, green = 0f, blue = 1f)
Bunları istediğiniz gibi düzenleyebilirsiniz (üst düzey sabit değerler olarak, tekli veya satır içi olarak tanımlanan şekilde), renkleri kesinlikle ve renkleri oradan alabilirsiniz. Bu yaklaşım, koyu temayı ve iç içe yerleştirilmiş temaları kolayca desteklemelerini sağlayabilirsiniz.
Şekil 2. Material renk sistemi.
Compose, Colors
özelliğini sağlar
sınıfını
Malzeme renk sistemi. Colors
,
ışık setleri oluşturmak için oluşturucu işlevleri
veya koyu
renkler:
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
öğenizi tanımladıktan sonra bir MaterialTheme
öğesine aktarabilirsiniz:
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
composable'lar 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 ayarlamak, farklı metin ve simge renkleri oluşturur.
contentColorFor()
yöntemi, uygun "on" ayarını alır
farklı bir renk seçin. Örneğin, primary
arka plan rengi ayarlarsanız
Surface
üzerinde bu işlevi kullanarak onPrimary
'ı içerik olarak
rengi. Temadan farklı bir arka plan rengi ayarlarsanız ayrıca
uygun içerik rengine sahip olursunuz. LocalContentColor
kullanın
için tercih edilen içerik rengini almak için
belirli bir konumda gösterilir.
İç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.
Bir değer sağlayarak hiyerarşi için bir içerik alfa belirtebilirsiniz.
bu CompositionLocal
için
İç içe yerleştirilmiş
composable'lar, içeriklerine alfa işlemini uygulamak için bu değeri kullanabilir.
Örneğin, Text
ve Icon
varsayılan olarak LocalContentAlpha
kullanılacak şekilde ayarlanmış LocalContentColor
kombinasyonunu kullanın. Materyal, bazı standart alfa değerlerini (high
, medium
,
disabled
) ile ContentAlpha
nesnesi tarafından modellenir.
// 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.
4.Şekil Görsel olarak iletişim kurmak için metne farklı düzeylerde vurgu eklemek
hiyerarşik olarak düzenlenmiştir. Metnin ilk satırı başlıktır ve
en önemli bilgilere yer verir ve bu nedenle ContentAlpha.high
değerini kullanır. İkinci
satırı, daha az önemli meta veriler içerdiği için ContentAlpha.medium
kullanır.
Koyu tema
Compose'da farklı gruplar sağlayarak açık ve koyu tema
MaterialTheme
composable'a Colors
:
@Composable fun MyTheme( darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { MaterialTheme( colors = if (darkTheme) DarkColors else LightColors, /*...*/ content = content ) }
Bu örnekte, MaterialTheme
kendi composable işlevine sarmalanmış.
koyu tema kullanılıp kullanılmayacağını belirten bir parametreyi kabul eder. İçinde
Bu örnekte, işlevdarkTheme
cihaz teması ayarına dikkat edin.
Mevcut Colors
ışığının açık mı yoksa koyu mu olduğunu kontrol etmek için şuna benzer 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ı
Malzeme tasarımında, yüksekliği daha yüksek olan koyu temadaki yüzeyler yüksekliği yer paylaşımları arka planlarını aydınlatı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ı, şu özellik kullanılırken Surface
composable tarafından otomatik olarak uygulanır:
koyu renkler ve yüzey kullanılan diğer tüm Malzeme composable'lar için:
Surface( elevation = 2.dp, color = MaterialTheme.colors.surface, // color will be adjusted for elevation /*...*/ ) { /*...*/ }
5. Şekil. Hem kartlarda hem de alttaki gezinme bölmesinde surface
rengi kullanılıyor
sahipler. Kartlar ve alt gezinme seçenekleri farklı olduğundan
yüksekliğe sahip olsalar da, bu boyutlarda küçük farklılıklar
(kartlar arka plandan daha açık renkli ve alt gezinme paneli,
daha hafif.
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 null
öğesini
composable hiyerarşi:
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 composable'lar
varsayılan olarak uygulayın.
6. Şekil. Sınırlı renk vurgularına sahip koyu renkli malzeme teması. Üst uygulama çubuğu açık temada birincil rengi ve koyu temada yüzey rengini kullanı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
Materyal, bir tür sistem, ve anlamsal olarak adlandırılmış az sayıda stil kullanmanızı teşvik edebilir.
7.Şekil Malzeme türü sistemi.
Compose, tür sistemini Typography
, TextStyle
ve yazı tipiyle ilgili sınıflarıyla uygular. Typography
oluşturucu, her stil için varsayılan ayarlar sunar. Böylece, özelleştirmek istemediklerinizi çıkarabilirsiniz:
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, /*...*/) { /*...*/ }
Baştan itibaren aynı yazı karakterini kullanmak istiyorsanız
defaultFontFamily parameter
ve TextStyle
öğelerinin fontFamily
değerini çıkarın:
val typography = Typography(defaultFontFamily = raleway) MaterialTheme(typography = typography, /*...*/) { /*...*/ }
Metin stillerini kullanma
TextStyle
alanına MaterialTheme.typography
üzerinden erişiliyor. Al
TextStyle
şöyle:
Text( text = "Subtitle2 styled", style = MaterialTheme.typography.subtitle2 )
8. Şekil. Markanızı ifade etmek için çeşitli yazı tipleri ve stiller kullanın.
Şekil
Materyal, bir şekil sistemi, kullanarak büyük, orta ve küçük bileşenler için şekiller tanımlayabilirsiniz.
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. şununla Shape
'ları al:
kod şöyle olur:
Surface( shape = MaterialTheme.shapes.medium, /*...*/ ) { /*...*/ }
Şekil 10. Markayı veya durumu ifade etmek için şekilleri kullanın.
Varsayılan stiller
Oluşturulma bölümünde eşdeğer bir kavram yok varsayılan stiller olarak ayarlanır. Materyal bileşenlerini sarmalayan kendi "aşırı yükleme" composable işlevlerinizi oluşturarak da benzer işlevleri sağlayabilirsiniz. Örneğin, bir düğme stili oluşturmak için bir düğmeyi kendi composable işlevinize sarmalayın, değiştirmek istediğiniz parametreleri doğrudan ayarlayın ve diğerlerini, kapsayıcı composable'a 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ı
2007'den bu yana
İç içe yerleştirerek Compose'da Android Görünümleri'ndeki tema yer paylaşımları
MaterialTheme
composable. Çünkü
MaterialTheme
renkleri, yazı tipini ve şekilleri varsayılan olarak mevcut tema değerine ayarlar. Bir tema bu parametrelerden yalnızca birini ayarlıyorsa diğer parametreler varsayılan değerlerini korur.
Ayrıca, görüntülemeye dayalı ekranları Compose'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 bir kısmı için PinkTheme
, ardından ilgili bölüm için BlueTheme
kullanılmıştı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şimde bulunulabilen malzeme bileşenleri (tıklanmış, açılıp kapatılabilir vb.) farklı görsel durumlarda. Durumlar arasında etkin, devre dışı, basıldı vb. yer alır.
Özelleştirilebilir öğeler genellikle bir enabled
parametresine sahiptir. 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
(solda) ve enabled = false
öğesini içeren düğme
(sağ) tıklayın.
Ç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 istiyorsanız fonksiyonları da var. 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
Malzeme bileşenleri, etkileşim kurduklarını belirtmek için dalgalar kullanır. Eğer
hiyerarşinizde MaterialTheme
kullanıyorsanız bir Ripple
,
varsayılanIndication
gibi değiştiricilerin içinde
clickable
ve
indication
.
Çoğu durumda, varsayılan Ripple
metriğinden yararlanabilirsiniz. Proje planınızda
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 özel dalga temanızı kullanarak hiyerarşinizde
LocalRippleTheme
:
@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ğıdakilere bakın ek kaynaklar.
Codelab'ler
Videolar
ziyaret edin.Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Compose'da özel tasarım sistemleri
- Compose'da Materyal 2'den Materyal 3'e geçiş
- Compose'da erişilebilirlik