Android安卓实战项目(9)—漂亮的健身APP主页控件+开机动画+BMI计算(源码在文末)

Android安卓实战项目(9)—漂亮的健身控件APP+开机动画+BMI计算(源码在文末)

介绍: BMI(Body Mass Index,身体质量指数)是一种常用的健康指标,用于评估一个人的体重是否合理。在本篇博客中,我们将使用Android Studio开发一个简单的应用程序,用于计算用户的BMI,并根据计算结果显示相应的BMI分类和背景颜色。我们将逐步介绍代码实现和功能,让您了解整个过程。

前提条件: 在开始之前,您需要安装Android Studio,并了解一些基本的Java和Android开发知识。

一.项目运行介绍

源码展示

Android安卓实战项目(9)—漂亮的健身APP主页控件+开机动画+BMI计算(源码在文末)_第1张图片

APP图标

Android安卓实战项目(9)—漂亮的健身APP主页控件+开机动画+BMI计算(源码在文末)_第2张图片

开机动画

Android安卓实战项目(9)—漂亮的健身APP主页控件+开机动画+BMI计算(源码在文末)_第3张图片

主页面

Android安卓实战项目(9)—漂亮的健身APP主页控件+开机动画+BMI计算(源码在文末)_第4张图片

BMI计算界面

Android安卓实战项目(9)—漂亮的健身APP主页控件+开机动画+BMI计算(源码在文末)_第5张图片

BMI历史记录

Android安卓实战项目(9)—漂亮的健身APP主页控件+开机动画+BMI计算(源码在文末)_第6张图片

其他控件不过多展示

二.具体实现

(部分代码解释)

MainActivity.java
package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;

import com.example.myapplication.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
    @NonNull
    ActivityMainBinding binding;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        getSupportActionBar().hide();

        binding.ExerciseId.setOnClickListener(view -> {

        Intent intent = new Intent(this,AllExercises.class);
        startActivity(intent);

        });

        binding.FoodId.setOnClickListener(view -> {

            Intent intent = new Intent(this,Food_page.class);
            startActivity(intent);

        });

        binding.BmiId.setOnClickListener(view -> {

            Intent intent = new Intent(this,BMI_Page.class);
            startActivity(intent);

        });

        binding.InfoId.setOnClickListener(view -> {

//        Toast.makeText(MainActivity.this , "App That Help You To Gain Muscles", Toast.LENGTH_LONG).show();
            Intent intent = new Intent(this,Info_page.class);
            startActivity(intent);

        });




    }}
  1. 导入语句:
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import com.example.myapplication.databinding.ActivityMainBinding;

代码开始时导入了必要的类和库。它包括来自AndroidX和AppCompatActivity库的组件,Intent类用于启动新的活动,并且还导入了一个数据绑定类(ActivityMainBinding),用于访问布局文件中的UI元素。

  1. MainActivity类:
public class MainActivity extends AppCompatActivity {
    @NonNull
    ActivityMainBinding binding;
    // ...
}

这一行声明了一个名为MainActivity的类,它继承自AppCompatActivity。它还声明了一个类型为ActivityMainBinding的变量binding,用于数据绑定以访问活动布局文件中的UI元素。

  1. onCreate()方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    getSupportActionBar().hide();
    // ...
}

onCreate()方法在活动创建时被调用。以下是它的功能:

  • super.onCreate(savedInstanceState);:它调用父类的onCreate()方法来执行必要的初始化。

  • binding = ActivityMainBinding.inflate(getLayoutInflater());:它使用ActivityMainBinding类(根据布局XML文件生成)来填充布局并创建一个名为binding的绑定对象,以便访问UI元素。

  • setContentView(binding.getRoot());:这将活动的内容视图设置为使用数据绑定填充的布局的根视图。

  • getSupportActionBar().hide();:这将隐藏活动的默认动作栏(顶部工具栏)。

  1. 按钮点击监听器:
