2021.10.4 简单的登陆注册,用自带的数据库和简单动画界面。源码附在最后。
最近学习Android java移动开发,需要用到一个登陆注册的界面,没啥太多时间写一个简单版本的凑合用用。
进入正题:
Ps:进入的动画可以不用添加纯属拿来练一下手,需要到Free Lottie Animation Files, Tools & Plugins - LottieFiles下载一个json形式的一个动画,然后保存近项目new的raw资源文件下
需要啥动画直接去官网下载就行,详细的过程不懂可以再说。嫌麻烦可以不用,直接跳过这个部分
首先我先给我的ap写一个进入的动画。这是进入的主界面需要在清单文件里面把过滤器写道这个对于注册的Activity下面
然后时对应的java代码,不太会,高手勿喷纯纯菜鸡,但也简单的实现了一个进入的动画把,然后动画定死了时间,时间过了就自动跳到了登陆的界面上。差不多动画刚好加载完就跳转。稍微有点用户体验感。
public class intoActivity extends AppCompatActivity {
private TextView timetv;
public int T = 3; //倒计时时长
private Handler mHandler = new Handler();
ImageView logo,back,app_name;
LottieAnimationView lottieAnimationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_into);
new Thread(new MyCountDownTimer()).start();
logo = findViewById(R.id.logo);
back = findViewById(R.id.img);
app_name = findViewById(R.id.app_name);
lottieAnimationView = findViewById(R.id.lottie);
back.animate().translationY(-2300).setDuration(1000).setStartDelay(3000);
app_name.animate().translationY(1600).setDuration(1000).setStartDelay(3000);
logo.animate().translationY(1900).setDuration(1000).setStartDelay(3000);
lottieAnimationView.animate().translationY(1600).setDuration(1000).setStartDelay(3000);
}
class MyCountDownTimer implements Runnable{
@Override
public void run() {
while (T > 0) {
mHandler.post(new Runnable() {
@Override
public void run() {
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
T--;
}
mHandler.post(new Runnable() {
@Override
public void run() {
}
});
if(T == 0){
Intent intent = new Intent(intoActivity.this,MainActivity.class);
startActivity(intent);
}
}
}
}
登陆界面的一个逻辑实现,主要就是到数据库里面查数据看是否对应匹配还有一些判空的操作。
public class MainActivity extends AppCompatActivity implements View.onClickListener {
private Button login_bt,zc_bt;
private EditText et_pwd,et_cont;
private DBOpenHelper mDBOpenHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
login_bt = findViewById(R.id.login_bt);
zc_bt = findViewById(R.id.zc_bt);
et_cont =findViewById(R.id.et_zh);
et_pwd = findViewById(R.id.et_mm);
login_bt.setonClickListener(this);
zc_bt.setonClickListener(this);
mDBOpenHelper = new DBOpenHelper(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.zc_bt:
Intent intent = new Intent(MainActivity.this,RregisterActivity.class);
startActivity(intent);
break;
case R.id.login_bt:
String name =et_cont.getText().toString().trim();
String password = et_pwd.getText().toString().trim();
if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(password)) {
ArrayList data = mDBOpenHelper.getAllData();
boolean match = false;
for (int i = 0; i < data.size(); i++) {
User user = data.get(i);
if (name.equals(user.getName()) && password.equals(user.getPassword())) {
match = true;
break;
} else {
match = false;
}
}
if (match) {
Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "用户名或密码不正确,请重新输入", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "请输入你的用户名或密码", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
对应的一个注册功能模块的java的逻辑实现,写的比较随意介意命名的时候规范一下哈忽略我的命名,主要就是实现一个判空,然后添加一些数据到数据库里面,同时用到了一个验证码的实现。
public class RregisterActivity extends AppCompatActivity implements View.onClickListener {
private EditText et_pwd, et_count, et_pwd_check,et_yzm;
private Button re_btn;
private ImageView eye,mIvRegisteractivityShowcode,eyecheck;
private String realCode;
private DBOpenHelper mDBOpenHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rregister);
initView();
mDBOpenHelper = new DBOpenHelper(this);
//显示一个随机生成的验证码的图像
mIvRegisteractivityShowcode.setImageBitmap(Code.getInstance().createBitmap());
realCode = Code.getInstance().getCode().toLowerCase();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.register_bt:
if(checkEdit()){
Registersuccese();
}
break;
case R.id.iv_registeractivity_showCode:
mIvRegisteractivityShowcode.setImageBitmap(Code.getInstance().createBitmap());
realCode = Code.getInstance().getCode().toLowerCase();
break;
case R.id.re_eye:
if (et_pwd.isSelected()) {
et_pwd.setSelected(false);
et_pwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
} else {
et_pwd.setSelected(true);
et_pwd.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
}
}
}
private void initView() {
re_btn = findViewById(R.id.register_bt);
et_pwd = findViewById(R.id.re_et_pwd);
et_count = findViewById(R.id.re_et_count);
eye = findViewById(R.id.re_eye);
et_pwd_check = findViewById(R.id.re_et_pwd_check);
et_yzm = findViewById(R.id.re_et_yzm);
mIvRegisteractivityShowcode = findViewById(R.id.iv_registeractivity_showCode);
eyecheck = findViewById(R.id.re_eye_check);
re_btn.setonClickListener(this);
et_pwd.setonClickListener(this);
eye.setonClickListener(this);
eyecheck.setonClickListener(this);
mIvRegisteractivityShowcode.setonClickListener(this);
}
private boolean checkEdit(){
if(et_count.getText().toString().trim().equals("")){
showDialog("用户名不能为空");
}else if(et_pwd.getText().toString().trim().equals("")){
showDialog("密码不能为空");
}else if(!et_pwd.getText().toString().trim().equals(et_pwd_check.getText().toString().trim())){
showDialog("两次密码不一致");
} else{
return true;
}
return false;
}
private void showDialog(String s) {
alertDialog.Builder dlg = new alertDialog.Builder(RregisterActivity.this);
dlg.setTitle("系统提醒");
dlg.setMessage(s);
dlg.setNegativeButton("取消", new DialogInterface.onClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dlg.create();
dlg.show();
}
// Registaer 成功的对话框弹出提醒注册成功是否返回登陆
private void Registersuccese() {
String username = et_count.getText().toString().trim();
String password = et_pwd.getText().toString().trim();
String phoneCode = et_yzm.getText().toString().toLowerCase();
if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password) && !TextUtils.isEmpty(phoneCode) ) {
if (phoneCode.equals(realCode)) {
//将用户名和密码加入到数据库中
mDBOpenHelper.add(username, password);
alert();
} else {
showDialog("验证码错误,注册失败");
}
}else {
showDialog("信息为完善,注册失败");
}
}
private void alert() {
alertDialog.Builder dlg = new alertDialog.Builder(RregisterActivity.this);
dlg.setTitle("系统提醒");
dlg.setMessage("注册成功,返回登陆");
dlg.setPositiveButton("确定", new DialogInterface.onClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent(RregisterActivity.this, MainActivity.class);
startActivity(intent);
}
});
dlg.setNegativeButton("取消", new DialogInterface.onClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dlg.show();
}
}
code对于验证码生成的一个模块不多说,可以不需要使用,主要是之前用到过就直接拿来使用
public class Code {
private static final char[] CHARS = {
'2', '3', '4', '5', '7', '8',
'a', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm',
'n', 'p', 'r', 's', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'D', 'E', 'F', 'H', 'J', 'K', 'M',
'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
};
private static Code bmpCode;
public static Code getInstance() {
if(bmpCode == null)
bmpCode = new Code();
return bmpCode;
}
//default settings
//验证码默认随机数的个数
private static final int DEFAULT_CODE_LENGTH = 4;
//默认字体大小
private static final int DEFAULT_FONT_SIZE = 25;
//默认线条的条数
private static final int DEFAULT_LINE_NUMBER = 5;
//padding值
private static final int base_PADDING_LEFT = 10, RANGE_PADDING_LEFT = 15, base_PADDING_TOP = 15, RANGE_PADDING_TOP = 20;
//验证码的默认宽高
private static final int DEFAULT_WIDTH = 100, DEFAULT_HEIGHT = 40;
//settings decided by the layout xml
//canvas width and height
private int width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT;
//random word space and pading_top
private int base_padding_left = base_PADDING_LEFT, range_padding_left = RANGE_PADDING_LEFT,
base_padding_top = base_PADDING_TOP, range_padding_top = RANGE_PADDING_TOP;
//number of chars, lines; font size
private int codeLength = DEFAULT_CODE_LENGTH, line_number = DEFAULT_LINE_NUMBER, font_size = DEFAULT_FONT_SIZE;
//variables
private String code;
private int padding_left, padding_top;
private Random random = new Random();
//验证码图片
public Bitmap createBitmap() {
padding_left = 0;
Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bp);
code = createCode();
c.drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setTextSize(font_size);
//画验证码
for (int i = 0; i < code.length(); i++) {
randomTextStyle(paint);
randomPadding();
c.drawText(code.charAt(i) + "", padding_left, padding_top, paint);
}
//画线条
for (int i = 0; i < line_number; i++) {
drawLine(c, paint);
}
// c.save( Canvas.ALL_SAVE_FLAG );//保存
c.save();//保存
c.restore();//
return bp;
}
public String getCode() {
return code;
}
//生成验证码
private String createCode() {
StringBuilder buffer = new StringBuilder();
for (int i = 0; i < codeLength; i++) {
buffer.append(CHARS[random.nextInt(CHARS.length)]);
}
return buffer.toString();
}
//画干扰线
private void drawLine(Canvas canvas, Paint paint) {
int color = randomColor();
int startX = random.nextInt(width);
int startY = random.nextInt(height);
int stopX = random.nextInt(width);
int stopY = random.nextInt(height);
paint.setStrokeWidth(1);
paint.setColor(color);
canvas.drawLine(startX, startY, stopX, stopY, paint);
}
//生成随机颜色
private int randomColor() {
return randomColor(1);
}
private int randomColor(int rate) {
int red = random.nextInt(256) / rate;
int green = random.nextInt(256) / rate;
int blue = random.nextInt(256) / rate;
return Color.rgb(red, green, blue);
}
//随机生成文字样式,颜色,粗细,倾斜度
private void randomTextStyle(Paint paint) {
int color = randomColor();
paint.setColor(color);
paint.setFakeBoldText(random.nextBoolean()); //true为粗体,false为非粗体
float skewX = random.nextInt(11) / 10;
skewX = random.nextBoolean() ? skewX : -skewX;
paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜
//paint.setUnderlineText(true); //true为下划线,false为非下划线
//paint.setStrikeThruText(true); //true为删除线,false为非删除线
}
//随机生成padding值
private void randomPadding() {
padding_left += base_padding_left + random.nextInt(range_padding_left);
padding_top = base_padding_top + random.nextInt(range_padding_top);
}
}
最后写一下自带的数据库的模块在java中申明一下就好
public class DBOpenHelper extends SQLiteOpenHelper {
private SQLiteDatabase db;
public DBOpenHelper(Context context){
super(context,"db_test",null,1);
db = getReadableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL("CREATE TABLE IF NOT EXISTS user(" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT," +
"password TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL("DROP TABLE IF EXISTS user");
onCreate(db);
}
public void add(String name,String password){
db.execSQL("INSERT INTO user (name,password) VALUES(?,?)",new Object[]{name,password});
}
public void delete(String name,String password){
db.execSQL("DELETE FROM user WHERe name = AND password ="+name+password);
}
public void updata(String password){
db.execSQL("UPDATE user SET password = ?",new Object[]{password});
}
public ArrayList getAllData(){
ArrayList list = new ArrayList();
Cursor cursor = db.query("user",null,null,null,null,null,"name DESC");
while(cursor.moveTonext()){
@SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name"));
@SuppressLint("Range") String password = cursor.getString(cursor.getColumnIndex("password"));
list.add(new User(name,password));
}
cursor.close();
return list;
}
}
以上就是Android实现登陆注册简单跳转的一个案例了,之后可能会出较为复杂的一些登陆案例
案例源码后续更新到gitee上
Logintest104: Android简易登陆实现登陆注册加载动画随机生成验证码等操作



