Android点击列表后弹出输入框,所点击项自动滚动到输入框上方

使用微信的朋友圈会发现,点击某一条评论后输入框会弹出来,而后所点击的那一项会自动地滚动到输入框上方的位置,这样若是开始所点击的评论在屏幕很下方的话,就不会被输入框遮住,虽然微信这一点在个人MX2频繁点几回后滚动的位置就彻底错误了,但听说在有些机型上效果还不错,还有其余地方可能会有相似的需求,好比登陆时软键盘可能会把登陆按钮遮住。html

要实现这个功能须要注意的地方主要有两点:android

  1. 何时进行滚动操做,以及有可能还须要在输入框消失时回滚回去。
  2. 输入框弹出后所点击的项要滚动到输入框上方,这就须要咱们计算要滚动的距离。

针对第一点,评论框出如今软键盘的上方,通常状况下软键盘出来后评论框的位置会移动,也就是会出现Layout操做,因此能够在Layout时计算滚动距离,时机就是:微信

view.getViewTreeObserver().addOnGlobalLayoutListener布局

评论框Layout时的回调,在这里计算须要滚动的距离。spa

接下来就是滚动距离的计算。server

滚动距离=所点击的项底部的Y坐标 - 软键盘弹出后输入框顶部的Y坐标htm

因此只要知道这两个坐标就能够知道须要滚动的距离,得到坐标以很简单,经过getGlobalVisibleRect就能够了,固然还有其余方法,但因为是计算的差值,保证两次计算坐标时用同一个就能够了。得到坐标后直接smoothScrollBy。事件

原理就是这么简单,不过要实现起来,细节问题搞得人恶心。get

好比说输入框初始的可见性多是GONE,也多是Visible,若是是GONE,那么软键盘弹出时可能会有两个过程,1.从GONE到Visible会layout一次,2.软键盘弹出又layout一次,隐藏时同样。界面刚显示时也会layout,因此这就须要判断在onGlobalLayout时是否须要过滤事件。it

在MX2上实验,smoothScrollBy有两个参数,第二个是duration,若是duration太小,可能你传入的distance是600,系统却可能只会滚动500。

有时可能也须要在输入框的onFocusChange中滚动。

若是到了列表底部,计算出的距离可能和实际滚动的距离也不同,这种状况也能够用setSelectionFromTop的方法让所点击的Item在屏幕最上方,固然也能够再计算偏移,总之异常繁琐。

若是是像登陆这种状况,UI简单的,要加个ScrollView,也比较好处理,软键盘弹出时直接滚动到底部,隐藏时滚动到顶部。

总之,要实现自动滚动,首先就要有一个控件随着软键盘的弹出消失而移动位置,软键盘弹出后出如今软键盘的上方,哪怕它看不见只是做为一个anchor。

其次,须要计算滚动距离,看状况有所不一样,也是最麻烦的,可能须要知道输入框的状态是隐藏,显示在屏幕底部而软键盘没出来,仍是软键盘出来了。不过在输入框初始隐藏在布局最下方的状况下,这三种状况输入框的坐标也只有3个值,也能够根据这个值判断输入框的状态,固然不排除有些输入法能够调整软键盘高度而用户又很配合地在输入时调整。

反正若是有这需求就恶心死吧。在项目三个地方实现,大体方法都是同样的,细节都有差别。

相关文章
相关标签/搜索