DEV Community

Cover image for Crie um Aplicativo IMC para Android
Gilber
Gilber

Posted on • Edited on

4 2

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

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay