文档章节

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
UI Layout 的设计

WP8 和 Win8 UI 布局之 XAML XAML 是 eXtensible Application Markup Language 的英文缩写,相应的中文名称为可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描...

失足处男的倒霉孩子
2013/12/24
519
0
adjustResize模式下ExpandaleListView中输入框焦点错乱及布局底部的导航栏被顶在键盘上方的处理

  为了更好的用户体验,煎熬了许久,得到这么个解决方案。在此记录下来,以供后来者参考。   第一部分     清单文件中组件activity的属性值的含义:      【A】stateUnspecifie...

Prime_T
2018/11/29
0
0
Android弹出键盘布局闪动原理和解决

弹出键盘布局闪动原理和解决   在开发中,遇到一个问题:做一个微信一样,表情输入和软键盘在切换的时候,聊天界面不闪动的问题。为了解决这个问题,需要知道一下Android的软键盘弹出的时候...

精通吹水
2016/03/18
1K
0
Android软键盘遮挡的四种解决方案

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

少年追梦
2015/07/14
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部