binding.ExerciseId.setOnClickListener(view -> {
    Intent intent = new Intent(this, AllExercises.class);
    startActivity(intent);
});
// ...

代码为不同的按钮(ExerciseIdFoodIdBmiIdInfoId)定义了点击监听器。当这些按钮被点击时,将执行与其关联的操作。

  • 当点击ExerciseId按钮时,它创建一个启动AllExercises活动的Intent,并使用startActivity(intent)启动该活动。

  • 类似地,当点击FoodIdBmiIdInfoId按钮时,分别创建相应的Intent对象来启动Food_pageBMI_PageInfo_page活动。

总的来说,这段代码设置了Android应用程序的主活动,使用数据绑定处理UI元素,并为特定的按钮提供了点击监听器,以便在应用程序内启动不同的活动。


BMI_Page.java
package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.Toast;

import com.example.myapplication.databinding.ActivityBmiPageBinding;

import java.util.ArrayList;

public class BMI_Page extends AppCompatActivity {

    @NonNull ActivityBmiPageBinding binding;
    int intialWeight = 50;
    int intialِAge= 20;
    int intialHeight = 170;
    boolean everyThingIsRigyt = true;
    String currentHeaight = "170";
    String currentWeight = "50";
    String typeOfUser = "0";
    String currentAge= "20";
    private Button but;

    DBHelper myDB;
    ArrayList BMI, height, weight, age;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityBmiPageBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        getSupportActionBar().hide();
        binding.calculateBmi.setOnClickListener(view -> {
            calculateBmi();
        });
        binding.male.setOnClickListener(view -> {
            binding.male.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.selected_gender));
            binding.female.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.card_back));
            typeOfUser = "Male";

        });
        binding.female.setOnClickListener(view -> {
            binding.female.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.selected_gender));
            binding.male.setBackground(ContextCompat.getDrawable(getApplicationContext(), R.drawable.card_back));
            typeOfUser = "Female";

        });
        binding.seekbar.setMax(280);
        binding.seekbar.setProgress(170);
        binding.seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                intialHeight = i;
                currentHeaight = String.valueOf(intialHeight);
                binding.currentHeight.setText(currentHeaight);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }

        });
        binding.incrementAge.setOnClickListener(view -> {
            intialِAge = intialِAge+1;
            currentAge= String.valueOf(intialِAge);
            binding.currentAge.setText(currentAge);
        });
        binding.decrementAge.setOnClickListener(view -> {
            intialِAge = intialِAge-1;
            currentAge= String.valueOf(intialِAge);
            binding.currentAge.setText(currentAge);
        });
        binding.incrementWeight.setOnClickListener(view -> {
            intialWeight = intialWeight+1;
            currentWeight= String.valueOf(intialWeight);
            binding.currentWeight.setText(currentWeight);
        });
        binding.decrementWeight.setOnClickListener(view -> {
            intialWeight = intialWeight-1;
            currentWeight= String.valueOf(intialWeight);
            binding.currentWeight.setText(currentWeight);
        });

        myDB = new DBHelper(this);
        BMI = new ArrayList<>();
        height = new ArrayList<>();
        weight = new ArrayList<>();
        age = new ArrayList<>();



        displayData();
        but=(Button) findViewById(R.id.viewhistory);
        but.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                open_history();
            }
        });

    }
    public void open_history(){
        Intent intent =new Intent(this,BMI_History.class);
        startActivity(intent);
    }

    private void calculateBmi() {
        if(typeOfUser.equals("0")){
            Toast.makeText(this, "Please Enter Reasonable Data", Toast.LENGTH_SHORT).show();
            everyThingIsRigyt = false;
        }
        if (intialHeight <= 0 || currentHeaight.equals("0")){
            Toast.makeText(this, "Please Enter Reasonable Data", Toast.LENGTH_SHORT).show();
            everyThingIsRigyt = false;
        }
        if  (intialWeight<=0|| currentWeight.equals("0")){
            Toast.makeText(this, "Please Enter Reasonable Data", Toast.LENGTH_SHORT).show();
            everyThingIsRigyt = false;
        }
        if (currentAge.equals("0")||intialِAge<=0){
            Toast.makeText(this, "Please Enter Reasonable Data", Toast.LENGTH_SHORT).show();
            everyThingIsRigyt = false;
        }
        if (everyThingIsRigyt){
            Intent intent = new Intent(this,BMI_Result.class);
            intent.putExtra("gender", typeOfUser);
            intent.putExtra("height",currentHeaight );
            intent.putExtra("weight", currentWeight);
            intent.putExtra("age", currentAge);

            startActivity(intent);

        }
        else {
            everyThingIsRigyt = true;
        }

    }

    void displayData(){
        Cursor cursor = myDB.readAllData(); //store there result from our readAllData in our cursor obj
        if (cursor.getCount() == 0){ //there is no data
            Toast.makeText(this, "No Data. ", Toast.LENGTH_SHORT).show();
        }
        else {
            while (cursor.moveToNext()){ //read all data from our cursor
                BMI.add(cursor.getString(4)); //0 means the 1st column
                height.add(cursor.getString(2)); //1 means the 2nd column
                weight.add(cursor.getString(1)); //2 means the 3rd column
                age.add(cursor.getString(3)); //3 means the 4th column
            }
        }
    }

}

