Android_开发Day27键盘焦点和第三方库
目的:
学会使用第三方库来解决问题,学会焦点的监听即与之相关的键盘的隐藏弹出
技术:
<1> 第三方库的使用方法:
先到GitHub上去找一个第三方库,比如这里我们要找一个虚化库,因此只要搜索blur就行了,然后找一个你喜欢的点进去看使用说明,如下图:
从中我们知道需要加上一行代码,因此我们回到Android studio去添加代码如下图路径:
代码添加完成后点击Sync Now然后系统会自动下载你要的那个第三方库,然后只需要在xml里面使用就可以了,使用方法还得看作者的说明,看有哪些功能,怎么用这些功能。
<2> 系统键盘的隐藏和显示:
系统键盘的隐藏和显示是专门有一个类来管理的InputMethodManager,要先获取该类的一个对象才能对键盘进行操作,因此隐藏和显示键盘的步骤:
第一步:获取系统的InputMethodManager
通过代码:
//1.获取系统输入的管理器
InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
来获取
第二步:隐藏或弹出键盘
通过方法hideSoftInputFromWindow()来隐藏键盘,参数两个,一个是WindowToken类,用任意一个View对象.getWindowToken()即可,第二个参数给0就行。代码:
//2.隐藏键盘
inputManager.hideSoftInputFromWindow(user.getWindowToken(), 0);
通过showSoftInput()来显示键盘,需要两个参数,一个是谁要调用我的键盘,该控件一定是要获取焦点,用requestFocus()方法来为该控件获取焦点,然后第二个参数给0就行。
<3> 监听焦点的变化:
焦点的变化要用到监听器,EditText(对象).setOnFocusChangeListener(),new一个View.OnFocusChangeListener() 匿名类,实现public void onFocusChange(View view, boolean b)方法,该方法是由程序自动调用的,参数view就是要监听的焦点的对象,用的时候要强制转换成相应的对象,b是是否获取焦点,以此为条件来判断。
技术如何使用:
做一个登录界面,要求背景虚化,然后当用户将输入框内的输入内容后才能点击登录按钮,否则为不可用状态,当用户输入密码时有个动画捂住眼睛,点击其余地方时放开眼睛。
背景的虚化要用一个第三方库,输入框的内容需要用一个文本监听器来判断是否有文本,登录按钮的状态可以在xml里面配置,眼睛是否捂上需要进行文本框焦点的监听,参考代码如下:
xml里面配置界面和按钮代码如下:
另外加上配置登录按钮的xml代码如下:
-
-
-
接下来就是MainActivity的代码:
package com.example.login_demo;
import androidx.appcompat.app.AppCompatActivity;
import android.hardware.input.InputManager;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;
import android.view.animation.TranslateAnimation;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements TextWatcher {
private EditText user;
private EditText password;
private Button loginButton;
private ImageView leftArm;
private ImageView rightArm;
private ImageView leftHand;
private ImageView rightHand;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
*showSoftInput() 弹出键盘
* hideSoftInputFromWindow() 隐藏键盘
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
//隐藏键盘
//1.获取系统输入的管理器
InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
//2.隐藏键盘
inputManager.hideSoftInputFromWindow(user.getWindowToken(), 0);
//3.取消焦点
View focus = getCurrentFocus();//取消焦点//对应的requestFocus()取消焦点
if (focus != null){
focus.clearFocus();
}
}
return true;
}
void initView(){
user = findViewById(R.id.et_user);
password = findViewById(R.id.et_password);
loginButton = findViewById(R.id.button);
leftArm = findViewById(R.id.iv_left_arm);
rightArm = findViewById(R.id.iv_right_arm);
leftHand = findViewById(R.id.iv_leftHand);
rightHand = findViewById(R.id.iv_rightHand);
//监听文本改变以判断是否可以被点击
user.addTextChangedListener(this);
password.addTextChangedListener(this);
//监听焦点的改变控制是捂住眼睛
password.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b){
//捂住眼睛
//Toast.makeText(getApplicationContext(), "捂住眼睛", Toast.LENGTH_SHORT).show();
close();
}else {
//打开
//Toast.makeText(getApplicationContext(), "放手", Toast.LENGTH_SHORT).show();
open();
}
}
});
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
//判断两个输入框有没有内容
if (user.getText().toString().length() > 0 && password.getText().toString().length() > 0){
//按钮可以点击了
loginButton.setEnabled(true);
}else {
//按钮不可以点击
loginButton.setEnabled(false);
}
}
public void close(){
//右边
//RotateAnimation rAnim = new RotateAnimation(0, 120, Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
RotateAnimation rAnim = new RotateAnimation(0, -162, 0, 0);
rAnim.setDuration(500);
rAnim.setFillAfter(true);
rightArm.startAnimation(rAnim);
//左边
RotateAnimation lAnim = new RotateAnimation(0, 162, leftArm.getWidth(), 0);
lAnim.setDuration(500);
lAnim.setFillAfter(true);
leftArm.startAnimation(lAnim);
//放下手
TranslateAnimation down = (TranslateAnimation) AnimationUtils.loadAnimation(this, R.anim.hand_down_translate);
leftHand.startAnimation(down);
rightHand.startAnimation(down);
}
public void open(){
//右边
//RotateAnimation rAnim = new RotateAnimation(0, 120, Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
RotateAnimation rAnim = new RotateAnimation(-162, 0, 0, 0);
rAnim.setDuration(500);
rAnim.setFillAfter(true);
rightArm.startAnimation(rAnim);
//左边
RotateAnimation lAnim = new RotateAnimation(162, 0, leftArm.getWidth(), 0);
lAnim.setDuration(500);
lAnim.setFillAfter(true);
leftArm.startAnimation(lAnim);
//手放上来
TranslateAnimation up = (TranslateAnimation) AnimationUtils.loadAnimation(this, R.anim.hand_up_translate);
leftHand.startAnimation(up);
rightHand.startAnimation(up);
}
}
实际使用效果:
总结:
监听器的合理使用可以实时的监控和改变控件的状态,因此当我们要完成一个需要实时的改变和监听某个控件的状态的时候就可以仿照监听器的原理来实时改变。