第一步:
需要在manifest的相应activity中设置android:windowSoftInputMode=”stateHidden|adjustResize”
里面的值很迷糊,备注一下:
【1】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【2】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【3】stateHidden:用户选择activity时,软键盘总是被隐藏
【4】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【5】stateVisible:软键盘通常是可见的
【6】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【7】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【8】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【9】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
第二步:
监听软键盘的弹出和收起,以便更新布局视图。原理是,当软键盘弹出或收起时,根布局的bottom坐标会发生变化,所有给根布局添加addOnLayoutChangeListener监听,当变化超过1/3屏幕高度时,我们视为然键盘发生了弹出或收起。
Activity里的代码,已经加了注释,应该能看懂:
public class LoginActivity extends BaseActivity implements View.OnLayoutChangeListener {
private FrameLayout rootView;
private int keyHeight;
private int ivHeight;
private ImageView iv;
@Override
protected int getLayoutId() {
return R.layout.act_login;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
rootView = (FrameLayout) findViewById(R.id.root);
iv = (ImageView) findViewById(R.id.imageView);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
keyHeight = dm.heightPixels / 3;
rootView.addOnLayoutChangeListener(this);
//添加监听获取宽高
final ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ivHeight = iv.getMeasuredHeight();
// 避免重复添加监听
iv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
}
LinearLayout.LayoutParams lp;
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
LogUtil.e("left=" + left + "----top=" + top + "----right=" + right + "----bottom=" + bottom);
LogUtil.e("oldLeft=" + oldLeft + "----oldTop=" + oldTop + "----oldRight=" + oldRight + "----oldBottom=" + oldBottom);
if (oldBottom != 0 && bottom != oldBottom) {//排除activity刚进来时的变化,以及没有变化时的情况
//当oldBottom和bottom的变化范围超过1/3屏幕时,我们视为键盘发生的弹出或收起。
if (oldBottom - bottom > keyHeight) {//弹出
;
hideAnim();
} else if (bottom - oldBottom > keyHeight) {//收起
showAnim();
}
}
}
private void hideAnim() {
ValueAnimator anim = ValueAnimator.ofInt(ivHeight, 0);
anim.setDuration(500);
anim.setInterpolator(new DecelerateInterpolator());
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) animation.getAnimatedValue();
if(ivHeight%2==0){
lp = (LinearLayout.LayoutParams) iv.getLayoutParams();
lp.height = value;
iv.setLayoutParams(lp);
}
}
});
anim.start();
}
private void showAnim() {
ValueAnimator anim = ValueAnimator.ofInt(0, ivHeight);
anim.setDuration(500);
anim.setInterpolator(new AccelerateInterpolator());
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) animation.getAnimatedValue();
if(value==ivHeight||ivHeight%2==0){
lp = (LinearLayout.LayoutParams) iv.getLayoutParams();
lp.height = value;
iv.setLayoutParams(lp);
}
}
});
anim.start();
}
}
完结。