最新更新的Flyme6整体效果不错,动画效果增加了很多了,看了看flyme6的Viewpager指示器,觉得有点意思,就模仿写了一下,整体效果如下:

github地址:https://github.com/Dawish/FlymeTabStrip

Gradle

allprojects {repositories {maven { url 'https://jitpack.io' }}
}dependencies {compile 'com.github.Dawish:FlymeTabStrip:v1.0.2'
}

Attrs

    <declare-styleable name="FlymeTabStrip"><!-- 指示器高度 --><attr name="indicatorHeight" format="dimension" /><!-- 指示器滑动条颜色 --><attr name="indicatorColor" format="color" /><!-- 指示器左右间距 --><attr name="indicatorMargin" format="dimension" /><!-- 指示器文字颜色 --><attr name="indicatorTextColor" format="color" /><!-- 指示器文字大小 --><attr name="indicatorTextSize" format="dimension" /><!-- 指示器文字被选中后的大小 --><attr name="selectedIndicatorTextSize" format="dimension" /></declare-styleable>

Sample

Demo地址:https://github.com/Dawish/FlymeTabStrip/tree/master/samples

代码解释

指示器的动画效果,主要依赖Viewpager的滑动监听器,在Viewpager的滑动过程中不断重绘只是控件就可以实现指示器的位移和缩放动画效果。首先我们讲解一下ViewPager的三个滚动监听方法:

    /*** viewPager状态改变监听**/private class PagerStateChangeListener implements OnPageChangeListener {/*** viewpager状态监听* @param state*/@Overridepublic void onPageScrollStateChanged(int state) {if (state == ViewPager.SCROLL_STATE_IDLE) {  // 0 空闲状态  pager处于空闲状态scrollToChild(viewPager.getCurrentItem(), 0);}else if(state == ViewPager.SCROLL_STATE_SETTLING){ // 2 正在自动沉降,相当于松手后,pager恢复到一个完整pager的过程}else if(state == ViewPager.SCROLL_STATE_DRAGGING){  // 1 viewpager正在被滑动,处于正在拖拽中}}/*** viewpager正在滑动,会回调一些偏移量* 滚动时,只要处理指示器下方横线的滚动* @param position 当前页面* @param positionOffset  当前页面偏移的百分比* @param positionOffsetPixels 当前页面偏移的像素值*/@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {currentPosition = position;currentPositionOffset = positionOffset;// 处理指示器下方横线的滚动,scrollToChild会不断调用ondraw方法,绘制在重绘下划线,这就是移动动画效果scrollToChild(position, (int) (positionOffset * container.getChildAt(position).getWidth()));invalidate();}/*** page滚动结束* @param position  滚动结束后选中的页面*/@Overridepublic void onPageSelected(int position) {// 滚动结束后的未知selectedPosition = position;// 更新指示器状态updateTabStyle();}}

其中最主要的方法就是:

        /*** viewpager正在滑动,会回调一些偏移量* 滚动时,只要处理指示器下方横线的滚动* @param position 当前页面* @param positionOffset  当前页面偏移的百分比* @param positionOffsetPixels 当前页面偏移的像素值*/@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {currentPosition = position;currentPositionOffset = positionOffset;// 处理指示器下方横线的滚动,scrollToChild会不断调用ondraw方法,绘制在重绘下划线,这就是移动动画效果scrollToChild(position, (int) (positionOffset * container.getChildAt(position).getWidth()));invalidate();}

onPageScrolled方法图片说明:

Android自定义View--Flyme6的Viewpager指示器相关推荐

  1. android 自定义viewpager指示器,Android自定义View Flyme6的Viewpager指示器

    最新更新的Flyme6整体效果不错,动画效果增加了很多了,看了看flyme6的Viewpager指示器,觉得有点意思,就模仿写了一下,整体效果如下: Gradle allprojects { repo ...

  2. Android自定义view之ViewPager指示器——2

    Android自定义view之ViewPager指示器--2 上一篇<Android自定义view之ViewPager指示器--1>中我们一起写了测量和布局的流程.本篇我们继续讲解事件分发 ...

  3. Android自定义view之ViewPager指示器——1

    Android自定义view之ViewPager指示器--1 在上两篇文章<Android自定义view之measure.layout.draw三大流程>以及<Android自定义v ...

  4. Android 自定义View合集

    http://blog.csdn.net/u011507982/article/details/51199644 自定义控件学习  https://github.com/GcsSloop/Androi ...

  5. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  6. android 自定义取色器,【Android自定义View】仿Photoshop取色器ColorPicker(二)

    ColorPicker 一款仿Photoshop取色器的Android版取色器. 前言 上一篇已经简单介绍了ColorPicker的项目结构以及两种颜色空间,接下来我们详细解析一下ColorPicke ...

  7. android 自定义View 视差动画

    本系列自定义View全部采用kt **系统: **mac android studio: 4.1.3 **kotlin version:**1.5.0 gradle: gradle-6.5-bin.z ...

  8. Android自定义View —— TypedArray

    在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...

  9. Android 自定义View —— Canvas

    上一篇在android 自定义view Paint 里面 说了几种常见的Point 属性 绘制图形的时候下面总有一个canvas ,Canvas 是是画布 上面可以绘制点,线,正方形,圆,等等,需要和 ...

  10. Android自定义View:ViewGroup(三)

    自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...

最新文章

  1. git 覆盖本地修改_Git拉力–如何使用Git覆盖本地更改
  2. Spring Boot项目部署到Heroku
  3. TxQueryRunner-JDBC小工具
  4. 马斯克的“大脑改造计划”,还需要点亮哪些技能树?
  5. xml 文本转json java_java将XML文档转换成json格式数据
  6. matlab学习:图像频域分析之Gabor滤波
  7. 一个通用纯C队列的实现
  8. 智能手机下,如何拯救你,我的孩子
  9. (王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想、代码、演示、答题规范)
  10. python可以写外汇里的ea吗_小菜鸟教你们写外汇ea -
  11. 负载均衡(四层) LVS(看完就能去上班)
  12. IPCam网络摄像头
  13. 微信小程序--操作示例2
  14. 使用c#完成数据库的crud操作
  15. Mysql 多表查询详解
  16. STOS指令和LEA指令
  17. python绘制热图_python使用matplotlib绘制热图
  18. 在线学习网站大全(推荐)
  19. BZOJ1003: [ZJOI2006]物流运输trans(DP)
  20. 科学计算机弧度,在线计算器

热门文章

  1. 第三届全国大学生算法设计与编程挑战赛 (冬季赛)部分题解
  2. PS改变图片颜色的方法
  3. pandas使用read_csv函数读取文件的前N行数据并保留表头、pandas使用read_csv函数读取制表符分割的文件(tab-delimited)、自定义设置sep参数
  4. 求指点如何使用dynami类型的变量
  5. 使用docker安装mysql5.7
  6. 低成本的电流检测电路
  7. Oracle分析函数PERCENTILE_CONT
  8. python:savgol_filter的简单使用
  9. 计算机科学类专升本复习之“C语言结构体”详解(初稿)
  10. 道友自诉:入职中软一个月(外包华为)就离职了!