KPSwitch—Android键盘面板冲突、布局闪动处理

KPSwitch—Android键盘面板冲突、布局闪动处理_第1张图片

布局



    ……

    
                    
                
                ……
                    
    
    
    ……
 

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


KPSwitch—Android键盘面板冲突、布局闪动处理_第2张图片

在handleBeforeMeasure中键盘的弹出调用

panel.handleHide();

    /**
     * @see #processOnMeasure(int, int)
     */
    @Override
    public void handleHide() {
        this.mIsHide = true; // 此时,panel visible,panel被重新绘制
    }
    

panel重新绘制


KPSwitch—Android键盘面板冲突、布局闪动处理_第3张图片

修改widthMeasureSpec和heightMeasureSpec的size为0,测量measure panel的child,就不会有宽高。作者利用了一个view在measure时把自己置gone,不会触发requestLayout,避免抖动。

keyboard切换回panel
KPSwitch—Android键盘面板冲突、布局闪动处理_第4张图片
KPSwitch—Android键盘面板冲突、布局闪动处理_第5张图片

为了防止抖动将setVisibility方法进行重写

KPSwitch—Android键盘面板冲突、布局闪动处理_第6张图片
KPSwitch—Android键盘面板冲突、布局闪动处理_第7张图片

此时,调用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;
}

最后的最后,附上https://github.com/Jacksgong/JKeyboardPanelSwitch

你可能感兴趣的:(KPSwitch—Android键盘面板冲突、布局闪动处理)