Crie um Aplicativo IMC para Android
Published: 2022-12-09 04:36:14

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g652woyszpzqlnrd77vn.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/satw3svh9pi9fixrvb3x.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ko7yad43cs7kc5sb32ro.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pagui4ef3y073iucnlod.png)

No pacote **res**, escolha **values**, abra o arquivo **string.xml" e crie as Strings do App
```kotlin
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
```kotlin
 @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**

```kotlin
//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**

```kotlin
//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**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ni0ky5tad1dkkimkhum.gif)

**Repositório** [Calculador IMC](https://github.com/gilbercs/Imc_Calculadora)