Android安卓实战项目(9)—漂亮的健身控件APP+开机动画+BMI计算(源码在文末🐕🐕🐕)
介绍: BMI(Body Mass Index,身体质量指数)是一种常用的健康指标,用于评估一个人的体重是否合理。在本篇博客中,我们将使用Android Studio开发一个简单的应用程序,用于计算用户的BMI,并根据计算结果显示相应的BMI分类和背景颜色。我们将逐步介绍代码实现和功能,让您了解整个过程。
前提条件: 在开始之前,您需要安装Android Studio,并了解一些基本的Java和Android开发知识。
【bilibili演示】
https://www.bilibili.com/video/BV1BV4y1e7Nj/?share_source=copy_web&vd_source=b2e9b9ed746acda34f499009647748ed
一.项目运行介绍
源码展示
APP图标
开机动画
主页面
BMI计算界面
BMI历史记录
其他控件不过多展示
二.具体实现
(部分代码解释)
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);
});
}}
- 导入语句:
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元素。
- MainActivity类:
public class MainActivity extends AppCompatActivity {
@NonNull
ActivityMainBinding binding;
// ...
}
这一行声明了一个名为MainActivity
的类,它继承自AppCompatActivity
。它还声明了一个类型为ActivityMainBinding
的变量binding
,用于数据绑定以访问活动布局文件中的UI元素。
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();
:这将隐藏活动的默认动作栏(顶部工具栏)。
- 按钮点击监听器:
binding.ExerciseId.setOnClickListener(view -> {
Intent intent = new Intent(this, AllExercises.class);
startActivity(intent);
});
// ...
代码为不同的按钮(ExerciseId
、FoodId
、BmiId
和InfoId
)定义了点击监听器。当这些按钮被点击时,将执行与其关联的操作。
-
当点击
ExerciseId
按钮时,它创建一个启动AllExercises
活动的Intent
,并使用startActivity(intent)
启动该活动。 -
类似地,当点击
FoodId
、BmiId
或InfoId
按钮时,分别创建相应的Intent
对象来启动Food_page
、BMI_Page
或Info_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<String> 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)页面的活动。我们来一步一步详细解释代码:
- 导入语句:
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
)的类,以及一些其他辅助类。
- 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)页面的活动。它还声明了一些变量,包括身高、体重、年龄等初始值和用户选择的性别类型。此外,还有一些辅助变量和数据库相关的变量和数据结构(DBHelper
和ArrayList
)。
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();
:隐藏活动的默认动作栏(顶部工具栏)。
- 点击监听器:
该代码包含一些点击事件的监听器,处理用户在页面上的交互。
-
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 -> {...});
:减少体重的按钮点击监听器。在点击该按钮时,将减少体重的值。
-
calculateBmi()
方法:
该方法用于计算BMI,并根据输入数据判断是否合理。如果输入数据合理,将启动一个新的BMI_Result
活动,并将计算得到的BMI值和其他数据传递给该活动。 -
open_history()
方法:
该方法用于打开历史记录页面BMI_History
,在点击名为viewhistory
的按钮时调用。 -
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