安卓APP源码和设计报告——健身系统

一、设计背景

1.需求分析

对于很多人来说拥有一副好身材能让自己增添不少魅力;对于爱吃而又担心自己发胖的人来说适当的运动健身是最好的选择。移动互联网时代,市场上“约跑”“约健身”健身APP软件成为新时代闺蜜朋友的互动模式,健身热潮的来临,这样让越来越多的人加入健身的行列中,大众的健身热情也刺激着更多与健身有关的产业飞速发展,尤其是与“互联网+”结合产生的智能健身运动App开发更是发展得如火如荼... 人们通过一款健身运动型App应用就可以随时随地的进行健身锻炼,可以不用去健身房锻炼也可以达到完美的身材,这样健身运动App开发给人们带来了极大的方便。所以这次做的是一款健身类的软件,为了方便用户随时随地可以健身。在配色方面使用白色和绿色非常简单的颜色能让人眼前一亮。在软件功能方面,用户首先需要注册用户名填写密码,注册成功之后,用户可以用之前注册的用户名和密码进行登录。登录成功之后进入到导航页面,其中包括会员信息和健身项目两个部分,会员信息记录了会员的姓名身高体重等一些基本信息,还可以查看用户报名的课程名称,可以增加以及删除报名项目,健身项目页面则是列举出一些项目名称来供用户选择。

2.目的和意义

所以这次做的是一款健身类的软件,为了方便用户随时随地可以健身。在配色方面使用白色和绿色非常简单的颜色能让人眼前一亮。在软件功能方面,用户首先需要注册用户名填写密码,注册成功之后,用户可以用之前注册的用户名和密码进行登录。登录成功之后进入到导航页面,其中包括会员信息和健身项目两个部分,会员信息记录了会员的姓名身高体重等一些基本信息,还可以查看用户报名的课程名称,可以增加以及删除报名项目,健身项目页面则是列举出一些项目名称来供用户选择。

系统需求分析与开发环境

系统功能需求

需要包含登入注册功能,用户名和密码储存在Sharedpreferences轻型数据类中,按钮实现页面跳转。包括数据库的增删查改功能,采用的是SQLite数据库。

系统界面需求

简介美观,采用代表健康的绿色作为主色调,和健身的主题相符合。注册和登入的页面参考了许多app,要让页面做到简介美观,所以登入注册页面都用到了自定义按钮样式和自定义输入框样式,按钮设计出颜色渐变的样式并加入圆角看起来不生硬,输入框同样加入了圆角的设计。

开发环境

Android studio3.5.0

系统设计

登入注册页面制作完后,做了一个导航页面,页面上方可以横向滑动健身馆内部的图片。然后是会员页面,用户可以通过这个页面查询自己会员信息,这个页面也加入了增删查改的功能,采用的是SQlite数据库,方便用户对课程时间的记录。页面的设计同样采用了按钮的自定义样式和输入框的自定义样式。页面上方是用户的基本信息介绍,头像部分也是设计了一个图片样式的自定义,给图片添加了一个边框,使页面看起来和谐统一美观。

最后是一个课程的展示界面,包括了健身馆开展的全部课程,方便用户查看和挑选。

系统测试

电脑模拟器测试

总结与展望

1.总结

在这次移动终端开发课程设计过程中,我发现平时学习的知识与实践环节所用到的有一定的差距,往往我觉得自己掌握的很好或者自认为熟练的技术却在此次实践环节中往往出问题,书本上的知识只提供方法的借鉴,实践中自己必须摸索出适合具体工作的方法,这一切都离不开钻研精神与勤学好问的精神.在人与人相处过程中我收获更大,首先要谦虚谨慎,不能自以为是,认为自己懂得很多,而仅仅埋头苦干,而不向他人请教,工作不但是实践与应用的过程,同时也是学习的过程,我们必须加强与他人的沟通学习,以便获得与他人的交流。在这短短的时间里,让我深深的感觉到自己在实际应用中所学专业知识的匮乏。让我真真领悟到“学无止境”这句话的涵义。而老师在专业认识周中所讲的,都是课本上没有而对我们又非常实用的东西,这又给我们的实训增加了浓墨淡采的光辉。我懂得了实际生活中,专业知识是怎样应用与实践的。在这些过程中,我不仅知道了职业生涯所需具备的专业知识,而且让我深深体会到一个团队中各成员合作的重要性,要善于团队合作,善于利用别人的智慧,这才是大智慧。靠单一的力量是很难完成一个大项目的,在进行团队合作的时候,还要耐心听取每个成员的意见,使我们的组合达到更加完美。

