原本是想模仿Opera那样的模范安卓桌面的主页导航页,已经用 sort.js 模拟了大半部分,包括文件夹动画、多选、拖拽归纳和重命名。
但是单从用 sort.js + css 还没有能力将之模仿得一模一样,而是显得更加简陋一些。而且浏览器中这种基于web技术的dial的面板也有所缺陷:1.批量操作麻烦,Opera 的实现无法多选,自己实现的可以。2.不能显示全部标题。3.不能直接搜索,不过 Opera 支持在搜索框中搜索主页项目。4.基于web,与原网页冲突,显示这个几面会覆盖原网页。5.基于web,数据处理麻烦,读取、修改保存、更新,需要Javascript-java之间多次桥接通信。
所以虽然 Opera 实现的主页导航很好看,但最终还是没有选择一样的方案,而是选用RecyclerView的TreeViewAdapter来做。
TreeView,树形控件应当是很基准的控件了,连win32都有,安卓怎么可能没有呢?我找来的是署名为 tlh ( TellH/RecyclerTreeView
) 的TreeViewAdapter.java,是用于 RecyclerView 的自定义适配器。
RecyclerView 是安卓最灵活的控件之一,原本是列表,但可以通过自定义适配器、布局管理器,将之改成网格、横着的列表;通过自定义列表项触摸帮助类(ItemTouchHelper),可以让其支持滑动删除、拖拽排序;通过自定义列表项装饰类(addItemDecoration),可以丰富其外观。
TreeViewAdapter 是树形适配器的基本实现,不支持拖拽排序等操作,继承改写后,可让其支持拖拽排序。原本的demo中展开图标的旋转动画也很有问题,需要修改:
将 app/MainActivity.java#L91 中的 rotationBy 改成 rotationTo
如果给视图动画(view.aimate().rotate...)传入 rotationBy ,连续点击这个图标不知道要飘成什么角度…… 于是这个库原本用计时器,禁止用户在一定时间内连续点击列表项,实际上是不妥的,应当裁剪优化此处逻辑。
实际上,我第一次找来 TreeViewAdapter 是为了实现 PDF 阅读器的目录界面:
![](https://img.haomeiwen.com/i2253897/f4d1b470620c6edf.png)
操作PDF是通过PDFium这个库,此库暂时不支持修改书签,所以当时没有过多深入地定制 TreeViewAdapter 。
现需用 TreeViewAdapter 实现浏览器的主页导航,显然,需要用到右滑删除、长按、拖拽排序这些 RecyclerView 的看家本领,这就需要一番大大的拓展了。
现在效果如下:
![](https://img.haomeiwen.com/i2253897/cea85c60fb186d93.gif)
拖拽时,自动将展开的节点折叠,不然会出现问题。
至于别后的数据格式,我决定用 Json,格式与Chrome浏览器或者说Edge浏览器一致。
![](https://img.haomeiwen.com/i2253897/bb56226c967c55cc.png)
格式很明显,是通过在父节点中容纳子节点列表(children),反复嵌套实现的,分析起来用一个递归很简单。
Json 库用 fastJson,四五兆的文件跑起来也很快,几乎没有察觉:
![](https://img.haomeiwen.com/i2253897/5b846440e5d49639.gif)
调试模式冷启动下,第一次打开列表的速度也很快。
差点忘了提,还有很快很方便的过滤搜索功能:
![](https://img.haomeiwen.com/i2253897/af595fcdb0dda96c.gif)
搜索框的光标原本一闪一闪的,感觉很令人分心,于是干脆禁用闪烁,方法是拦截 view.postDelayed,当运行类为...Blink 时,略过不调用。
网友评论