Android知识Android开发经验谈Android开发

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

2017-07-12  本文已影响1344人  卡路fly

布局

<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;
}

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

上一篇 下一篇

猜你喜欢

热点阅读