第四篇 Android studio 登录ui 控件事件
- 上一篇中我们绑定了控件的id现在我们拿它做点东西,做什么的东西呢 呃………先给它加点魔法吧【动画】
//这里定义一个方法执行动画
//这里方法里面多了两条 final 和 View
//final 我也不明确它的功能,我认为是可执行的最终
//View 他可以定义一个控件,这里是设定传进来的控件
public void wteui(final View v) {
ObjectAnimator animator = ObjectAnimator.ofFloat(v, "scaleX", 0.93f);animator.setDuration(300);animator.start();//横轴缩放0.93倍
ObjectAnimator animatuo = ObjectAnimator.ofFloat(v, "scaleY", 0.93f);animatuo.setDuration(300);animatuo.start();//竖轴缩放0.93倍
new Thread(new Runnable(){
@Override
public void run() {
try {
//线程休眠350毫秒
Thread.sleep(350);
} catch (InterruptedException e) {}
runOnUiThread(new Runnable(){
@Override
public void run() {
ObjectAnimator animatori = ObjectAnimator.ofFloat(v, "scaleX", 1f);animatori.setDuration(200);animatori.start();//还原
ObjectAnimator animatuoi = ObjectAnimator.ofFloat(v, "scaleY", 1f);animatuoi.setDuration(200);animatuoi.start();//还原
}
});
}
}).start();
}
- 给按钮设置监听事件吧然后调用这个动画
//设置登录按钮点击监听事件
bn_uigo.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View p1) {
//定义一个方法来判断输入的密码和账号
ifpassword();//启动方法,开始操作啦
}
});
- 这个按钮调用的方法是不是跟上面的动画方法不一样,没关系,这个是判断账号密码的方法我把动画加在这个里面的,咱们来看看
/*铛铛铛~方法在这里
* public 公共的方法,定义它别的java文件也可以调用它执行方法,如果是私有方法就定义为 private
* void 我理解为是没有返回值的静态
* ifpassword 方法名
*/
public void ifpassword() {
t3.setVisibility(View.INVISIBLE);//gone是不可见,也不给它留空间
t1.setText("Welcome");
wteui(bn_uigo);//设置这个控件执行动画
//开始判断
//先判断账号是否为空
if (edi1.getText().toString().equals("")) {
hsyhs("请输入账号");
return;
}
//判断密码是否为空
if (edi2.getText().toString().equals("")) {
hsyhs("请输入密码");
return;
}
//判断密码长度是否为6位
if (edi2.getText().length() < 6) {
int a=password.length();
hsyhs("密码至少输入" + a + "位哦");
} else {
//获取储存器的数据
mshart = this.getSharedPreferences("User_uigo", MODE_PRIVATE);
Accoun = mshart.getString("account", null);//获取账号内容,设置默认值为null
password = mshart.getString("password", null);//获取密码内容,设置默认值为null
Log.i(TAG, password + password.length() + "账号:" + Accoun + Accoun.length());//这里是打印日志,在Androidstudio下面那一栏的输出里面看
if (edi1.getText().toString().equals(Accoun)) {
if (edi2.getText().toString().equals(password)) {
t1.setText("登录成功🎉");
} else {
hshs("账号或密码错误");
}
} else {
hshs("账号未注册或填写错误");
}
}
}
- 看起来也不复杂对吧,自己敲一遍其实挺简单的哈哈哈🥰
- 咱们现在运行一下看看,是不是Welcome这个字不太好看耶,我们给它来个颜色
//定义一个能把文子搞成渐变色的方法
private void setTextViewStyles(TextView textView) {
LinearGradient mLinearGradient = new LinearGradient(0, 0, textView.getPaint().getTextSize() * textView.getText().length(), 0, Color.parseColor("#FFFF68FF"), Color.parseColor("#FFFED732"), Shader.TileMode.CLAMP);
textView.getPaint().setShader(mLinearGradient);
textView.invalidate();
}
在主界面载入的时候调用一下
//把标题设成渐变色
setTextViewStyles(t1);
- 编辑框也有一些小功能,比如写入时执行事件,写入后执行事件,写入完成执行事件,咱们给它加一个写入时的动画,我感觉还好看,不喜欢的话可以不要这个
//这里为了好看给编辑框也加一个动画效果,输入动画
//这里动画没有其他效果,就是把时间缩短了
public void wteu(final View v) {
ObjectAnimator animator = ObjectAnimator.ofFloat(v, "scaleX", 0.93f);animator.setDuration(100);animator.start();//横轴缩放0.93倍
ObjectAnimator animatuo = ObjectAnimator.ofFloat(v, "scaleY", 0.93f);animatuo.setDuration(100);animatuo.start();//竖轴缩放0.93倍
//定义一个存在内存泄露的线程
new Thread(new Runnable(){
@Override
public void run() {
try {
//线程休眠200毫秒
Thread.sleep(200);
} catch (InterruptedException e) {}
runOnUiThread(new Runnable(){
@Override
public void run() {
ObjectAnimator animatori = ObjectAnimator.ofFloat(v, "scaleX", 1f);animatori.setDuration(200);animatori.start();//还原
ObjectAnimator animatuoi = ObjectAnimator.ofFloat(v, "scaleY", 1f);animatuoi.setDuration(200);animatuoi.start();//还原
}
});
}
}).start();
}
你会发现这个动画跟上面那个基本是一样的,你可以自己改改,传入int值让动画缩短
- 下面是两个编辑框的写入事件
edi1.addTextChangedListener(new TextWatcher(){
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.i(TAG, s.toString());
wteu(edi1);
//t3.setVisibility(View.GONE);//gone是不可见,也不给它留空间
//写入中执行
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Log.i(TAG,s.toString());
//写入后执行
}
@Override
public void afterTextChanged(Editable s) {
//写入完成之后
}
});
edi2.addTextChangedListener(new TextWatcher(){
@Override
public void beforeTextChanged(CharSequence p1, int p2, int p3, int p4) {
//还是一样的,这里是写入中执行的
//t3.setVisibility(View.GONE);//gone是不可见,也不给它留空间 这里不能这样搞
wteu(edi2);
}
@Override
public void onTextChanged(CharSequence p1, int p2, int p3, int p4) {
//这里是写入后执行的
}
@Override
public void afterTextChanged(Editable p1) {
//这里是写入完成之后执行的
}
});
- 我们在运行看看,是不是按钮上面有一个空隙很不好看,那是我们提示控件,如果让它直接隐藏不保留空间的话,很不美观直接弹出来,和弹回去,我们给载入界面的时候给按钮上移一部分盖住提示空间的的位置,这样我们用提示控件的时候就把按钮下移一部分,间隔几百毫秒以后又回去先给它载入事件加一个动画
//先给按钮加载上移动画,让它覆盖掉提示内容
ObjectAnimator animator = ObjectAnimator.ofFloat(bn_uigo, "translationY", -40);animator.setDuration(600);animator.start();//横轴缩放0.3倍
ObjectAnimator animertr = ObjectAnimator.ofFloat(linu, "translationY", -40);animertr.setDuration(600);animertr.start();
- 点击按钮判断密码是否正确,执行判断动画 把提示控件显示出来
//此时此刻那个按钮点击之后,弹出来的那个提示控件,太死板,我重新给它写个动画
public void hshs(String a) {
t3.setText(a);
ObjectAnimator animator = ObjectAnimator.ofFloat(bn_uigo, "translationY", 20);animator.setDuration(300);animator.start();//下移20dp
ObjectAnimator animertr = ObjectAnimator.ofFloat(linu, "translationY", 20);animertr.setDuration(400);animertr.start();
t3.setVisibility(View.VISIBLE);
new Thread(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
runOnUiThread(new Runnable(){
@Override
public void run() {
ObjectAnimator animator = ObjectAnimator.ofFloat(bn_uigo, "translationY", -40);animator.setDuration(300);animator.start();//上移40dp
ObjectAnimator animertr = ObjectAnimator.ofFloat(linu, "translationY", -40);animertr.setDuration(400);animertr.start();
t3.setVisibility(View.INVISIBLE);
}
});
}
}).start();
}
public void hsyhs(String a) {
t3.setText(a);
ObjectAnimator animator = ObjectAnimator.ofFloat(bn_uigo, "translationY", 20);animator.setDuration(200);animator.start();//下移20dp
ObjectAnimator animertr = ObjectAnimator.ofFloat(linu, "translationY", 20);animertr.setDuration(300);animertr.start();
t3.setVisibility(View.VISIBLE);
new Thread(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(600);
} catch (InterruptedException e) {}
runOnUiThread(new Runnable(){
@Override
public void run() {
ObjectAnimator animator = ObjectAnimator.ofFloat(bn_uigo, "translationY", -40);animator.setDuration(200);animator.start();//上移40dp
ObjectAnimator animertr = ObjectAnimator.ofFloat(linu, "translationY", -40);animertr.setDuration(300);animertr.start();
t3.setVisibility(View.INVISIBLE);
}
});
}
}).start();
}
运行一下康康效果吧