背景
最近在做聊天页面,有键盘和表情布局切换的功能,发现会出现闪烁的现象。本能反应,网上搜了一波,发现有很多的资料可以查阅。但是大概看了下,都需要获取键盘的高度,而且实现的代码偏多,并且对我现有的代码改动有点大。
闪烁产生的主要问题就是键盘设置了adjustResize属性,导致键盘弹出或者消失的时候,布局会重新调整高度。主要的解决方案基本和网络上的保持一致,就是固定布局。但是网络上普遍的做法都要和键盘高度关联,并且获取过一次键盘高度之后,就会保存这个高度,并且把表情布局的高度和键盘高度保持一致。
网络方案和实际项目不符
1.代码改动量偏多
2.我实际项目中表情布局比较矮,不能和键盘保持高度一致
自己的方案
问题产生的主要原因:在切换的瞬间,键盘的弹出/消失 和 表情布局的 消失/显示 同时在进行,键盘的操作有个动画过程,需要时间,表情布局的操作只在一瞬间。拿显示键盘为例,这一瞬间,先表情布局隐藏,输入框瞬间跑到底部,然后键盘再弹出来,输入框也随键盘弹出,造成了闪烁。(过程需要脑补,我不会录屏,尴尬)
既然是聊天页面,那么肯定有个listview类似这种可以滚动的view,并且每次键盘弹出/隐藏的时候,基本高度变化的都是这个view。所以本文主要就是针对这个listview来做固定的。
1.保证键盘是adjustResize
2.在处理键盘和表情布局切换的时候,先记录原始listview的高度,同时暂时把这个高度设置给listview,保证listview固定不动
3.延迟100ms(自己机型上测试,100ms正好,可能其他机型不一致,需要微调下这个值),重新把listview设为充满整个父控件。
代码就一点点,listview的父控件是LinearView,如果父控件是其他ViewGroup,需要自行改成对应充满父控件的代码
结束,本文更多是当做个人笔记,不喜勿喷。