// RandomCircles Example // Source code file: MainActivity.kt // Draw 100 random circles using 7 colors. // Redraw 100 more random circles when // the button is clicked. package it372.ssmith.circlesfromfile import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.size import androidx.compose.ui.Alignment import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { MainLayout() } } } @Composable fun MainLayout( ) { val context = LocalContext.current Column( modifier = Modifier.padding(20.dp) .background(Color(0xFFE0E0E0)) .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally ) { Canvas( modifier = Modifier .padding(10.dp) .size(350.dp, 350.dp) .background(Color(0xFFC0C0C0)) .clipToBounds( ) .fillMaxSize( )) { // Read circle specs from // res/raw/circles.txt var line = "" // Use these colors to fill circles. val colors = listOf(Color.Red, Color.Yellow, Color.Green, Color.Cyan, Color.Blue, Color.Magenta) val inputStream = context.resources. openRawResource(R.raw.circles) inputStream.bufferedReader().useLines { it.forEach { // Each line contains specs for one // circle. line = it var fields = line.split(",") var x = fields[0].toFloat( ) var y = fields[1].toFloat( ) var r = fields[2].toFloat( ) var color = colors[fields[3].toInt( )] // Draw filled circle. drawCircle( color = color, radius = r, center = Offset(x = x, y = y) ) // Draw circle border. drawCircle( color = Color.Black, radius = r, center = Offset(x = x, y = y), style = Stroke(5f) ) } } } } } @Preview(showBackground = true) @Composable fun MainLayoutPreview() { MainLayout() }