布局
<kpswitch.widget.KPSwitchRootRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/chat_mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background_6_0">
……
<kpswitch.widget.KPSwitchPanelLinearLayout
android:id="@+id/root_panel"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_below="@id/chat_editAndexpression_layout"
android:background="@color/color_white_normal"
android:orientation="vertical"
android:visibility="gone">
<!-- 面板內容 -->
……
</kpswitch.widget.KPSwitchPanelLinearLayout>
……
</kpswitch.widget.KPSwitchRootRelativeLayout>
KeyboardUtil.java
// 用來監控鍵盤狀態,是否顯示以及鍵盤高度等
KeyboardUtil.attach(final Activity activity, IPanelHeightTarget target,/** Nullable **/OnKeyboardShowingListener listener)
// 協助處理一些面板與鍵盤相關的事件,對一些相關時間進行注冊,切換面板鍵盤等
KPSwitchConflictUtil.attach(final View panelLayout,final View focusView,/** Nullable **/ final SwitchClickListener switchClickListener,SubPanelAndTrigger... subPanelAndTriggers)
在KeyBoardUtil#KeyboardStatusListener中
// 用于計算鍵盤高度
calculateKeyboardHeight(final int displayHeight)
// 鍵盤是否顯示
calculateKeyboardShowing(final int displayHeight)
處理抖動問題
panel切換到keyboard
需要對panel進行隱藏,keyboard進行顯示(顯示有個過程存在抖動現象),點擊編輯框,keyboard出現進行onMeasure重新布局。
KPSwitchRootLinearLayout.java
在handleBeforeMeasure中鍵盤的彈出調用
panel.handleHide();
/**
* @see #processOnMeasure(int, int)
*/
@Override
public void handleHide() {
this.mIsHide = true; // 此時,panel visible,panel被重新繪制
}
panel重新繪制
修改widthMeasureSpec和heightMeasureSpec的size為0,測量measure panel的child,就不會有寬高。作者利用了一個view在measure時把自己置gone,不會觸發requestLayout,避免抖動。
keyboard切換回panel
為了防止抖動將setVisibility方法進行重寫
此時,調用KeyboardUtil.hideKeyboard(activity.getCurrentFocus())導致keyboard隱藏,把mIsHide設置為false(keyboard和panel的切換通過mIsHide進行過渡)
// KPSwitchRootLayoutHandler.java
if (panel.isVisible()) { isVisible
// the panel is showing/will showing
panel.handleShow();
}
// KPSwitchPanelLayoutHandler.java
@Override
public boolean isVisible() {
return !mIsHide;
}