思路
在項目中遇到軟鍵盤彈出遮擋登錄按鈕和登錄輸入框饶氏,需要將登錄按鈕和和輸入框上移察滑;
解決思路:監(jiān)聽軟件盤的彈出,計算彈出后軟鍵盤頂部的高度蚪缀,計算登錄按鈕底部的高度秫逝,計算登錄按鈕以上的的整個布局需要的偏移量,使用屬性動畫進行偏移询枚;
登錄按鈕的底部在Y軸的位置
//按鈕底部在Y軸的坐標
int btnY = 0;
btn_login.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int[] location = new int[2];
//獲取登錄按鈕左上定點的坐標
btn_login.getLocationOnScreen(location);
btnY = location[1] + btn_login.getHeight();
btn_login.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
監(jiān)聽軟鍵盤的顯示與隱藏
/***
* 判斷軟件盤是否彈出
* @param v
* @param listener
* 備注:在不用的時候記得移除OnGlobalLayoutListener
* */
public static ViewTreeObserver.OnGlobalLayoutListener doMonitorSoftKeyboard(final View v,final OnSoftKeyBoardListener listener) {
final ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
// 獲取屏幕的可見范圍保存在矩形r中
v.getWindowVisibleDisplayFrame(r);
int screenHeight = v.getRootView().getHeight();
//軟件盤高度 = 屏幕真實高度 - 屏幕可見范圍的高度
int heightDifference = screenHeight-r.bottom;
boolean isSoftVisible = heightDifference > (screenHeight / 3);
if(listener != null) {
listener.hasShow(isSoftVisible);
}
}
};
v.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
return layoutListener;
}
在軟鍵盤顯示時計算登錄按鈕以上的布局需要偏移的距離 delta
if(isShow) {
Rect r = new Rect();
ll_root.getWindowVisibleDisplayFrame(r);
delta = (float) Math.abs(r.bottom - btnY);
AnimUtil.up(ll_login,-delta);
AnimUtil.up(iv_logo,-delta/3);
} else {
AnimUtil.up(ll_login,0);
AnimUtil.up(iv_logo,0);
}
示例已經(jīng)上傳到github筷登。還有點小問題,沒找到原因哩盲。前方。記錄一下