第四篇 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();
	}

运行一下康康效果吧