之前写过一个核心思想:微信中面板和键盘的切换这次主要是基于核心思想的实践。是否是真正的由键盘引起的布局变化,然后处理到下一个PanelLayout的onMersure。新算法不再动态修改View#LayoutParams,而是更简单明了的方式。***代码在原有基础上自动动态适配面板高度与键盘高度,大大优化了体验。我们可以看到微信中从键盘到微信的切换是无缝无闪烁的。这个基本体验是符合预期的。但在实际操作中,键盘和面板之间的简单切换会出现闪烁,这是一个问题。今天我们就在实践中分析解决这个问题。最终效果对比:一、准备以下基于android:windowSoftInputMode的adjustResize。如图,为了分析方便,我们分离出3个View:CustomRootView:去掉statusBar和ActionBar(ToolBar...balabala)FootRootView:整个底部(整个View包括输入框和底部面板)PanelView:panelView的整个处理过程,其实需要分成两部分:从PanelView切换到Keybord的现象:由于Keybord显示的时候直接PanelView#setVisibility(View.GONE),整个FooterRootView会出现在底部,然后被键盘推上去。应该符合预期:直接由键盘抬起,不需要从底部抬起。Keybord切换到PanelView的现象:隐藏Keybord时,直接PanelView#setVisibility(View.VISIBLE),导致整个FootRootView先被推到键盘上方,然后随着键盘的动画向下推到下方。不出所料:随着键盘缩回直接切换到底部,伴随着被键盘推上去的闪烁。二。处理原理只有当layout真正要因为Keybord发生变化时才适配PanelView。(注意所有的判断处理要在Super.onMeasure之前完成)方法:通过CustomRootView高度的改变,保证真正的布局会在Super.onMeasure之前因为键盘而改变,然后通知PanelView让它在Super.有效高度在onMeasure之前给出。注意:1)adjustResize模式下,CustomRootView的高度会在键盘弹出时减小,CustomRootView的高度在键盘收回时增加,反之亦然。因此,这个机制可以用来知道真正的PanelView什么时候会改变。2)由于在onLayout中已经确定了clipRect的大小,所以要避免多次调用onMeasure,所以必须在Super.onMeasure之前3)当键盘收回时,会触发多次measure。如果布局要改变,直接给View#VISIBLE,还是会有闪烁。4)从Keybord切换到PanelView引起的布局冲突,仅在Keybord正在显示时出现。5)从PanelView切换到Keybord引起的布局冲突,已经在PanelView和CustomRootView内部处理。三、GitHub:JKeyboardPanelSwitch?2012–2016,Jacksgong(blog.dreamtobe.cn).根据CreativeCommonsAttribution-NonCommercial3.0许可证获得许可(该许可证允许其他人以非商业方式重新混合、调整和构建作品,尽管他们的新作品也必须承认原作者并且是非商业性的,但他们没有以相同的条款许可他们的衍生作品)。http://creativecommons.org/licenses/by-nc/3.0/