重要程序

LoginActivity

public class LoginActivity extends AppCompatActivity {

private TextView tv_main_title;//标题

private TextView tv_back,tv_register,tv_find_psw;//返回键,显示的注册,找回密码

private Button btn_login;//登录按钮

private String userName,psw,spPsw;//获取的用户名,密码,加密密码

private EditText et_user_name,et_psw;//编辑框

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

//设置此界面为竖屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

init();

}

//获取界面控件

private void init() {

//从main_title_bar中获取的id

tv_main_title=findViewById(R.id.tv_main_title);

tv_main_title.setText("登录");

tv_back=findViewById(R.id.tv_back);

//从activity_login.xml中获取的

tv_register=findViewById(R.id.tv_register);

tv_find_psw=findViewById(R.id.tv_find_psw);

btn_login=findViewById(R.id.btn_login);

et_user_name=findViewById(R.id.et_user_name);

et_psw=findViewById(R.id.et_psw);

//返回键的点击事件

tv_back.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//登录界面销毁

LoginActivity.this.finish();

}

});

//立即注册控件的点击事件

tv_register.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//为了跳转到注册界面,并实现注册功能

Intent intent=new Intent(LoginActivity.this,RegisterActivity.class);

startActivityForResult(intent, 1);

}

});

//找回密码控件的点击事件

tv_find_psw.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//跳转到找回密码界面(此页面暂未创建)

}

});

//登录按钮的点击事件

btn_login.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//开始登录,获取用户名和密码 getText().toString().trim();

userName=et_user_name.getText().toString().trim();

psw=et_psw.getText().toString().trim();

//对当前用户输入的密码进行MD5加密再进行比对判断, MD5Utils.md5( ); psw 进行加密判断是否一致

String md5Psw= MD5Utils.md5(psw);

// md5Psw ; spPsw 为 根据从SharedPreferences中用户名读取密码

// 定义方法 readPsw为了读取用户名,得到密码

spPsw=readPsw(userName);

// TextUtils.isEmpty

if(TextUtils.isEmpty(userName)){

Toast.makeText(LoginActivity.this, "请输入用户名", Toast.LENGTH_SHORT).show();

return;

}else if(TextUtils.isEmpty(psw)){

Toast.makeText(LoginActivity.this, "请输入密码", Toast.LENGTH_SHORT).show();

return;

// md5Psw.equals(); 判断,输入的密码加密后,是否与保存在SharedPreferences中一致

}else if(md5Psw.equals(spPsw)){

//一致登录成功

Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();

//保存登录状态,在界面保存登录的用户名 定义个方法 saveLoginStatus boolean 状态 , userName 用户名;

saveLoginStatus(true, userName);

//登录成功后关闭此页面进入主页

Intent data=new Intent();

//datad.putExtra( ); name , value ;

data.putExtra("isLogin",true);

//RESULT_OK为Activity系统常量,状态码为-1

// 表示此页面下的内容操作成功将data返回到上一页面,如果是用back返回过去的则不存在用setResult传递data值

setResult(RESULT_OK,data);

//销毁登录界面

LoginActivity.this.finish();

//跳转到主界面,登录成功的状态传递到 MainActivity 中

startActivity(new Intent(LoginActivity.this,Classification.class));

return;

}else if((spPsw!=null&&!TextUtils.isEmpty(spPsw)&&!md5Psw.equals(spPsw))){

Toast.makeText(LoginActivity.this, "输入的用户名和密码不一致", Toast.LENGTH_SHORT).show();

return;

}else{

Toast.makeText(LoginActivity.this, "此用户名不存在", Toast.LENGTH_SHORT).show();

}

}

});

}

