布局
<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;
}
网友评论