Neste tutorial vamos criar um aplicativo para calcular o índice de massa corporal, conhecido pela sigla de IMC é um cálculo que permite medir se alguém está ou não com o peso ideal a partir das entradas dos dados do indivíduo como peso e altura. O Aplicativo exibirá o resultado do IMC e a classificação do resultado conforme tabela da organização mundial de saúde. A aplicação será desenvolvida na linguagem de programação kotlin junto com a ferramenta de UI do Google jetpack compose e IDE Android Studio.
Pré-requisitos
- Linguagem de programação kotlin - básico
- Logica de programação
Ferramentas
- IDE Android Studio versão 2021.3.1 ou mais recente
O que você apreenderá
- Criar um projeto com jetpack compose
- Manipular entrada e saída de dados
o que é jetpack compose
É um kit de ferramentas moderno recomendado pelo Android para criar IUs nativas. Ele simplifica e acelera o desenvolvimento da IU no Android. Dê vida ao seu app rapidamente com menos código, ferramentas eficientes e APIs Kotlin intuitivas.
Formula para calcular Índice de Massa Corporal
IMC = Peso / altura²
Vamos iniciar o desenvolvimento do projeto
Abra a IDE Android Studio e clique em New Project
Na janela New Project, selecione Empty Compose Activity e clique em Next.
Dê o nome a aplicação de CalculatorIMC e clique em Finish
Projeto está pronto para receber as linhas de código do nosso App
No pacote res, escolha values, abra o arquivo **string.xml" e crie as Strings do App
resources> <!--Nome da aplicacação--> <string name="app_name">CalculatorIMC</string> <!--Titulo da tela principal do App--> <string name="title_home">IMC - Calculadora do Índice de Massa Corporal</string> <!--Texto para entrada de dados peso e altura--> <string name="text_peso">Informe o Peso (Ex:80.0)</string> <string name="text_altura">Informe Altura (Ex: 1.70)</string> <!--Texto dos botões--> <string name="buttom_clean">Limpar</string> <string name="buttom_calculator">Calcular IMC</string> </resources>
Tela da calculadora
Função Composable
@OptIn(ExperimentalAnimationApi::class) @Composable fun HomeImc() { //Declaração da varivéis para entrada de dados conforme regra var peso by remember { mutableStateOf("") } var altura by remember { mutableStateOf("") } var result_imc by remember { mutableStateOf("") } var show by remember { mutableStateOf(false) } val context = LocalContext.current val requestFocus = FocusRequester() //aplicar uma margens e alinhar os campos Column(modifier = Modifier .fillMaxWidth() .padding(all = 15.dp), horizontalAlignment = Alignment.CenterHorizontally){ //campos para entrada de dados: Peso OutlinedTextField( modifier = Modifier.focusRequester(requestFocus), value = peso, onValueChange = { peso = it }, label = { Text(text = stringResource(id = R.string.text_peso), fontWeight = FontWeight.Bold,color = Color.White, fontSize = 21.sp)}, placeholder = { Text(text = stringResource(id = R.string.text_exemple_peso), color = Color.White)}, textStyle = TextStyle(fontSize = 21.sp, fontWeight = FontWeight.Medium, color = Color.White), leadingIcon = { Icon(tint = Color.White, painter = painterResource(id = R.drawable.ic_peso), contentDescription = "Peso") }, colors = TextFieldDefaults.outlinedTextFieldColors( focusedBorderColor = Color.Transparent, unfocusedBorderColor = Color.Transparent, cursorColor = Color.White ), keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number, imeAction = ImeAction.Next ), singleLine = true ) Space1() //campos para entrada de dados: Altura OutlinedTextField( value = altura, onValueChange = { altura = it }, label = { Text(text = stringResource(id = R.string.text_altura), fontWeight = FontWeight.Bold, color = Color.White, fontSize = 21.sp) }, placeholder = { Text(text = stringResource(id = R.string.text_exemple_altura), color = Color.White) }, textStyle = TextStyle(fontSize = 21.sp, fontWeight = FontWeight.Medium, color = Color.White), leadingIcon = { Icon(tint = Color.White, painter = painterResource(id = R.drawable.ic_altura), contentDescription = "altura")}, colors = TextFieldDefaults.outlinedTextFieldColors( focusedBorderColor = Color.Transparent, unfocusedBorderColor = Color.Transparent, cursorColor = Color.White ), keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number, imeAction = ImeAction.Done ), keyboardActions = KeyboardActions { if (peso.isNotEmpty() && altura.isNotEmpty()) { //Ação no teclado result_imc = calculatorImc(peso,altura) show = true } else { Toast.makeText(context,"Preencha os campos",Toast.LENGTH_LONG).show() requestFocus.requestFocus() } }, singleLine = true ) Space1() //Button Criação de evento Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly){ OutlinedButton( onClick = { peso = "" altura = "" show = false requestFocus.requestFocus() }) { Text(text = stringResource(id = R.string.buttom_clean)) } OutlinedButton( onClick = { if (peso.isNotEmpty() && altura.isNotEmpty()) { //Ação result_imc = calculatorImc(peso,altura) show = true } else { Toast.makeText(context,"Preencha os campos",Toast.LENGTH_LONG).show() requestFocus.requestFocus() } }) { Text(text = stringResource(id = R.string.buttom_calculator)) } } //saida de dados: resultado animação //Resultado AnimatedVisibility( visible = show, enter = scaleIn() + expandVertically(expandFrom = Alignment.CenterVertically), exit = scaleOut() + shrinkVertically(shrinkTowards = Alignment.CenterVertically) ) { Text( text = result_imc, style = MaterialTheme.typography.h4, fontWeight = FontWeight.Bold, color = Color.White) } } }
Função para calcular IMC com base na formula
//Função para calcular IMC retornando uma string fun calculatorImc(weight: String, height: String):String { //Receber dados de entrada e converter em double val peso = weight.toDouble() val altura = height.toDouble() //Processamento: formula para o calculo do IMC val calculeImc = peso / (altura*altura) //Formatar Numero val resultFormt: Double = String.format("%.1f", calculeImc).toDouble() //Função para classificação IMC: Recebi por parametro o resultado do // calculo já convertido em double e retorna uma String com resultado da //classificação return classificationImc(resultImc = resultFormt) }
função para classificar o resultado do IMC
//função para classificar o resultado do IMC: Recibe no para o Double fun classificationImc(resultImc: Double):String{ var resulClassificationtImc = "" //Classificação conforme tabela da OMS a partir do IMC if (resultImc <18.5f){ //MENOR QUE 18,5 -> Baixo pesso - Baixo resulClassificationtImc = "Baixo Peso" }else{ if (resultImc>=18.5 && resultImc <24.9){ //ENTRE 18,5 E 24,9 -> Normal - Adequado resulClassificationtImc = "Peso Adequado" }else{ if (resultImc == 25.0){ //Igual a 25 -> Normal - Risco resulClassificationtImc = "Risco de SobrePeso" }else{ if (resultImc > 25 && resultImc<=29.9){ //ENTRE 25,0 E 29,9 -> Sobrepreso Aumentado resulClassificationtImc = "Pré-Obeso" }else{ if(resultImc>=30 && resultImc<=34.9){ //ENTRE 30,0 E 34,9 -> Obesidade - Moderado resulClassificationtImc = "Obesidade GRAU I" }else{ if (resultImc>=35 && resultImc<=39.9){ //ENTRE 35,0 E 39,9 -> Obesidade Mórbida - Grave resulClassificationtImc = "Obesidade GRAU II" }else{ //resultImc > 40 //Igual ou Maior 40 -> Obesidade Mórbida - Muito Grave resulClassificationtImc = "Obesidade GRAU III" } } } } } } return "Seu Imc É: ${resultImc}\n\n"+resulClassificationtImc+"\n" }
Resultado final
Repositório Calculador IMC
Top comments (0)