文章目录

  • 简介
  • 效果
  • 思路
  • 关键代码
    • 先画完整的弧线,图中红色曲线
    • 再画指示器部分的弧线,图中深蓝色弧线
  • 不足
  • 源码[github](https://github.com/Super-Bin/HornetNestView.git)

简介

Android高仿马蜂窝Tabbar波浪线,tabbar的部分直接使用FlycoTabLayout这个库,很早以前用过,重点也不在这tabbar功能,主要是如何绘制tabbar下方的波浪线。

效果

可以直接看github

思路


波浪线的实现,可以借助二阶贝塞尔曲线。先画出一整条波浪线,然后再截取其中蓝色的线段,监听ViewPager的滑动,来改变截取的起始点,看起来就像会动的波浪线。

关键代码


其中

  • 黄色框,表示一个tab的宽度
  • 深蓝色的弧线,表示指示器indicator的宽度
  • 浅蓝色线,表示指示器indicator与tab的间距

先画完整的弧线,图中红色曲线

     int distance, lastDistance = 0;int indicatorTop = getHeight() - indicatorHeight;int indicatorBottom = getHeight();// 先计算开始坐标int startY = (indicatorBottom - indicatorTop) / 2 + indicatorTop;for (int i = 0; i < this.mTabCount; i++) {View currentTabView = mTitleContainer.getChildAt(i);float left = currentTabView.getLeft();float right = currentTabView.getRight();// 表示当前指示器与tab的偏移量distance = (int) ((right - left - indicatorWidth) / 2);Log.i(TAG, "left = " + left);Log.i(TAG, "right = " + right);if (i == 0) {mPath.moveTo(left + distance, startY);// 开始画指示器下半部分弧线mPath.rQuadTo(indicatorWidth / 2, indicatorHeight / 2, indicatorWidth, 0);// 获取一个指示器的长度mArcMeasure.setPath(mPath, false);mArcPathLength = mArcMeasure.getLength();Log.i(TAG, "一段圆弧的长度 mArcPathLength = " + mArcPathLength);} else {int nextX = (distance + lastDistance) / 2;// 这里画上半部分弧线,因为这个弧线被拉的比较长,所以没有除以2mPath.rQuadTo(nextX, -indicatorHeight, distance + lastDistance, 0);// 再继续画指示器下半部分弧线mPath.rQuadTo(indicatorWidth / 2, indicatorHeight / 2, indicatorWidth, 0);}lastDistance = distance;}mPaint.setColor(Color.RED);// 完整的正弦曲线,背景底色canvas.drawPath(mPath, mPaint);

再画指示器部分的弧线,图中深蓝色弧线


灰色框表示一个完整的周期,红色线相当于有三个完整的周期+最后一个下划线的曲线长度

     mMeasure.setPath(mPath, false);mPathLength = mMeasure.getLength();...//中间省略float startD = 0;// 这种计算方式,是在保证每一个tab的宽度相等、而且每一个指示器长度也相等的情况下float cycleLength = (mPathLength - mArcPathLength )/ (this.mTabCount - 1); // 一个周期长度Log.i(TAG, "cycleLength = " + cycleLength);// 计算起始点startD = this.mCurrentTab * cycleLength + cycleLength * this.mCurrentPositionOffset;if(startD < 0) {startD = 0;}Log.i(TAG, "startD = " + startD);mMeasure.getSegment(startD, startD + mArcPathLength, mDstPath, true);mPaint.setColor(Color.BLUE);// 绘制弧线段canvas.drawPath(mDstPath, mPaint);

不足

目前的情况只适用,是在保证每一个tab的宽度相等、而且每一个指示器长度indicator也相等的情况下。不同Tab宽度、不同指示器indicato长度还没做,不过可以根据以上的思路进行修改就能达到目的。

源码github

Android高仿马蜂窝Tabbar波浪线相关推荐

  1. android高仿小米时钟,Android小米时钟 Android仿小米时钟效果

    想了解Android仿小米时钟效果的相关内容吗,jane_dxj在本文为您仔细讲解Android小米时钟的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Android,时钟,下面大家一起来 ...

  2. android+高仿视频录制,android高仿微信视频编辑页

    android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...

  3. android qq红点,Android高仿QQ小红点功能

    先给大家展示下效果图: 绘制贝塞尔曲线: 主要是当在一定范围内拖拽时算出固定圆和拖拽圆的外切直线以及对应的切点,就可以通过path.quadTo()来绘制二阶贝塞尔曲线了~ 整体思路: 1.当小红点静 ...

  4. Android 高仿QQ5.2双向側滑菜单DrawerLayout实现源代码

    Android 高仿QQ5.2双向側滑菜单DrawerLayout实现源代码 左右側滑效果图 1.主页的实现 直接将DrawerLayout作为根布局,然后其内部第一个View为内容区域,第二个Vie ...

  5. php支付密码控件,Android高仿微信支付密码输入控件实例代码

    这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...

  6. android+qq底部界面,Android 高仿QQ 界面滑动效果

    Android高仿QQ界面滑动效果 点击或者滑动切换画面,用ViewPager实现, 首先是布局文件: android:layout_width="match_parent" an ...

  7. android高仿微信视频编辑页-视频多张图片提取

    android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...

  8. android仿微信聊天功能,Android高仿微信聊天界面代码分享

    微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们 ...

  9. android 微信高仿,Android高仿微信聊天界面代码分享

    微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们 ...

最新文章

  1. 在CentOS 6.3 64bit上安装MySQL for python模块
  2. scipy.linalg.norm 线性代数运算 API
  3. CAAI白皮书丨中国人工智能创新应用白皮书(附下载)
  4. 让小乌龟可以唱歌——对Python turtle进行拓展
  5. tensorflow_yolov3 神经网络训练时train_loss和test_loss出现NaN(not a number)的原因和解决方法
  6. 【python自动化第十篇:】
  7. [转载] Python性能优化技巧总结
  8. 递归系列——递归树与函数记忆化
  9. 韩顺平 Java IO流 自学笔记
  10. Ubuntu18.04安装使用Qt编译海康威视SDK DEMO
  11. 数据结构学习笔记(考研 笔记 完结 西电)
  12. VR、AR、MR以及数字孪生
  13. Hexo博客使用腾讯云CDN加速及优化
  14. php+mysql实现统计网站访问量(一)
  15. 基于BP神经网络改进的DSS工具箱盲源分离系统
  16. NB,用这一篇文章带你了解什么是爬虫?
  17. numpy库函数:reshape用法
  18. js判断字符超长度中间用...替换
  19. 2004-2020年全国31省环境规制强度
  20. 【仙变3】牧仙记版VM一键端

热门文章

  1. vxe表格实现键盘上下左右方向键移动聚焦
  2. java中QQ号、手机号、邮箱号的正则表达式
  3. 智能电网领域的大数据应用(非原创)
  4. 端口号被占用解决办法
  5. 推荐个网络相册:影墙网络相册(www.ephotowall.com)
  6. [LTE] LTE系统中的ID
  7. php utime,php提示 Warning: touch() [function.touch]: Utime failed: Pe
  8. 【MRT报错问题】Error: ReadParameterFile : Reading Input Parameter File
  9. 电商软件的监听现在到这种地步了???
  10. cf国服服务器位置,CF国服国境防卫者获取方式一览