Compose 开发入门级别页面,可以练习到简单封装和组件的使用
- LazyHorizontalGrid
- LazyRow
- Theme
- Column/Row
- Surface/Scaffold
- Image/Text/Spacer
package top.zcwfeng.learncompose.ui.compose
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyHorizontalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AccountCircle
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Spa
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import top.zcwfeng.learncompose.R
import top.zcwfeng.learncompose.ui.compose.data.alignYourBodyData
import top.zcwfeng.learncompose.ui.compose.data.favoriteCollectionsData
import top.zcwfeng.learncompose.ui.theme.LearnComposeTheme
import java.util.*
/**
* 顶部搜索导航UI
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SearchBar(
modifier: Modifier = Modifier
) {
TextField(
value = "",
onValueChange = {},
leadingIcon = {
Icon(imageVector = Icons.Default.Search, contentDescription = null)
},
modifier = modifier
.fillMaxWidth()
.heightIn(min = 56.dp),
colors = TextFieldDefaults.colors(MaterialTheme.colorScheme.surface),
placeholder = {
Text(text = stringResource(id = R.string.placeholder_search))
}
)
}
/**
* LazyRow列表
*/
@Composable
fun AlignYourBodyRow(modifier: Modifier = Modifier) {
LazyRow(
modifier = modifier,
horizontalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(16.dp)
) {
items(alignYourBodyData) { item ->
AlignYourBodyElement(drawable = item.drawable, text = item.text)
}
}
}
/**
* LazyHorizontalGrid 列表
*/
@Composable
fun FavoriteCollectionsGrid(modifier: Modifier = Modifier) {
LazyHorizontalGrid(
modifier = modifier.height(120.dp),
rows = GridCells.Fixed(2),
contentPadding = PaddingValues(16.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(favoriteCollectionsData) { item ->
FavoriteCollectionCard(
drawable = item.drawable,
text = item.text,
modifier = Modifier.height(56.dp)
)
}
}
}
/**
* 顶部横向滑动列表的Item
* Align your body 对齐方式
*/
@Composable
fun AlignYourBodyElement(
@DrawableRes drawable: Int,
@StringRes text: Int,
modifier: Modifier = Modifier
) {
Column(
modifier = modifier,
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = painterResource(drawable),
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier
.size(88.dp)
.clip(CircleShape)
)
Text(
text = stringResource(id = text),
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.paddingFromBaseline(
top = 24.dp, bottom = 8.dp
)
)
}
}
/**
* 横向布局卡片,Material Surface
*/
@Composable
fun FavoriteCollectionCard(
@DrawableRes drawable: Int,
@StringRes text: Int,
modifier: Modifier = Modifier
) {
Surface(
shape = MaterialTheme.shapes.small,
modifier = modifier
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.width(192.dp)
) {
Image(
painter = painterResource(drawable),
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.size(56.dp)
)
Text(
text = stringResource(text),
style = MaterialTheme.typography.labelSmall,
modifier = Modifier.padding(horizontal = 16.dp)
)
}
}
}
/**
* 首页部分
*/
@Composable
fun HomeSection(
@StringRes title: Int,
modifier: Modifier = Modifier,
content: @Composable () -> Unit
) {
Column(modifier) {
Text(
text = stringResource(id = title).uppercase(Locale.getDefault()),
style = MaterialTheme.typography.labelMedium,
modifier = Modifier
.paddingFromBaseline(top = 40.dp, bottom = 8.dp)
.padding(horizontal = 16.dp)
)
content()
}
}
@Composable
fun HomeScreen(modifier: Modifier = Modifier) {
Column(
modifier
.verticalScroll(rememberScrollState())
.padding(vertical = 16.dp)
) {
Spacer(modifier = Modifier.height(16.dp))
SearchBar(Modifier.padding(horizontal = 16.dp))
HomeSection(title = R.string.align_your_body) {
AlignYourBodyRow()
}
HomeSection(title = R.string.favorite_collections) {
FavoriteCollectionsGrid()
}
Spacer(modifier = Modifier.height(16.dp))
}
}
@Composable
fun SootheBottomNavigation(modifier: Modifier = Modifier) {
NavigationBar(modifier) {
NavigationBarItem(
icon = {
Icon(
imageVector = Icons.Default.Spa,
contentDescription = null
)
},
label = {
Text(stringResource(R.string.bottom_navigation_home))
},
selected = true,
onClick = {}
)
NavigationBarItem(
icon = {
Icon(
imageVector = Icons.Default.AccountCircle,
contentDescription = null
)
},
label = {
Text(stringResource(R.string.bottom_navigation_profile))
},
selected = false,
onClick = {}
)
}
}
@Preview
@Composable
fun LayoutCardPreview() {
LearnComposeTheme {
FavoriteCollectionCard(
text = R.string.fc2_nature_meditations,
drawable = R.drawable.androidparty,
modifier = Modifier.padding(8.dp)
)
}
}
@Preview
@Composable
fun LayoutSearchPreview() {
SearchBar()
}
@Preview(showBackground = true)
@Composable
fun LayoutImagePreview() {
AlignYourBodyElement(
text = R.string.ab1_inversions,
drawable = R.drawable.androidparty,
modifier = Modifier.padding(8.dp)
)
}
@Preview(showBackground = true)
@Composable
fun LayoutLazyRowPreview() {
LearnComposeTheme {
AlignYourBodyRow()
}
}
@Preview(showBackground = true)
@Composable
fun LayoutLazyGridPreview() {
LearnComposeTheme {
FavoriteCollectionsGrid()
}
}
@Preview(showBackground = true)
@Composable
fun LayoutHomeSectionPreview() {
LearnComposeTheme {
HomeSection(R.string.align_your_body) {
AlignYourBodyRow()
}
}
}
@Preview(showBackground = true, backgroundColor = 0xFFF0EAE2, heightDp = 180)
@Composable
fun ScreenContentPreview() {
LearnComposeTheme { HomeScreen() }
}
@Preview(showBackground = true)
@Composable
fun SootheBottomNavigationPreview(){
SootheBottomNavigation()
}
@Preview(showBackground = true)
@Composable
private fun SoothAppPreview(){
MySootheApp()
}
@Composable
fun MySootheApp() {
LearnComposeTheme() {
Scaffold(
bottomBar = { SootheBottomNavigation() }
) { padding ->
HomeScreen(Modifier.padding(padding))
}
}
}
网友评论