最近需求开发中遇到一个flutter
开发问题,为了优化用户输入体验。产品同学希望能够在输入框支持在移动光标过程中可以出现放大镜功能。原先以为是一个小需求,因为原生系统上ios和安卓印象中是自带这个功能的。在实施开发时才发现原来并不是这样的,flutter
好像并没有去支持原有的功能。
为了确认官方是否支持了输入框放大镜功能,去github
项目上搜索issue后发现这个问题在18年就有人提到过,但官方却一直没有去支持实现。
既然官方没有支持,秉承有轮子我就用的思想继续通过github
搜索是否有开发者自定义实现了这个功能。
搜索magnifier
找到了一篇文章是对放大镜的实现,但他并不是在输入框上的实现,只对屏幕手势触摸的地方进行放大。
因为找不到完全实现输入框放大镜功能,那么只能自行去实现该功能了。可以根据magnifier
来为输入框实现放大镜功能埃及魔法膏。
通过对textfield
的使用会发现,当使用光标双击或是长按会出现texttoolbar
功能栏,随着光标的移动,上方的编辑栏也会跟着光标进行移动。这个发现正好能够在放大镜功能上运用:跟随光标移动+放大就能够实现最终期望的效果了。
那么在功能实现之前就需要阅读textfield
源码了解光标上方的编辑栏是如何实现并且能够跟随光标的。
ps:源码解析使用的是extended_text_field,主因是项目中使用了富文本输入和显示。
extendedtextfield
输入框组件源码找到extendededitabletext
中视图build
方法可以看到compositedtransformtarget
和_toolbarlayerlink
。而这两个已经是实现放大镜功能的关键信息了。
关于compositedtransformtarget
的使用可以在网上搜到很多,作用是来绑定两个view
视图。除了compositedtransformtarget
之外还有compositedtransfo社会规律rmfollower
。简单理解就是compositedtransformfollower
是绑定者,compositedtransformtarget
是被绑定者,前者跟随后者。_toolbarlayerlink
就是跟随光标操作栏的绑定媒介。
通过源码查询找到_toolbarlayerlink
另一个使用者extendedtextlectionoverlay
。
通过源码查询可以找到compositedtransformfollower
组件使用,可以通过代码看到lectioncontrols!.buildtoolbar
就是编辑栏的实现。
然后返回去找lectioncontrols是如何实现的。在_extendedtextfieldstate
中build
方法中可以找到textlection你的素心controls
默认创建。由于安卓和ios平台存在差异性,因此有cupertinotextlectioncontrols
和materialtextlectioncontrols
两个lectioncontrols。
这里就只看materialtextlect大连大学医学院ioncontrols
源码实现。布局实现在_textlectioncontrolstoolbar
中。_textlectionhandlepainter
是绘制光标样式的方法。
了解源码功能之后就能拷贝materialtextlectioncontrols
实现来完成放大镜功能了。同样是继承textlectioncontrols
,实现materialmagnifiercontrols
功能。
主要修改点在_magnifiercontrolstoolbar
的实现以及materialmagnifier
功能
magnifiercontrolstoolbar
其中的build方法返回了widget.endpoints
光标的定位信息,定位信息去计算出偏移量。最后将两个光标信息入参到materialmagnifier
组件。
materialmagnifier
materialmagnifier
是参考widget magnifier
放大镜的实现。这里是引入了安卓的一些布局参数来实现,ios是另外定制了布局参数可以参考flutter官方源码定制ios布局。
放大镜实现方法主要是backdropfilter
和imagefilter
来实现的,根据matrix4
做scale
和translate
操作完成放大功能。
交互优化
实现放大镜功能之外还需要控制显示,由于在拖layback动状态下才显示放大镜,隐藏操作栏功能,因此需要去监听手势状态信息。
手势监听是在_textlectionhandleoverlaystate
中,需要去监听onpanstart
、onpanupdate
、onpanend
、onpancancel
这几个状态。
在开始拓展手势时展示放大镜,隐藏操作。_buildermagnifier
嵌套在overlayentry
组件在overlay
上插入,实现方式是和操作栏完全一样的。
同理在拖拽结束时去隐藏放大镜,重新创建操作栏恢复显示。
最后实现效果如下,通过移动光标可显示放大镜功能,松开手势就是操作栏显示恢复。
以上就是flutter开发之支持放大镜的输入框功能实现的详细内容,更多关于flutter的资料请关注www.887551.com其它相关文章!
本文发布于:2023-04-05 22:46:47,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/ede079c8340cb92b03428ca67979d088.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Flutter开发之支持放大镜的输入框功能实现.doc
本文 PDF 下载地址:Flutter开发之支持放大镜的输入框功能实现.pdf
留言与评论(共有 0 条评论) |