标签栏是一个非常常见的控件,似乎也是一个比较简单的控件,但如果在标签下方加个下划线的话,就还是可以玩出挺多花来的。
网易严选的标签栏就做的很不错,里面隐藏着诸多细节:
- 手动滑动页面,下划线会跟着滑动。
- 选择一个标签后,下划线会有滑动过去的动画。
- 选择最左端或最右端的标签,标签栏会进行滑动,使得标签向中间靠拢(如果可以滑的话)。
仔细分析下,需要在简单标签栏的基础上实现以下逻辑:
- 画出下划线。
- 监听手动滑动页面事件,实时更新下划线位置。
- 切换标签时,开始下划线滑动的动画,并判断是否要同时滑动标签栏。
我做了一个样例程序,其中的较难点在于计算下划线的位置,和下划线的动画效果。
// 根据当前选定的tab,得到indicator应该移动到的位置 private Pair<Float, Float> getIndicatorTargetLeftRight(int position, float positionOffset) { View tab = tabsContainer.getChildAt(position); Pair<Float, Float> indicator = getIndicatorLeftRight(tab); float targetLeft = indicator.first; float targetRight = indicator.second; // 如果positionOffset不为0,indicator正处于两个tab之间,需进行加权计算得到它的位置 if (positionOffset > 0f && position < tabCount - 1) { View nextTab = tabsContainer.getChildAt(position + 1); Pair<Float, Float> indicatorForNextTab = getIndicatorLeftRight(nextTab); float left = indicatorForNextTab.first; float right = indicatorForNextTab.second; targetLeft = (positionOffset * left + (1f - positionOffset) * targetLeft); targetRight = (positionOffset * right + (1f - positionOffset) * targetRight); } return new Pair<>(targetLeft, targetRight); } private Pair<Float, Float> getIndicatorLeftRight(View tab) { float left = tab.getLeft(); float right = tab.getRight(); if (indicatorMode == IndicatorMode.WRAP && tab instanceof TextView) { TextView tabTextView = (TextView) tab; paint.setTextSize(tabTextView.getTextSize()); float textLength = paint.measureText(tabTextView.getText().toString()); float middle = (left + right) / 2f; left = middle - textLength / 2f; right = middle + textLength / 2f; } return new Pair<>(left, right); }
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- 如何在 Java 中创建 Date 对象?(java怎么创建date对象)
- 如何利用 Java Milo 开展网络编程?(如何使用Java Milo进行网络编程)
- 如何高效使用Redis客户端进行故障排查
- 如何使用 getresources 获取文件系统资源?(getresources如何获取文件系统资源)
- 如何利用 Java 的多线程提升效率?(Java的多线程如何提高效率 )
- Java 中 file.exists 方法在不同操作系统下的表现及差异(java file.exists在不同操作系统下)
- 在 Java 中,究竟什么是线程安全?(java中什么是线程安全)
- Java 中 toString 方法该如何使用呢?(java中tostring方法如何使用)
- JavaScript函数式编程有哪些实用技巧?(JavaScript函数式编程有啥技巧)
- Java 中 random 函数的异常处理机制究竟是什么?(java random函数的异常处理机制是什么)
猜你喜欢
AI推送时光机Android实现网易严选标签栏滑动效果
后端开发2023-05-30
Android实现类似网易新闻选项卡动态滑动效果
后端开发2022-06-06
Android如何实现仿网易严选底部弹出菜单效果
后端开发2023-05-30
android配合viewpager实现可滑动的标签栏示例分享
后端开发2022-06-06
Android自定义ViewGroup实现标签浮动效果
后端开发2022-06-06
CSS实现滑动标签页效果的技巧和方法
后端开发2023-10-21
Android实现仿通讯录侧边栏滑动SiderBar效果代码
后端开发2022-06-06
Android应用中怎实现一个顶部导航栏滑动效果
后端开发2023-05-31
Android实现简单底部导航栏 Android仿微信滑动切换效果
后端开发2023-05-30
Android实现顶部导航栏可点击可滑动效果(仿微信仿豆瓣网)
后端开发2022-06-06
Android如何模仿实现微博详情页滑动固定顶部栏的效果
后端开发2023-05-30
<script> 标签的魔力:轻松实现动态网页效果
后端开发2024-02-27
咦!没有更多了?去看看其它编程学习网 内容吧