文档章节

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

k
 kim366
发布于 2016/05/13 19:08
字数 837
阅读 12
收藏 0

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

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

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

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


  • 新算法不再动态修改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导致的布局冲突,已经在PanelViewCustomRootView中内部处理。

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/

本文转载自:http://blog.csdn.net/oyangyujun/article/details/51050017

共有 人打赏支持
k
粉丝 1
博文 129
码字总数 0
作品 0
朝阳
安卓键盘面板冲突解决方案--JKeyboardPanelSwitch

JKeyboardPanelSwitch是一款用于Android键盘面板冲突,布局闪动处理方案的软件。 效果对比 如何使用 在中: compile 'cn.dreamtobe.kpswitch:library:1.3.0' 对应的Activity,在Manifest中配置...

匿名
2016/03/24
1K
0
Android软键盘遮挡的四种解决方案

一问题: 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面 二解决方案: 方法一: 在你的activity中的oncreate中setContentView之前写上这个代码 getWindow().setSof...

少年追梦
2015/07/14
0
0
Android杂谈--layout的横竖屏处理

  横竖屏处理是开发应用是比较基础的一个要点,几乎都会用到。网上有一大堆的横竖屏切换的文章,但是翻了n页以后发现竟然清一色的是转载,所以不想浪费时间到这个上面,还是自己根据自己的...

尼莫
2012/10/11
0
0
Android官方提供的支持不同屏幕大小的全部方法

本文将告诉你如何让你的应用程序支持各种不同屏幕大小,主要通过以下几种办法: 让你的布局能充分的自适应屏幕 根据屏幕的配置来加载合适的UI布局 确保正确的布局应用在正确的设备屏幕上 提供...

带梦想一7飞
2013/06/05
0
0
Android屏幕适配全攻略(最权威的官方适配指导)

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因...

程序袁_绪龙
2015/07/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SQL count(*) 和count(1)的区别

开发中经常会使用这两个聚合函数,作用都是用来统计记录行,今天查找资料发现,其实这两个函数并没有区别, 实践才是检验的标准,首先看执行计划(表是我自己建立的): 可以看到,两个执行计...

一曲图森破
2分钟前
0
0
ppwjs之bootstrap文字排版:字体设置

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
5分钟前
0
0
区块链100讲:详解区块链之P2P网络

1 P2P网络 如果我们简单来看 P2P 技术,它的应用领域已经非常广泛了,从流媒体到点对点通讯、从文件共享到协同处理,多种领域都有它的身影出现。 同样的,P2P 的网络协议也有很多,比较常见的...

HiBlock
20分钟前
0
0
74.expect脚本同步文件以及指定host同步文件 构建分发系统文件和命令

20.31 expect脚本同步文件: 在expect脚本中去实现在一台机器上把文件同步到另外一台机器上去。核心命令用的是rsync ~1.自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -a...

王鑫linux
44分钟前
0
0
TypeScript项目引用(project references)

转发 TypeScript项目引用(project references) TypeScript新特性之项目引用(project references) 项目引用是TypeScript 3.0中的一项新功能,允许您将TypeScript程序构建为更小的部分。 通过这...

durban
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部