private String readPsw(String userName){

//getSharedPreferences("loginInfo",MODE_PRIVATE);

//"loginInfo",mode_private; MODE_PRIVATE表示可以继续写入

SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);

//sp.getString() userName, "";

return sp.getString(userName , "");

}

private void saveLoginStatus(boolean status,String userName){

//saveLoginStatus(true, userName);

//loginInfo表示文件名 SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);

SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);

//获取编辑器

SharedPreferences.Editor editor=sp.edit();

//存入boolean类型的登录状态

editor.putBoolean("isLogin", status);

//存入登录状态时的用户名

editor.putString("loginUserName", userName);

//提交修改

editor.commit();

}

/**

* 注册成功的数据返回至此

* @param requestCode 请求码

* @param resultCode 结果码

* @param data 数据

*/

@Override

//显示数据, onActivityResult

//startActivityForResult(intent, 1); 从注册界面中获取数据

//int requestCode , int resultCode , Intent data

// LoginActivity -> startActivityForResult -> onActivityResult();

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

//super.onActivityResult(requestCode, resultCode, data);

super.onActivityResult(requestCode, resultCode, data);

if(data!=null){

//是获取注册界面回传过来的用户名

// getExtra().getString("***");

String userName=data.getStringExtra("userName");

if(!TextUtils.isEmpty(userName)){

//设置用户名到 et_user_name 控件

et_user_name.setText(userName);

//et_user_name控件的setSelection()方法来设置光标位置

et_user_name.setSelection(userName.length());

}

}

}

}

RegisterActivity

public class RegisterActivity extends AppCompatActivity {

private TextView tv_main_title;//标题

private TextView tv_back;//返回按钮

private Button btn_register;//注册按钮

//用户名,密码,再次输入的密码的控件

private EditText et_user_name,et_psw,et_psw_again;

//用户名,密码,再次输入的密码的控件的获取值

private String userName,psw,pswAgain;

//标题布局

private RelativeLayout rl_title_bar;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//设置页面布局 ,注册界面

setContentView(R.layout.activity_register);

//设置此界面为竖屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

init();

}

private void init() {

//从main_title_bar.xml 页面布局中获取对应的UI控件

tv_main_title=findViewById(R.id.tv_main_title);

tv_main_title.setText("注册");

tv_back=findViewById(R.id.tv_back);

//布局根元素

rl_title_bar=findViewById(R.id.title_bar);

rl_title_bar.setBackgroundColor(Color.TRANSPARENT);

//从activity_register.xml 页面中获取对应的UI控件

btn_register=findViewById(R.id.btn_register);

et_user_name=findViewById(R.id.et_user_name);

et_psw=findViewById(R.id.et_psw);

et_psw_again=findViewById(R.id.et_psw_again);

tv_back.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//返回键

RegisterActivity.this.finish();

}

});

//注册按钮

btn_register.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//获取输入在相应控件中的字符串

getEditString();

//判断输入框内容

if(TextUtils.isEmpty(userName)){

Toast.makeText(RegisterActivity.this, "请输入用户名", Toast.LENGTH_SHORT).show();

return;

}else if(TextUtils.isEmpty(psw)){

Toast.makeText(RegisterActivity.this, "请输入密码", Toast.LENGTH_SHORT).show();

return;

}else if(TextUtils.isEmpty(pswAgain)){

Toast.makeText(RegisterActivity.this, "请再次输入密码", Toast.LENGTH_SHORT).show();

return;

}else if(!psw.equals(pswAgain)){

Toast.makeText(RegisterActivity.this, "输入两次的密码不一样", Toast.LENGTH_SHORT).show();

return;

/**

*从SharedPreferences中读取输入的用户名,判断SharedPreferences中是否有此用户名

*/

}else if(isExistUserName(userName)){

Toast.makeText(RegisterActivity.this, "此账户名已经存在", Toast.LENGTH_SHORT).show();

return;

}else{

Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();

//把账号、密码和账号标识保存到sp里面

/**

* 保存账号和密码到SharedPreferences中

*/

saveRegisterInfo(userName, psw);

//注册成功后把账号传递到LoginActivity.java中

// 返回值到loginActivity显示

Intent data = new Intent();

data.putExtra("userName", userName);

setResult(RESULT_OK, data);

//RESULT_OK为Activity系统常量,状态码为-1,

// 表示此页面下的内容操作成功将data返回到上一页面,如果是用back返回过去的则不存在用setResult传递data值

RegisterActivity.this.finish();

}

}

});

}

