开发者社区> 玄学酱> 正文

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

简介:
+关注继续查看

之前有写过一篇核心思想: 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

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

从PanelView切换到Keybord

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

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

从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中内部处理。




本文作者:佚名
来源:51CTO

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
android 检测外接键盘并设置输入法布局
android 检测外接键盘并设置输入法布局
30 0
android 物理键盘布局
android 物理键盘布局
26 0
Android 自定义车牌键盘
Android 自定义车牌键盘
344 0
解决安卓收起键盘无法触发失焦事件的问题
解决安卓收起键盘无法触发失焦事件的问题
486 0
android如何让布局一直在键盘上方显示
在实际项目中,肯定会有输入数据的情况,这样就会用到键盘。
225 0
Android之让EditText不被键盘挡住
Android之让EditText不被键盘挡住
51 0
android 记一次解决键盘遮挡问题
文章链接:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw 日常android开发过程中,会遇到编辑框输入内容弹出软键盘,往往会出现键盘遮挡内容,或者出现页面整体上移的,或多或少在体验上都不是很优雅,今天提供个方法是自行控制页面上移距离,竟可能让页面呈现给用户友好点。
2290 0
安卓日常开发记录-键盘的相关处理方式
点击EditText之外隐藏键盘的实现方式 重写事件分发dispatchTouchEvent,注意不要在onTouchEvent中操作,因为onTouchEvent并非任何情况下都会被调用。
1032 0
Android屏蔽隐藏系统自带输入键盘
Android屏蔽隐藏系统自带输入键盘 若是Activity,在AndroidMainfest.xml配置Activity属性:android:windowSoftInputMode="stateAlwaysHidden|...
1137 0
Android键盘EditText只允许输入数字和英文
主要要使用一个正则过滤即可实现: String regular = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; mXEditText.
1628 0
+关注
玄学酱
这个时候,玄酱是不是应该说点什么...
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android组件化实现
立即下载
蚂蚁聚宝Android秒级编译—— Freeline
立即下载
Android插件化:从入门到放弃
立即下载