DEV Community

Cover image for Crie um Aplicativo IMC para Android
Gilber
Gilber

Posted on • Edited on

Crie um Aplicativo IMC para Android

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

Image description

Na janela New Project, selecione Empty Compose Activity e clique em Next.

Image description

Dê o nome a aplicação de CalculatorIMC e clique em Finish

Image description

Projeto está pronto para receber as linhas de código do nosso App

Image description

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>
Enter fullscreen mode Exit fullscreen mode

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)
                }
            }
        }
Enter fullscreen mode Exit fullscreen mode

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)
    }
Enter fullscreen mode Exit fullscreen mode

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"
    }
Enter fullscreen mode Exit fullscreen mode

Resultado final

Image description

Repositório Calculador IMC

Top comments (0)