/**

* 获取控件中的字符串

*/

private void getEditString(){

userName=et_user_name.getText().toString().trim();

psw=et_psw.getText().toString().trim();

pswAgain=et_psw_again.getText().toString().trim();

}

/**

* 从SharedPreferences中读取输入的用户名,判断SharedPreferences中是否有此用户名

*/

private boolean isExistUserName(String userName){

boolean has_userName=false;

//mode_private SharedPreferences sp = getSharedPreferences( );

// "loginInfo", MODE_PRIVATE

SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);

//获取密码

String spPsw=sp.getString(userName, "");//传入用户名获取密码

//如果密码不为空则确实保存过这个用户名

if(!TextUtils.isEmpty(spPsw)) {

has_userName=true;

}

return has_userName;

}

private void saveRegisterInfo(String userName,String psw){

String md5Psw = MD5Utils.md5(psw);//把密码用MD5加密

//loginInfo表示文件名, mode_private SharedPreferences sp = getSharedPreferences( );

SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);

//获取编辑器, SharedPreferences.Editor editor -> sp.edit();

SharedPreferences.Editor editor=sp.edit();

//以用户名为key,密码为value保存在SharedPreferences中

//key,value,如键值对,editor.putString(用户名,密码);

editor.putString(userName, md5Psw);

//提交修改 editor.commit();

editor.commit();

}

}

DatabaseHelper

public class DatabaseHelper extends SQLiteOpenHelper {

public DatabaseHelper(Context context){super(context,"Test.db",null,1);}

//第一个参数是上下文,第二个参数是数据库名称,

//第三个参数是CursorFactory对象,一般设置为null,第四个参数是数据库的版本

public void onCreate(SQLiteDatabase db) {

db.execSQL("CREATE TABLE information(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),age INTEGER)");

}

//创建表 表名information 表结构 自增id,字符串姓名,int年龄

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

Log.d("myDeBug","数据库版本已更新");

}

//数据库版本发生变化时调用

}

4.DictActivity

public class DictActivity extends AppCompatActivity {

private Button insertButton, updateButton, searchButton, deleteButton;

private Button btn_xl1;

private EditText name, age;

private TextView show, showAge;

final DatabaseHelper dbHelper = new DatabaseHelper(DictActivity.this);

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_dict);

btn_xl1 = findViewById(R.id.btn_xl);

btn_xl1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

//创建Intent 对象

Intent intent = new Intent(DictActivity.this, Classification.class);

//启动Activity

startActivity(intent);

}

});

insertButton = findViewById(R.id.btn_insert);

updateButton = findViewById(R.id.btn_update);

searchButton = findViewById(R.id.btn_search);

deleteButton = findViewById(R.id.btn_delete);

name = findViewById(R.id.name);

age = findViewById(R.id.age);

show = findViewById(R.id.tv_show);

showAge = findViewById(R.id.tv_showAge);

SQLiteDatabase db = dbHelper.getReadableDatabase();

myShow();

insertButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put("name", name.getText().toString());

values.put("age", age.getText().toString());

long id = db.insert("information", null, values);

Log.d("myDeBug", "insert");

myShow();

db.close();

name.setText(null);

age.setText(null);

}

});

updateButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put("age", age.getText().toString());

db.update("information", values, "name=?", new String[]{name.getText().toString()});

myShow();

db.close();

