Untitled

 avatar
unknown
plain_text
a month ago
2.7 kB
2
Indexable
# Custom Android Home Screen Layout with Jetpack Compose

```kotlin
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.animation.core.*
import androidx.compose.foundation.Image
import androidx.compose.foundation.gestures.detectHorizontalDragGestures
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyGridState
import androidx.compose.foundation.lazy.grid.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painterResource
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            HomeScreen()
        }
    }
}

@Composable
fun HomeScreen() {
    val packageManager = LocalContext.current.packageManager
    val apps = remember { getInstalledApps(packageManager) }
    var gridSize by remember { mutableStateOf(3) }
    
    LazyVerticalGrid(
        columns = GridCells.Fixed(gridSize),
        modifier = Modifier.fillMaxSize()
    ) {
        items(apps) { app ->
            AppIcon(app) {
                // Handle app launch with animation
            }
        }
    }
}

@Composable
fun AppIcon(app: AppInfo, onClick: () -> Unit) {
    val scale = remember { Animatable(1f) }
    
    Box(
        modifier = Modifier
            .size(64.dp)
            .pointerInput(Unit) {
                detectHorizontalDragGestures { _, _ ->
                    // Handle swipe down gesture to close app
                }
            }
            .clickable {
                onClick()
                // Trigger scaling animation
                scale.animateTo(0.9f, animationSpec = tween(100))
                scale.animateTo(1f, animationSpec = tween(100))
            }
    ) {
        Image(
            painter = painterResource(id = app.iconResId),
            contentDescription = app.name,
            modifier = Modifier.scale(scale.value)
        )
    }
}

data class AppInfo(val name: String, val iconResId: Int)

fun getInstalledApps(packageManager: PackageManager): List<AppInfo> {
    val apps = mutableListOf<AppInfo>()
    val packages = packageManager.getInstalledApplications(0)
    for (packageInfo in packages) {
        apps.add(AppInfo(packageInfo.loadLabel(packageManager).toString(), packageInfo.icon))
    }
    return apps
}
Editor is loading...
Leave a Comment