编辑框自适应高度,自动滚动定位到焦点输入

随着输入的文本自动增加高度,键盘上方自定义菜单布局,随键盘弹起

点击编辑框,自动滚动到焦点处输入

布局层次

<自定义布局/>

<键盘上方自定义布局/>

想要实现自动焦点定位,需要手动计算滚动距离,系统也有自带的滚动效果,不过因为这里有自定义布局,所以不兼容

系统原生自带了键盘弹起顶起布局的方式,并且点击 edittext 后 scrollView 里的 edittext 会自动滚动定位到焦点区域

有它的便捷也有它的问题,比如自定义键盘上方的布局后,定位不准确,因为自定义的布局不属于键盘,系统不会计算在内,而且自动定位部分手机不起效果,需要做兼容

滚动后内容区域不在键盘上方自定义布局上,而是滚动到键盘上方,缺少了自定义布局的那段高度

滚动方法很简单,直接调用 scrollView.smoothScrollTo(0, scrollTo) 方法就行

然后需要提前测量好键盘上方布局的高度跟键盘弹起的高度

键盘直接使用 Blankj 工具类 KeyboardUtils 监听,布局高度直接测量就行

接下来监听键盘弹起状态 onSoftInputChanged,每次弹起键盘手动给 scrollView 设置 bottomMargin,为了让布局在键盘弹起时在键盘上方位置,如果有自定义布局需要把布局高度也计算上

到这里键盘弹起结束,接下来进入核心,自动滚动定位焦点

首先是获取到当前焦点的精确坐标,有了坐标才能跳转

一开始我尝试了 touch 触摸事件,通过点击的位置来获取坐标,计算滑动距离,不过这个方案很快被推翻

因为不是很准确,加上内容是自适应高度,滑动距离过长时问题多

后来发现可以通过 getLineForOffset 方法获取编辑框当前的行数,然后在通过 getLineBounds 方法获取行坐标

获取坐标后需要计算出 scrollView 滑动的距离

滑动距离 = 当前坐标 - 键盘弹起高度 + 自定义布局高度

如果没有自定义布局就不用算

private fun scrollEdit() {
        //当前光标的坐标-键盘高度
        val scrollTo = getCurrentEditY() - boardHeight + menuHeight
        mBinding.scrollView.post {
            //计算实际滚动的位置
            mBinding.scrollView.smoothScrollTo(0, scrollTo)
        }
    }

得到滚动距离后直接在 onTextChanged 监听里去调用上面的方法就行了,此时只要文本更改就会重新定位,自动滚动到你输入的内容区域上

注意点

1、焦点自动定位问题

如果存在 ScrollView 嵌套 Edittext,那么会有部分手机系统会自动滚动到焦点位置的情况,但是这不符合我们的自定义需求,毕竟系统定位的不准确,没有导航栏适配,

滚动的位置会出现遮挡键盘上方布局的情况,所以需要重写方法去限制一下

2、导航栏适配问题

因为底部有自定义布局,会跟随键盘弹起,所以需要适配系统导航栏,否则底部自定义布局不好适配

3、自动滚动问题

核心就在于滚动定位,需要自己计算滚动距离,并且在输入的时候自动定位到该区域

并且如果调用滚动方法时,需要在变动之后调用,否则会跟系统测量结果有冲突,也就是在点击后调用 post 方法,在里面做滚动操作

最后

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

扫描下方二维码免费获取更多资料!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

Android架构师之路很漫长,一起共勉吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值