您的位置:首页 > 移动开发 > Android开发

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

2017-03-11 15:06 281 查看
之前有写过一篇核心思想: 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
中内部处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: