Android自定义View Flyme6的Viewpager指示器

作者:Dawish_大D 时间:2022-02-10 19:02:05 

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

Android自定义View Flyme6的Viewpager指示器

Gradle

JitPack v1.0.2


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
  */
 @Override
 public 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 当前页面偏移的像素值
  */
 @Override
 public 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 滚动结束后选中的页面
  */
 @Override
 public void onPageSelected(int position) {
  // 滚动结束后的未知
  selectedPosition = position;
  // 更新指示器状态
  updateTabStyle();
 }

}

其中最主要的方法就是:


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

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

标签:Android,Flyme6,Viewpager,指示器
0
投稿

猜你喜欢

  • HashSet和TreeSet使用方法的区别解析

    2022-05-03 12:54:05
  • monkeyrunner之安卓开发环境搭建教程(1)

    2023-02-24 06:24:22
  • Java多线程ThreadAPI详细介绍

    2023-04-14 12:19:18
  • 深入理解Java垃圾回收机制以及内存泄漏

    2023-09-24 22:45:13
  • openFeign服务之间调用保持请求头信息处理方式

    2022-11-07 23:45:21
  • java基础二叉搜索树图文详解

    2023-06-01 05:43:19
  • .net(c#)中的new关键字详细介绍

    2021-08-29 21:19:27
  • OpenJDK源码调试图文教程

    2022-09-26 01:40:25
  • C#私有构造函数使用示例

    2021-12-31 02:14:53
  • Java中避免空指针异常的方法

    2023-05-08 21:00:27
  • Java Spring AOP源码解析之事务实现原理

    2023-09-10 02:39:46
  • java内存模型jvm虚拟机简要分析

    2022-09-08 09:29:34
  • C#实现图像锐化的方法

    2023-07-23 01:08:21
  • Java十分钟精通类 封装 继承

    2023-11-25 10:55:58
  • springboot集成elasticsearch7的图文方法

    2022-05-15 19:46:11
  • C#实现汉字转换为拼音缩写的代码

    2021-11-21 04:04:51
  • C# 屏蔽关键字的实现方法

    2023-10-10 15:15:50
  • SpringBoot集成gRPC微服务工程搭建实践的方法

    2022-03-11 22:10:39
  • Java字节码中jvm实例用法

    2023-08-08 05:25:09
  • Spring+EHcache缓存实例详解

    2023-12-12 20:27:51
  • asp之家 软件编程 m.aspxhome.com