美文网首页
Android Compose(4) 布局单个滑动页面

Android Compose(4) 布局单个滑动页面

作者: zcwfeng | 来源:发表于2023-05-19 10:41 被阅读0次

    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))
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Android Compose(4) 布局单个滑动页面

          本文链接:https://www.haomeiwen.com/subject/aragsdtx.html