代码中的主要类是BMI_Page,表示一个身体质量指数(BMI)页面的活动。我们来一步一步详细解释代码:

  1. 导入语句:
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.Toast;

import com.example.myapplication.databinding.ActivityBmiPageBinding;

import java.util.ArrayList;

代码开始时,导入了必要的类和库,包括用于创建和管理活动(AppCompatActivity),支持向下兼容性(ContextCompat),用于处理滑动条(SeekBar),用于显示提示消息(Toast)的类,以及一些其他辅助类。

  1. BMI_Page类:
public class BMI_Page extends AppCompatActivity {
    @NonNull
    ActivityBmiPageBinding binding;
    int intialWeight = 50;
    int intialِAge= 20;
    int intialHeight = 170;
    boolean everyThingIsRigyt = true;
    String currentHeaight = "170";
    String currentWeight = "50";
    String typeOfUser = "0";
    String currentAge= "20";
    private Button but;

    DBHelper myDB;
    ArrayList<String> BMI, height, weight, age;
    // ...
}

该代码声明了一个名为BMI_Page的类,它扩展自AppCompatActivity,表示一个身体质量指数(BMI)页面的活动。它还声明了一些变量,包括身高、体重、年龄等初始值和用户选择的性别类型。此外,还有一些辅助变量和数据库相关的变量和数据结构(DBHelperArrayList)。

  1. onCreate()方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityBmiPageBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    getSupportActionBar().hide();
    // ...
}

