文档章节

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
488
0
adjustResize模式下ExpandaleListView中输入框焦点错乱及布局底部的导航栏被顶在键盘上方的处理

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

Prime_T
11/29
0
0
Android软键盘遮挡的四种解决方案

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

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

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

尼莫
2012/10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
3
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部