专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
stormzhang  ·  维权成功! ·  6 天前  
鸿洋  ·  Android 15 正式发布到 AOSP ... ·  6 天前  
stormzhang  ·  国庆前,2 件大事 ·  6 天前  
鸿洋  ·  Jetpack ... ·  1 周前  
51好读  ›  专栏  ›  安卓开发精选

Android键盘面板冲突 布局闪动处理方案

安卓开发精选  · 公众号  · android  · 2017-01-21 21:28

正文

(点击上方公众号,可快速关注)


来源:龚振杰  

http://blog.dreamtobe.cn/2015/09/01/keyboard-panel-switch/

如有好文章投稿,请点击 → 这里了解详情


之前有写过一篇核心思想: Switching between the panel and the keyboard in Wechat


这次主要是根据核心思想的实践,实践原理是通过CustomRootLayout布局变化,来获知是否是键盘引起的真正的布局变化,进而处理到接下来PanelLayout的onMersure中。


  • 新算法不再动态修改View#LayoutParams,而是更加简单明了的方式


  • 最新代码在原基础上自动动态适配面板高度与键盘高度等高,很大程度上优化了体验。


我们可以看到微信中的 从键盘与微信的切换是无缝的,而且是无闪动的,这种基础体验是符合预期的。


但是实际中,简单的 键盘与面板切换 是会有闪动,问题的。今天我们就实践分析与解决这个问题。


最终效果对比:



I. 准备


以下建立在android:windowSoftInputMode带有adjustResize的基础上。

如图,为了方便分析,我们分出3个View:



  • CustomRootView: 除去statusBar与ActionBar(ToolBar…balabala)


  • FootRootView: 整个底部(包括输入框与底部面板在内的整个View)


  • PanelView: 面板View


整个处理过程,其实需要分为两块处理:


  1. 从PanelView切换到Keybord


现象: 由于显示Keybord时直接PanelView#setVisibility(View.GONE),导致会出现整个FooterRootView到底部然后又被键盘顶起。


符合预期的应该: 直接被键盘顶起,不需要到底部再顶起。


  1. 从Keybord切换到PanelView


现象: 由于隐藏Keybord时,直接PanelView#setVisibility(View.VISIBLE),导致会出现整个FootRootView先被顶到键盘上面,然后再随着键盘的动画,下到底部。


符合预期的应该: 随着键盘收下直接切换到底部,而配有被键盘顶起的闪动。


II. 处理


原理


在真正由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中内部处理。


III. GitHub:


JKeyboardPanelSwitch


© 2012 – 2016, Jacksgong(blog.dreamtobe.cn). Licensed under the Creative Commons Attribution-NonCommercial 3.0 license (This license lets others remix, tweak, and build upon a work non-commercially, and although their new works must also acknowledge the original author and be non-commercial, they don’t have to license their derivative works on the same terms). http://creativecommons.org/licenses/by-nc/3.0/


看完本文有收获?请分享给更多人

 关注「安卓开发精选」,提升安卓开发技术

推荐文章
stormzhang  ·  维权成功!
6 天前
stormzhang  ·  国庆前,2 件大事
6 天前
微设计  ·  各式各样的景观照明设计
7 年前
美食家常菜谱做法  ·  经典家常菜,真恨没早点知道!
7 年前
食品与生命科学  ·  保健食品的质量安全是如何保障的
7 年前