onCreate()方法是活动在创建时自动调用的方法。在这里进行了一些初始化设置:

  • super.onCreate(savedInstanceState);:这将调用父类的onCreate()方法,执行必要的初始化。

  • binding = ActivityBmiPageBinding.inflate(getLayoutInflater());:通过使用ActivityBmiPageBinding类(基于布局XML文件自动生成)来填充布局并创建一个名为binding的绑定对象,以便在活动中访问UI元素。

  • setContentView(binding.getRoot());:设置活动的内容视图为通过数据绑定填充的布局的根视图。

  • getSupportActionBar().hide();:隐藏活动的默认动作栏(顶部工具栏)。

  1. 点击监听器:
    该代码包含一些点击事件的监听器,处理用户在页面上的交互。
  • binding.calculateBmi.setOnClickListener(view -> {...});:计算BMI的按钮点击监听器。在点击该按钮时,将调用calculateBmi()方法。

  • binding.male.setOnClickListener(view -> {...});:性别选择按钮(男性)的点击监听器。在点击该按钮时,将更改选定的性别为男性。

  • binding.female.setOnClickListener(view -> {...});:性别选择按钮(女性)的点击监听器。在点击该按钮时,将更改选定的性别为女性。

  • binding.seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {...});:滑动条的监听器。当用户拖动滑动条时,将更新用户选择的身高值。

  • binding.incrementAge.setOnClickListener(view -> {...});:增加年龄的按钮点击监听器。在点击该按钮时,将增加年龄的值。

  • binding.decrementAge.setOnClickListener(view -> {...});:减少年龄的按钮点击监听器。在点击该按钮时,将减少年龄的值。

  • binding.incrementWeight.setOnClickListener(view -> {...});:增加体重的按钮点击监听器。在点击该按钮时,将增加体重的值。

  • binding.decrementWeight.setOnClickListener(view -> {...});:减少体重的按钮点击监听器。在点击该按钮时,将减少体重的值。

  1. calculateBmi()方法:
    该方法用于计算BMI,并根据输入数据判断是否合理。如果输入数据合理,将启动一个新的BMI_Result活动,并将计算得到的BMI值和其他数据传递给该活动。

  2. open_history()方法:
    该方法用于打开历史记录页面BMI_History,在点击名为viewhistory的按钮时调用。

  3. displayData()方法:
    该方法用于从数据库中读取历史记录数据并将其存储在相应的ArrayList(BMI、身高、体重和年龄)中。这些数据用于历史记录的展示和处理。

总的来说,这段代码实现了一个BMI页面的活动,允许用户输入身高、体重、年龄和性别,并根据输入计算BMI值。用户还可以查看历史记录,并点击按钮查看历史记录页面。

BMI_Result.java
package com.example.myapplication;

import static java.lang.Math.pow;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.RelativeLayout;


import com.example.myapplication.databinding.ActivityBmiResultBinding;

public class BMI_Result extends AppCompatActivity {
    ActivityBmiResultBinding binding;

    String currentBMI ="26";
    double intialBMI =26;
    String height;
    String weight;
    String age , gender;
    double intialHeight, intialWeight;
    RelativeLayout mBackground;
    Intent intent ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DBHelper db = new DBHelper(this);
        binding = ActivityBmiResultBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        mBackground = findViewById(R.id.content_layout) ;
        intent = getIntent();
        height = intent.getStringExtra("height");
        weight = intent.getStringExtra("weight");
        age = intent.getStringExtra("age");
        gender = intent.getStringExtra("gender");

        intialWeight = Float.parseFloat(weight);
        intialHeight = Float.parseFloat(height);
        //intHeight=intHeight/100;
        intialBMI = intialWeight /pow(intialHeight /100 , 2);
        currentBMI =  Double.toString(intialBMI);

        db.insert(gender, height, weight, age,  currentBMI.substring(0,4));



        getSupportActionBar().hide();


        if (intialBMI < 18.5){
            binding.bmiCategory.setText("underweight");
            mBackground.setBackgroundColor(Color.parseColor("#DA8181"));
            binding.imageView.setImageResource(R.drawable.ic_baseline_highlight_off_24);
        }
        else   if (intialBMI <39.9&& intialBMI >30){
            binding.bmiCategory.setText("Moderate Thiness");
            mBackground.setBackgroundColor(Color.parseColor("#C1B35B"));

        }
        else   if (intialBMI <24.9 && intialBMI >18.5){
            binding.bmiCategory.setText("Healthy");
//            mBackground.setBackgroundColor(Color.YELLOW);
            binding.imageView.setImageResource(R.drawable.ic_baseline_check_circle_outline_24);
        }
        else   if (intialBMI <29.9&& intialBMI >25){
            binding.bmiCategory.setText("Over Weight");
            mBackground.setBackgroundColor(Color.parseColor("#C1B35B"));

        }

