美文网首页Android知识Android开发经验谈Android开发
KPSwitch—Android键盘面板冲突、布局闪动处理

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

作者: 卡路fly | 来源:发表于2017-07-12 17:42 被阅读1344次

    布局

    <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

    相关文章

      网友评论

        本文标题:KPSwitch—Android键盘面板冲突、布局闪动处理

        本文链接:https://www.haomeiwen.com/subject/xjwbhxtx.html