仿豆瓣发布-编辑框自适应高度,自动滚动定位到焦点输入

效果图

仿豆瓣发布-编辑框自适应高度,自动滚动定位到焦点输入

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

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

布局层次

<ConstraintLayout>

  <ScrollView>

    <LinearLayout>

       <Edittext/>

      <自定义布局/>

    </LinearLayout>

  </ScrollView>

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

</ConstraintLayout>

 

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

系统原生自带了键盘弹起顶起布局的方式,并且点击 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 方法,在里面做滚动操作

 

原文链接:https://www.cnblogs.com/LiuZhen/p/17132099.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:仿豆瓣发布-编辑框自适应高度,自动滚动定位到焦点输入 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • Opengl ES之踩坑记

    前因 最近在尝试使用Opengl ES实现一些LUT滤镜效果,在实现这些滤镜效果的时候遇到一些兼容性的坑,踩过这些坑后我希望把这几个坑分享给读者朋友们,希望同在学习Opengl ES的朋友们能少走弯路。 关于LUT滤镜相关的介绍,也是这个Opengl ES系列入门教程的一项内容,在后面的文章中会专门介绍,这里暂时不展开讲解,后续大家敬请期待。 踩坑详情 1、…

    Android 2023年4月18日
    00
  • 直播回顾 | 点击率提升400%,Ta是怎么做到的?

    Discovery第18期直播已于3月30日圆满结束,本期直播邀请天眼查做客直播间,从天眼查与华为Push用户增长服务合作历程切入,聚焦用户增长,分享提升应用活跃度和渠道ROI的经验与见解。一起来回顾本期精彩内容吧! 【精彩对话】 Q1: 天眼查为什么选择华为Push用户增长服务实现拉新、促活和转化? 刘树维:天眼查作为国内领先的商业查询平台,我们发现用户对…

    Android 2023年4月17日
    00
  • 鲸鸿动能广告接入如何高效变现流量?

    广告是App开发者最常用的流量变现方法之一,当App拥有一定数量用户时,开发者就需要考虑如何进行流量变现,帮助App实现商业可持续增长。 鲸鸿动能流量变现服务是广告服务依托华为终端强大的平台与数据能力为开发者提供的App流量变现服务,开发者通过该服务可以在自己的App中获取并向用户展示精美的、高价值的广告内容,并从中获得广告收益。开发者集成鲸鸿动能服务进行广…

    Android 2023年5月11日
    00
  • Android Studio中的一些常见控件

    Android Studio是一款非常流行的用于开发Android应用程序的集成开发环境(IDE)。它提供了许多内置控件,使开发人员可以轻松创建应用程序界面和功能。在本文中,我们将介绍Android Studio中的一些常见控件,例如TextView,Button,EditText,ImageView等。 TextView控件 TextView是一个用于显示…

    Android 2023年4月17日
    00
  • Android 常用 adb 命令总结

    Android 常用 adb 命令总结 adb ( 全称为Android Debug Bridge)是一个C/S 架构命令行工具,起到调试桥的作用,是连接Android手机与PC端的桥梁,方便我们在电脑上对手机进行操作。adb 命令可用于执行各种设备操作,如安装和调试应用。 点击下载adb工具 ADB和Fastboo最新Google官方下载地址:https:…

    Android 2023年4月18日
    00
  • Viu联合华为HMS生态,共创影音娱乐新体验

    华为HMS生态携手流媒体平台Viu,为海外消费者打造精品移动娱乐应用体验,并助力提升流量变现能力。Viu在中东非、东南亚等16个国家及地区提供广告合作和付费会员服务,支持优质视频内容高清点播和直播。自2019年起,Viu在中东非区域与华为HMS生态开展一系列紧密合作,并在2022年实现47%的用户增长。 本次,华为邀请Viu中东非区域首席业务官Rohit D…

    Android 2023年4月22日
    00
  • Android模拟器调试串口

    一、安装虚拟串口软件 虚拟串口软件推荐 Virtual Serial Port Driver 官网 和 Virtual Serial Port Kit 官网 都可以免费试用15天。 这里以Virtual Serial Port Kit为例,打开安装好的Virtual Serial Port Kit,点击菜单栏的新增图标 然后选择两个端口点确定即可 1.1 测…

    Android 2023年4月17日
    00
  • Android中设置Button为透明

    设置Button为透明状态,有两种最简单的方式: 1. 在layout.xml文件中的Button节点下,设置Button的Alpha属性,因为该属性在0~255范围内取值,0表示完全透明,255表示完全不透明; 但是此方法有一个缺点,当设置为0后,Button上的文字也看不见了。所以在项目中使用了第二种方法。 2. 在layout.xml文件中的Butto…

    Android 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部