Log.d("myDebug", "update");

name.setText(null);

age.setText(null);

}

});

searchButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

SQLiteDatabase db = dbHelper.getWritableDatabase();

String name1 = name.getText().toString();

show.setText(null);

if (name1.equals("")) {

myShow();

db.close();

} else {

show.setText("项目名称");

showAge.setText("日期");

Cursor cursor = db.rawQuery("select * from information where name = ? ", new String[]{name1});

while (cursor.moveToNext()) {

String newName = cursor.getString(cursor.getColumnIndex("name"));

int newAge = cursor.getInt(cursor.getColumnIndex("age"));

// show.setText(show.getText() + "\n" + newName + "\t" + newAge);

show.setText(show.getText() + "\n" + newName);

showAge.setText(showAge.getText() + "\n" + newAge);

}

cursor.close();

db.close();

name.setText(null);

age.setText(null);

}

}

});

deleteButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

SQLiteDatabase db = dbHelper.getWritableDatabase();

db.delete("information", "name=?", new String[]{name.getText().toString()});

myShow();

db.close();

Log.d("myDeBug", "DeleteSuccess");

name.setText(null);

age.setText(null);

}

});

}

public void myShow() {

SQLiteDatabase db = dbHelper.getReadableDatabase();

show.setText("项目名称");

showAge.setText("日期");

Cursor cursor = db.rawQuery("select * from information", null);

while (cursor.moveToNext()) {

String newName = cursor.getString(cursor.getColumnIndex("name"));

int newAge = cursor.getInt(cursor.getColumnIndex("age"));

show.setText(show.getText() + "\n" + newName);

showAge.setText(showAge.getText() + "\n" + newAge);

}

cursor.close();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31969.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求和!李姐万岁!用ChatGPT写GitBook布局锤子便签配色的WordPress主题

我早期在Github写《Chrome插件英雄榜》连载的时候,用的是GitBook的自动构建功能,也就是在Github仓库,按照一定的规范存储markdown格式文章和配置文件,GitBook就会自动构建一本书,供读者阅读。 GitBook阅读体验确实不错…

ChatGPT + X = 更多可能性

ChatGPT具有多种先进性特征,一经发布备受瞩目,作为一个由OpenAI训练的大型自然语言处理模型,可实现自然语言生成、语言翻译、自然语言理解、语言摘要等一系列功能。发布两个月后月活用户突破1亿,成为史上用户增长速度最快的消费级…

敏捷教练是做什么的?

如果想知道敏捷教练是做什么的,看招聘要求就明白了: https://www.zhipin.com/job_detail/1416132495.html 职位描述 岗位职责: 1. 作为敏捷教练,研究、引入、推广业界先进的研发管理思想、方法论与实践。 2. 指导与推动部门的精…

图解敏捷教练和 ScrumMaster

[运营专题]零预算引爆个人和企业品牌【原文链接】 Selenium 自动化测试从零实战【原文链接】 原来这样做,才能向架构师靠近【原文链接】 Cordova App 打包全揭秘【原文链接】 TensorFlow on Android:物体识别【原文链接】 TensorFlow on Android&am…

AI解码意念!类ChatGPT模型高准确率(82%)解码大脑思想

一段视频展示了一种新的语言解码过程的程式化描述。解码器生成多个单词序列(纸条),并通过将用户大脑反应的预测与实际记录的反应进行比较,预测每个候选单词序列与实际单词序列的相似程度。Credit: Jerry Tang/Alexander Huth 像ChatGPT这样的人工智能程序…

gpt4和chatGPT的区别

一觉醒来,万众期待的GPT-4,它来了! OpenAI老板Sam Altman直接开门见山地介绍说: 这是我们迄今为止功能最强大的模型! 有多强? 根据OpenAI官方的介绍,GPT-4是一个超大的多模态模型,也…

[新人自制/Med-VQA] 这是一个可以帮忙看“片子“的 AI-Demo,欢迎大神来访留言

开局先向 coolwulf 大神致敬! Demo 地址 介绍博客 和近期大火的 ChatGPT 那种生成式不同,这个模型是个分类模型, 在自然问答的情况下还是很蠢的,但也希望在医学领域能够帮助到真的有需要的人。 后续也会根据反馈不断验证模型性…

2023最新软件测试面试题汇总,一天拿到3个offer就靠他

目录 软件工程 Linux 数据库 sql语句 测试概念和模型 测试计划与工具 测试用例设计 Web端自动化 白盒测试 shell脚本 接口测试 性能测试 移动端自动化 总结 重点:配套学习资料和视频教学 软件工程 1. 阐述软件生命周期都有哪些阶段?常见…

手撕Boost!Boost公式推导及实验验证

文章在微信公众号“硬件工程师炼成之路”首发,敬请关注。 前一段时间写了一下Buck电路的振铃,不少同学给我留了作业,让我说说Boost。今天就来看看Boost电路。 友情提示:本文字数1W了,有点长,请点赞收藏加关…

一个简单三层神经网络BP算法的公式推导

一个简单的三层神经网络BP算法的公式推导 神经网络表示梯度下降法前向误差传播反向误差传播 神经网络表示 让我们来看一个最简单的神经网络,该神经网络只有三层,分别是输入层,隐藏层和输出层。 为了表示方便,我们把线性函数和非…

BP神经网络和CNN公式推导

CNN理论基础 CNN基本结构 图一 CNN基本结构 CNN卷积神经网络的构成,主要由输入层,卷积层,池化层,全连接层,输出层等。 (1)输入层:计算机将输入层理解为若干矩阵。在数据输入前&am…

计算机视觉 | 面试题:12、手动推导反向传播公式BP

问题 现在才意识到,卷积神经网络在不同的层上的反向传播的计算公式不一样,之前一直按照全连接层的那种简单反向传播去理解了。 全连接层反向传播 在数据表示上,将全连接神经网络的每一层神经元都表示为一个列向量。每一层的神经元,会将上一层神经元的输出作为输入,通过乘…

Bp算法公式推导推导-详解

前言 学习深度学习我们应该从Bp开始,一下是学习路径 如果我们把深度学习比喻一棵大树,Bp相当于根,LeNet相当于茎,GAN,RNN,CNN相当于树叶. Bp 神经网络的简单理解 bp是 Back Propagation 的简写 ,意思是反向传播。而神经网络,听着高大上,其实…

人工神经网络推理机制,bp神经网络公式推导

Recurrent network 的backpropagation公式 怎么样推导出来 反向传播算法(Backpropagation)是目前用来训练人工神经网络(ArtificialNeuralNetwork,ANN)的最常用且最有效的算法。 其主要思想是:&#xff08…

BP神经网络理解及公式推导

BP神经网络理解及公式推导 __508任务 仅个人学习记录使用,可能有误 一、人工神经网络 人工神经网络(ANN)是一种旨在模仿人脑结构及其功能的由多个非常简单的处理单元彼此按某种方式相互连接而形成的计算机系统,该系统靠其状态对…

特斯拉面试,工控经典PLC题目:一键启动功能实现解法分析,少个坑,给自己多个机会

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、问题分析:二、模拟运行三、还有没有更简单的 前言 PLC 面试经典题目,一键启动功能:单个按钮按下一次控制灯亮起&#x…

使用调色板修改png图片

这个算法是参考一位高人的文章,直接读取并修改png格式图片的调色板,然后生成新的调色板替代原来的。
这样可以实现游戏中常见的变色效果,可以解决游戏容量有限,不能存放太多精灵图片的问题。 具体过程其实并不复杂,大…

android图像处理系列之三--图片色调饱和度、色相、亮度处理

原图: 处理后: 下面贴代码: 一、图片处理层: package com.jacp.tone.view;import java.util.ArrayList;import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.gra…

图片调色学习

色相环 色相混合正红(0)正黄(60),透明度为(50%)即红黄等比例混合橙色(30) (060)/230 真实调整透明度混合出并不一定为两者均值的色相,需要选择不同的混合方法…