        else  {
            binding.bmiCategory.setText("obese");
            mBackground.setBackgroundColor(Color.parseColor("#C1B35B"));
            binding.imageView.setImageResource(R.drawable.ic_baseline_highlight_off_24);
        }

        binding.genderDisplay.setText(gender);

        binding.bmiDisplay.setText(currentBMI.substring(0,5));

        binding.reCalculateBmi.setOnClickListener(view -> {
            startActivity(new Intent(this, BMI_Page.class));
        });


    }
}

这段代码是一个用于计算BMI(Body Mass Index,身体质量指数)并显示结果的Android应用程序。下面逐行解释代码:

package com.example.myapplication;

这一行声明了Java文件所属的包名。

import static java.lang.Math.pow;

导入了Java的Math类中的pow方法,用于计算指数。

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.RelativeLayout;
import com.example.myapplication.databinding.ActivityBmiResultBinding;

导入所需的Android类和库。

public class BMI_Result extends AppCompatActivity {

定义了一个名为BMI_Result的类,并继承自AppCompatActivity,表示这是一个Android活动。

ActivityBmiResultBinding binding;

创建一个ActivityBmiResultBinding对象,用于与布局文件activity_bmi_result.xml中的视图进行绑定。

String currentBMI = "26";
double intialBMI = 26;
String height;
String weight;
String age, gender;
double intialHeight, intialWeight;
RelativeLayout mBackground;
Intent intent;

声明一些变量,用于存储用户的身高、体重、年龄、性别和计算后的BMI值等信息。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    DBHelper db = new DBHelper(this);
    binding = ActivityBmiResultBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    mBackground = findViewById(R.id.content_layout);
    intent = getIntent();
    height = intent.getStringExtra("height");
    weight = intent.getStringExtra("weight");
    age = intent.getStringExtra("age");
    gender = intent.getStringExtra("gender");

重写了活动的onCreate方法,在活动启动时执行以下操作:

  • 创建了一个DBHelper对象db,用于与数据库进行交互。
  • 通过ActivityBmiResultBinding将布局文件activity_bmi_result.xml中的视图与代码中的变量进行绑定。
  • 设置布局文件activity_bmi_result.xml作为活动的显示内容。
  • 获取从上一个活动传递过来的用户身高、体重、年龄和性别的信息。
intialWeight = Float.parseFloat(weight);
intialHeight = Float.parseFloat(height);
intialBMI = intialWeight / pow(intialHeight / 100, 2);
currentBMI = Double.toString(intialBMI);

将传递过来的身高和体重信息转换为数值型,并根据BMI的计算公式计算出BMI值,然后将其转换为字符串格式,存储在currentBMI变量中。

db.insert(gender, height, weight, age, currentBMI.substring(0, 4));

将用户的性别、身高、体重、年龄和四舍五入后的BMI值插入到数据库中。

getSupportActionBar().hide();

隐藏活动的标题栏。

接下来是一系列条件判断,根据计算得到的BMI值,设置相应的显示文本和背景颜色,以及显示对应的图片。

binding.genderDisplay.setText(gender);
binding.bmiDisplay.setText(currentBMI.substring(0, 5));

将性别和四舍五入后的BMI值显示在界面上。

binding.reCalculateBmi.setOnClickListener(view -> {
    startActivity(new Intent(this, BMI_Page.class));
});

当用户点击"reCalculateBmi"按钮时,跳转到BMI_Page活动,允许用户重新计算BMI。

这就是这段代码的功能和实现逻辑。它主要是通过获取用户输入的身高和体重信息,计算BMI值,然后根据计算结果显示对应的BMI分类和相应的背景颜色。同时,还允许用户重新计算BMI。

三.项目源码

链接:https://pan.baidu.com/s/1jv31F7Y86bOcEpMBuSq-zg?pwd=jynl
提取码:jynl

有软件开发请私信作者

(wei)15135757306

你可能感兴趣的:(Android开源项目,android)