package
com.example.newcanaryproject
import
android.content.Context
import
android.os.Bundle
import
android.widget.Toast
import
androidx.activity.ComponentActivity
import
androidx.activity.compose.setContent
import
androidx.compose.foundation.*
import
androidx.compose.foundation.layout.*
import
androidx.compose.foundation.lazy.GridCells
import
androidx.compose.foundation.lazy.LazyColumn
import
androidx.compose.foundation.lazy.LazyVerticalGrid
import
androidx.compose.foundation.lazy.itemsIndexed
import
androidx.compose.foundation.shape.RoundedCornerShape
import
androidx.compose.material.*
import
androidx.compose.runtime.*
import
androidx.compose.ui.Alignment
import
androidx.compose.ui.Modifier
import
androidx.compose.ui.graphics.Color
import
androidx.compose.ui.layout.Layout
import
androidx.compose.ui.platform.LocalContext
import
androidx.compose.ui.res.painterResource
import
androidx.compose.ui.text.font.FontWeight
import
androidx.compose.ui.text.style.TextAlign
import
androidx.compose.ui.unit.*
import
coil.compose.rememberAsyncImagePainter
import
com.example.newcanaryproject.ui.theme.*
import
java.util.*
class
MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContent {
NewCanaryProjectTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.background
) {
Scaffold(
topBar = {
TopAppBar(backgroundColor = greenColor,
title = {
Text(
text =
"Staggered Grid View Example"
,
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
color = Color.White
)
}
)
}
) {
StaggeredGridView()
}
}
}
}
}
}
@Composable
fun StaggeredGridView() {
val images = listOf(
R.drawable.imgone,
R.drawable.imgtwo,
R.drawable.imgthree,
R.drawable.imgfour,
R.drawable.imgfive,
R.drawable.imgsix,
R.drawable.imgseven,
R.drawable.imgeight,
R.drawable.imgnine,
R.drawable.imgten
)
Column(
modifier = Modifier
.fillMaxSize()
) {
Column(
modifier = Modifier
.verticalScroll(rememberScrollState())
.padding(
5
.dp)
) {
CustomStaggeredVerticalGrid(
numColumns =
2
,
modifier = Modifier.padding(
5
.dp)
) {
images.forEach { img ->
Card(
modifier = Modifier
.fillMaxWidth()
.padding(
5
.dp),
elevation =
10
.dp,
shape = RoundedCornerShape(
10
.dp)
) {
Column(
modifier = Modifier
.fillMaxSize()
.align(Alignment.CenterHorizontally),
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painterResource(id = img),
contentDescription =
"images"
,
alignment = Alignment.Center,
)
}
}
}
}
}
}
}
@Composable
fun CustomStaggeredVerticalGrid(
modifier: Modifier = Modifier,
numColumns: Int =
2
,
content:
@Composable
() -> Unit
) {
Layout(
content = content,
modifier = modifier
) { measurable, constraints ->
val columnWidth = (constraints.maxWidth / numColumns)
val itemConstraints = constraints.copy(maxWidth = columnWidth)
val columnHeights = IntArray(numColumns) {
0
}
val placeables = measurable.map { measurable ->
val column = testColumn(columnHeights)
val placeable = measurable.measure(itemConstraints)
columnHeights[column] += placeable.height
placeable
}
val height =
columnHeights.maxOrNull()?.coerceIn(constraints.minHeight, constraints.maxHeight)
?: constraints.minHeight
layout(
width = constraints.maxWidth,
height = height
) {
val columnYPointers = IntArray(numColumns) {
0
}
placeables.forEach { placeable ->
val column = testColumn(columnYPointers)
placeable.place(
x = columnWidth * column,
y = columnYPointers[column]
)
columnYPointers[column] += placeable.height
}
}
}
}
private
fun testColumn(columnHeights: IntArray): Int {
var minHeight = Int.MAX_VALUE
var columnIndex =
0
columnHeights.forEachIndexed { index, height ->
if
(height < minHeight) {
minHeight = height
columnIndex = index
}
}
return
columnIndex
}