Android自定义View Flyme6的Viewpager指示器

最新更新的Flyme6整体效果不错,动画效果增加了很多了,看了看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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android应用中使用ViewPager和ViewPager指示器来制作Tab标签

    一.ViewPageIndicator开源框架的基本用法 我们先得去Github上面下载这个库,下载地址:https://github.com/JakeWharton/Android-ViewPagerIndicator,下载下来之后你可以运行例子,来看看我们需要什么样的效果,然后在此基础上改成我们自己想要的效果 1.如何使用开源框架 第1步:improt library项目 第2步:导入library进我们自己新建的项目 从Github上Download下来这个zip包之后,里面会有一个lib

  • Android ViewPager实现图片轮播效果

    在app中图片的轮播显示可以说是非常常见的实现效果了,其实现原理不过是利用ViewPager,然后利用handler每隔一定的时间将ViewPager的currentItem设置为当前item的position+1即可.先来看看效果图吧: 就是实现这样的一个轮播广告的效果. 因为这个是自己为了练习仿照某旅游类App做的,所以这里的数据是使用抓包工具抓取的,准备数据等工作就不在这里赘述了,反正数据的添加大体都是相同的.我的思路是这样的,从网络上实时的获取数据(当然你也可以将数据写死),然后通过网络

  • Android实现带指示器的自动轮播式ViewPager

    前言 最近在做项目的时候,有个需求就是实现自动轮播式的ViewPager,最直观的例子就是知乎日报顶部的ViewPager,它内部有着好几个子view,每个一段时间便自动滑动到下一个item view,而底部的指示器也随之跟着改变.使用这种ViewPager的好处是在有限的空间内可以展示出多样化的信息.轮播式ViewPager广泛应用于各种应用内部,用于展示广告等.抱着学习和分享的目的,笔者把轮播式ViewPager写成了一个独立的控件,以方便以后的使用. 效果展示 话不多说,我们先来看看实现的

  • Android应用中仿今日头条App制作ViewPager指示器

    一.概述 顶部ViewPager指示器的字体变色,该效果图是这样的: 大概是今天头条的app,神奇的地方就在于,切换ViewPager页面的时候,顶部指示器改成了字体颜色的变化,个人觉得还是不错的. 那么核心的地方就是做一个支持字体这样逐渐染色就可以了,我大概想了32s,扫描了一些可能实现的方案,最终定位了一个靠谱的,下面我就带大家开始实现的征程. 实现之前贴一下我们的效果图: 1.简单使用 效果如上图了,关于颜失色的改变我添加了两个方向,一个是左方向,一个是有方向. 单纯的使用,可能觉得没什么

  • Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie

  • Android自定义ViewPager指示器

    本文实例为大家分享了Android ViewPager指示器的制作方法,供大家参考,具体内容如下 1.概述 ViewPageIndicator这个开源框架大家都接触过,个人感觉还不错就是用起来比较麻烦,需要这里配置那里配置效果定制起来也不方便.我第一次使用的时候就一直出不来效果,后来找了很久发现是activity的主题没有配置好.今天我们自己来造个轮子实现一把,其中用到了Adapter模式,如果不清楚这个模式的请看我的Android源码设计模式分析:http://www.jb51.net/art

  • Android使用ViewPager实现自动轮播

    很多APP中都实现了类似引导页的自动轮播,不由得想到昨天的引导页上修改一下代码实现轮播. 其实大体上只需要添加一个线程循环执行就可以了. 项目已同步至:https://github.com/nanchen2251/viewpagerDemo 同样的先上图 直接上代码,注释都全的,我想这样更有利于理解. 先改了Adapter  package com.example.nanchen.taketurnplaydemo; import android.support.v4.view.PagerAdap

  • Android中用RxJava和ViewPager实现轮播图

    前言 很多人要实现轮播图都会想到使用ViewPager + Handler来完成轮播图的效果.但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了. 下面我们就来介绍如何实现RxJava+ViewPager的轮播图. 效果图如下 ViewPager的操作 说到ViwePager应该大家都不陌生,它可以结合普通的View也可以结合Fragment一起使用.在此我也就不对它的使用方法进行过多的介绍了.直接开始介绍轮播的方法. 常见的轮播操作 private

  • Android 使用ViewPager实现左右循环滑动及轮播效果

    ViewPager是一个常用的Android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其他页面的信息. 循环滑动效果的实现:PagerAdapter 我们知道ViewPager自带的滑动效果非常出色,因此我们基本不需要处理这个滑动,只处理内容的显示.而内容的显示是由

  • Android 使用ViewPager自动滚动循环轮播效果

    对Android 利用ViewPager实现图片可以左右循环滑动效果,感兴趣的朋友可以直接点击查看内容详情. 主要介绍如何实现ViewPager自动播放,循环滚动的效果及使用.顺便解决ViewPager嵌套(ViewPager inside ViewPager)影响触摸滑动及ViewPager滑动速度设置问题. 先给大家展示下效果图,喜欢的朋友可以下载源码: 1.实现 没有通过ScheduledExecutorService或Timer定期执行某个任务实现,而是简单的通过handler发送消息去

随机推荐