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

效果图

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

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

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

布局层次

<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日

相关文章

  • android短信数据库监听回调多次问题

    在监听android短信数据库变化时。由于只能注册content://sms/ 的observer。所以,在数据库每次状态变化的时候,都会多次回调   onChange 方式。目前还未找到很好的方式,解决回调多次的问题。只能通过代码逻辑来屏蔽这个问题。目前,我使用的方式是通过时间来过滤两次的回调。 long lastTimeofCall = 0L; long…

    Android 2023年4月18日
    00
  • 集成Health Kit时因证书问题出现错误码50063的解决方案

    一、问题描述及操作 应用集成Health Kit SDK后,在华为手机上进行登录授权时,返回错误码50063。 1、查看相关错误码。‘50063’在Health Kit错误码中的描述是“安装的HMS Core APK版本不匹配,无法调用接口。”提供的解决方案是“请安装最新版本的HMS Core(APK)后,再调用接口”。 2、根据文档中提供的解决方案,卸载了…

    Android 2023年4月17日
    00
  • 实现自有App上架小游戏其实并非难事

    近年来小程序游戏迎来了爆发式增长。微信、支付宝、抖音等各大平台小程序游戏愈加丰富,你是否也让自己的App也拥有运行丰富的小游戏的能力?今天就来带大家看看如何实现。 我们先来看看各互联网巨头关于小游戏生态的特征: 「微信」 率先推出小程序,具有先发优势的微信平台毫无疑问走在了市场前列。根据2021阿拉丁发布的小游戏行业年度报告显示,微信小游戏已超过10w的开发…

    Android 2023年4月18日
    00
  • Android Studio 学习-第三章 Activity 第一组

    事先申明:所有android 类型的学习记录全部基于《第一行代码 Android》第三版,在此感谢郭霖老师的书籍帮助。 1.手动创建Activity       在Project类型目录中寻找到 项目/app/src/main/java/com.example.activitytest 在 com.example.activitytest包右键新建Activ…

    Android 2023年4月17日
    00
  • 投放视频广告时,如何快速与第三方播放器兼容?

    新媒体时代,广告样式越来越丰富。相较于传统的图文信息,视频类广告更具有直观性,能够让消费者在了解产品知识和功能的同时加深对产品的印象。 因此在各类网站或App上投放视频类广告是个很好的宣传方式,但广告商们如果想在网站上展示视频广告,必须确保视频广告投放协议与发布渠道的播放器兼容;如果不能兼容,广告商或者视频广告投放平台必须创建不同的响应,来与特定视频播放器兼…

    Android 2023年4月17日
    00
  • 当我再次用Kotlin完成五年前已经通过Kotlin完成的项目后

      > 近日来对Kotlin的使用频率越来越高, 也对自己近年来写过的Kotlin代码尝试进行一个简单的整理. 翻到了自己五年前第一次使用Kotlin来完成的一个项目([贝塞尔曲线](https://juejin.cn/post/6844903556173004807)), 一时兴起, 又用发展到现在的Kotlin和Compose再次完成了这个项目. …

    Android 2023年5月7日
    00
  • 安卓常用shell命令大全

    前言 这篇笔记用来收集在日常开发中所用到的安卓adb shell命令,参照了一些大佬的再加上我自己平时用到的整理在了一块儿,感谢无私共享的大佬们。 将会持续更新,欢迎收藏~ 一、基本用法 命令语法 adb 命令的基本语法如下: adb [-d|-e|-s <serialNumber>] <command> 如果只有一个设备/模拟器连接…

    Android 2023年4月18日
    00
  • 【SIM】MCC(移动国家码)和 MNC(移动网络码)

    国际移动用户识别码( IMSI) international mobile subscriber identity 国际上为唯一识别一个移动用户所分配的号码。   从技术上讲,IMSI可以彻底解决国际漫游问题。但是由于北美目前仍有大量的AMPS系统使用MIN号码,且北美的MDN和MIN采用相同的编号,系统已经无法更改,所以目前国际漫游暂时还是以MIN为主。其…

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